第五章 函數

函數是組織好的,可重複使用的,用來實現單一,或相關聯功能的代碼段。也是帶名字的代碼塊。

Python函數有兩部分:定義和調用。

函數定義

定義一個函數只給了函數一個名稱,指定了函數里包含的參數,和代碼塊結構。在Python中定義函數即創建一個對象。

def func_name(param1, param2, ……): #def 關鍵字告訴Python創建一個函數對象

"""doc"""

python block

return expression

函數代碼塊以 def 關鍵詞開頭,後接函數標識符名稱和圓括號()。任何傳入參數和自變量必須放在圓括號中間。圓括號之間可以用於定義參數。函數的第一行語句可以選擇性地使用文檔字符串—用於存放函數說明。函數內容以冒號起始,並且縮進。return [表達式] 結束函數,選擇性地返回一個值給調用方。不帶表達式的return相當於返回 None。

函數對象也有方法和屬性,使用func_name.的形式調用:

屬性:

__name__ 函數名

__str__ 用於構造字符串函數

__dict__ 函數的命名空間

__doc__ 函數的文檔字符串

函數調用

執行已經定義的函數,方式如下:

func_name(params)

參數

參數傳遞按引用傳遞,函數實參與形參調用指向的是同一對象,可以通過ID驗證。

針對可變與不可變參數類型,在函數內部修改:

1、可變:直接操作實參

2、不可變:形參指向新的對象

參數類型有以下幾種方式:

1、必備參數

需要在調用是指定的參數,函數調用指定參數可以有兩種方式:

func_name("1", "2") #位置參數

func_name(param2="2", param1="1") #關鍵字參數

2、默認參數

在函數定義時,為一些參數指定默認值的行為。

def func_name(lev=1): #lev指定默認參數1

"""doc""" # 通過 func_name.__doc__ 查看

pass

3、不定長參數(位置&關鍵字)

A、任意實參

Python支持函數從調用語句中手機任意數量的實參。

定義:將參數以 * 修飾;*params #

調用:傳遞任意數量的實參

通過將N個實參封裝到一個元組中,接收的參數通過*修飾形參為一個空元組。即使有一個元素也會元組形式封裝。

def func_call(*params): # *讓Python創建一個名為params的空元組

print params # (x, x, x, …)

func_call(1)

func_call(1, 2, 3)

B、任意關鍵字實參

Python也可以接收指定key=value形式的任意實參,通過字典實現。

定義:將參數以 ** 修飾;**params #

調用:傳遞任意數量的 key=value,key必須是合法的標識符

C、參數反解

a、實參元組到指定數量形參,*tuple 即可。

def params_func(a, b, c):

pass

param = ("1", "2", "3")

params_func(*param)

b、

返回值

return 退出函數,選擇性地向調用方返回一個表達式。可以返回複雜的對象:列表,元組,字典等。

return不僅可以返回表達式還可以返回函數:

return func_name #返回函數對象

return func_name() #返回函數執行的結果

python支持以tuple的形式返回多個值,需要記錄返回值順序。默認多個參數的返回值以元組形式返回。

return a, b, c # (a, b, c)

有些函數沒有 return 語句,這種函數稱為過程。在這種情況下返回一個特殊的值None。

def no_return():

pass

print no_return() # None

匿名函數

Python 使用 lambda 來創建匿名函數。lambda的主體是一個表達式,而不是一個代碼塊。僅僅能在lambda表達式中封裝有限的邏輯進去。

sum = lambda num1, num2: num1 + num2

PEP 8 不建議創建匿名函數,建議用def替換。

Python 生成器(generator)

生成器就是一種迭代器。生成器擁有next方法並且行為與迭代器完全相同,生成器是可迭代的,這意味著生成器也可以用於Python的for循環中。生成器由函數演變而來,如果一個函數定義中包含yield關鍵字,那麼這個函數就不再是一個普通函數,而是一個generator。

生成器的執行流程,函數是順序執行,遇到return語句或者最後一條語句返回。而生成器是在調用next的時候執行,遇到yield語句停止,再次next時從上次yield的語句處繼續執行。每次next返回值為 yield 修飾的變量。

  • 定義

方式一:由函數演變而來

def numbers():

for num in range(1, 1000):

yield num # 每次調用 next() 的返回結果

方式二:由列表推導而來

nums = (num fpr num in range(1, 1000))

  • 調用

調用方式與函數不同,需要一個變量接收生成器,並且調用next進入執行流程,停止在 yield 語句處。

nums = numbers()

print nums #

print type(nums) #

nums.next() # 返回當前 yield 指向的值

pass介紹

Python pass是空語句,是為了保持程序結構的完整性。 pass 不做任何事情,一般用做佔位語句。

當因為語法需要但不希望執行任何命令或代碼時,則可以使用pass語句。

Python內置函數

1、range(begin, end, step),生成指定範圍的數字列表,左閉右開

2、zip([iterable, ...])

接受一系列可迭代的對象作為參數,將對象中對應的元素打包成一個個tuple(元組),然後返回由這些tuples組成的list(列表)。若傳入參數的長度不等,則返回list的長度和參數中長度最短的對象相同。

利用*號操作符,可以將list unzip(解壓)。

a = [1, 2, 3]

b = ['a', 'b', 'c']

ab = zip(a, b) # [(1,'a'), (2, 'b'), (3, 'c')]

unab = zip(*ab) # [(1, 2, 3), ('a', 'b', 'c')]

3、eval()

原型:eval(expression[, globals[, locals]])

執行一個字符串表達式,並返回其值。可以將字符串執行進行表達式計算,list,dict轉換。


分享到:


相關文章: