Python基礎程式設計(六)抽象

2021-06-22 01:49:14 字數 4291 閱讀 4203

一般來說,內建的callable函式可以用來判斷函式是否可呼叫:

>>> import math

>>> x = 1

>>> y = math.sqrt

>>>callable(x)

falsse

>>>callable(y)

true

使用def語句定義函式:
def hello(name):

return 'hello,' + name + '!'

如果想喲啊給函式寫文件,讓後面使用該函式人能理解的話,可以加入注釋(以#開頭)。另外乙個方式就是直接寫上字串。

如果在函式的開頭寫下字串,它就會作為函式的一部分進行儲存,這稱為文件字串。

def square(x):

'calculates the square of the number x.'

return x*x

文件字串可以按如下方式訪問:

>>> square._doc_

'calculates the square of the number x.'

內建的help函式是非常有用的。在互動式解釋其中使用它,就可以得到關於函式,包括它的文件字串的資訊:

>>> help(square)

help on function square in module _main_:

square(x)

calculates the square of the number x.

字串(以及數字和元組)是不可變的,既無法被修改(也就是說只能用新的值覆蓋)。所以它們做引數的時候也就無需多做介紹。但是考慮一下如果將可變的資料結構和列表用作引數的時候會發生什麼:

>>> def change(n):

n[0] = 'mr. gumby'

>>> names = ['mrs. entry','mrs. thing']

>>> change(names)

>>> names

['mr. gumby','mrs. thing']

當兩個變數同時引用乙個列表的時候,它們的卻是同時引用乙個列表。為了避免出現這種情況,可以複製乙個列表的副本。當在序列中做切片的時候,返回的切片總是乙個副本。因此,如果你複製了整個列表的切片,將會得到乙個副本:

>>> chenge(name[:])

>>> names

['mrs. entity','mrs. thing']

1. 為什麼我想要修改引數

使用函式改變資料結構(比如列表和字典)是將程式抽象化的好方法。

2. 如果我的引數不變呢

在某些語言(比如c++、pscal和ada)中,重繫結引數並且是這些改變影響到函式外的變數是很平常的事情。#不是太清楚#但在python中這是不可能的:函式只能修改引數物件本身。

如果引數不可變呢,比如數字:

>>> def inc(x): trturn x + 1

>>> foo = 10

>>> foo = inc(foo)

>>> foo

11

如果真的想改變引數,可以將值放置在列表中:

>>> def inc(x): x[0] = x[0] + 1

>>> foo = [10]

>>> inc(foo)

>>> foo

[11]

目前為止我們所使用的引數都叫做位置引數,因為它們的位置很重要——事實上比他們的名字更加重要。

有些時候(尤其是引數很多的時候),引數的順序是很難記住的。為了讓事情簡單些,可以提供引數的名字:

def hello_1(greeting.name):

print '%s, %s!' % (greeting,name)

def hello_2(name,greeting):

print '%s, %s!' % (name,greeting)

>>>hello_1(name='hello',greeting='word')

hello,word!

>>>hello_1(greeting='word',name='hello')

hello,word!

但是引數名和值一定要對應。

這類使用引數名提供的引數叫做關鍵字引數。

關鍵字引數還可以在函式中給引數提供預設值:

def hello_3(greeting='hello',name='word'):

print '%s, %s!' % (greeting,name)

位置和關鍵字引數還可以聯合使用,把位置引數放置在前面就可以了。

>>> def print_params(*params):

print params

>>> print_params('testing')

('testing',)

>>> print_params(1,2,3)

(1,2,3)

引數前的星號將所有的值放置在同乙個元組中。可以說是將這些值收集起來,然後使用。

>>> def print_params_2(title.*params):

print title

print params

>>> print_params_2('params:',1,2,3)

params:

(1,2,3)

星號的意思就是」收集其餘的位置引數「。如果不提供任何供收集的元素,params就是個空元組。

另外乙個能處理關鍵字引數的」收集「操作。

>>> def print_params_3(**params):

print params

>>> print_params_3(x=1,y=2,z=3)

返回的字典而不是元組。

>>> def pirnt_params_4(x,y,z=3,*pospar,**keypar):

print x,y,z

print pospar

print keypar

>>> print_params_4(1,2,3,4,5,6,7,foo=1,bar=2)

1 2 3

(5,6,7)

>>> print_params_4(1,2)

1 2 3

(){}

函式收集的逆過程是什麼樣?

不是要收集引數,而是分解它們在「另一端」。使用*運算子就簡單了——不過是在呼叫而不是在定義是使用:

>>> params = (1,2)

>>> add(*params)

3

可以使用同樣的技術來處理字典——使用雙星號運算子:

>>> params = 

>>> hello_3(**params)

well met,sir robin!

命名空間或者說作用域。

在執行x=1賦值語句時,名稱x引用到值1。這就像字典一樣,鍵引用值。內建的vars函式可以返回這個字典:

>>> x = 1

>>> scope = vars()

>>> scope['x']

1>>> scope['x'] += 1

2

>>> def foo(): x = 42

>>> x = 1

>>> foo()

>>> x

1

這裡的foo函式改變(重繫結)了變數x,單數在最後的時候,x並沒有變。這是因為當呼叫foo的時候,新的命名空間就被建立了,它作用於foo內的**塊。

重繫結全域性變數。如果在還是函式內部將值賦予乙個變數,它會自動成為區域性變數——除非告知python將其宣告為全域性變數。(global)

>>> x = 1

>>> def change_global():

global x

x = x + 1

>>> change_global()

>>> x

2

def recursion():

return recursion()

python基礎練習(六)

編寫程式,格式化輸出楊輝三角。楊輝三角即二項式定理的係數表,各元素滿足如下條件 第一列及對角線上的元素均為1 其餘每個元素等於它上一行同一列元素與前一列元素之和。執行效果參見如圖所示。請輸入行數 generate a 輸入直角三角形的兩個直角邊,求三角形的周長和面積,以及兩個銳角的度數。結果均保留一...

python教程(六)之函式(1 抽象)

函式是什麼?函式是能為你解決問題的方法,定義的時候很具體 但你使用起來卻很抽象,因為使用時看不到具體方法 fibs 0 1 for a in range 8 2 fibs 1 print fibs 0,1,1,2,3,5,8,13,21,34 def fibs index a 0 1 for b i...

python華為程式設計 程式設計 python基礎教程

python匯入模組的3種方式 超級詳細 在編寫完python模組之後,如果直接用 import 或 from.import 來匯入該模組,有時並不能正確地載入該模組。道理很簡單,僅通過我們提供的模組檔名,python 無法找到該模組檔案。程式設計其實並不難,就是用合適的語法告訴計算機,讓它幫助完成...