關於Python3中函數:
# 關於Python3中函數:
- 定義
定義函數使用關鍵字def,後接函數名和放在圓括號()中的可選參數列表,函數內容以冒號起始並且縮進。一般格式如下:
```
def 函數名(參數列表): """文檔字符串""" 函數體 return [expression]
```
- 函數變量作用域
在函數內部定義的變量擁有一個局部作用域,在函數外定義的擁有全局作用域。註意:在函數內部可以引用全局變量,但無法對其賦值(除非用global進行聲明)。
```
a = 5 # 全局變量a def func1(): print(‘func1() print a =‘, a) deffunc2(): a = 21 # 局部變量a print(‘func2() print a =‘, a) def func3(): global a a = 10 # 修改全局變量a print(‘func3() print a =‘, a) func1() func2() func3() print(‘the global a =‘, a)
```
- 函數調用:
1、普通調用
與其他語言中函數調用一樣,Python中在調用函數時,需要給定和形參相同個數的實參並按順序一一對應。
```
def fun(name, age, gender): print(‘Name:‘,name,‘Age:‘,age,‘Gender:‘,gender,end=‘ ‘) print() fun(‘Jack‘, 20, ‘man‘) # call ``` 函數也可以不傳遞參數直接進行調用: ``` def fib(): """Print a Fibonacci series""" a, b = 0, 1 c=[] while b < 2000: a, b = b, a+b if b%2 == 0: c.append(b) return c fib() # 在交互模式下,return的結果會自動打印出來,而作為腳本單獨運行時則需要print函數才能顯示。 print(fib())
```
2、使用關鍵字參數調用函數
函數也可以通過keyword=value 形式的關鍵字參數來調用,因為我們明確指出了對應關系,所以參數的順序也就無關緊要了。
```
def fun(name, age, gender): print(‘Name:‘,name,‘Age:‘,age,‘Gender:‘,gender,end=‘ ‘) print() fun(gender=‘man‘, name=‘Jack‘, age=20) # using keyword arguments
```
3、調用具有默認實參的函數
Python中的函數也可以給一個或多個參數指定默認值,這樣在調用時可以選擇性地省略該參數:
```
def fun(a, b, c=5): print(a+b+c) fun(1,2) fun(1,2,3)
```
註意:通常情況下默認值只被計算一次,但如果默認值是一個可變對象時會有所不同, 如列表, 字典, 或大多類的對象時。例如,下面的函數在隨後的調用中會累積參數值:
```
def fun(a, L=[]): L.append(a) print(L) fun(1) # 輸出[1] fun(2) # 輸出[1, 2] fun(3) # 輸出[1, 2, 3]
```
4、調用可變參數函數
通過在形參前加一個星號(*)或兩個星號(**)來指定函數可以接收任意數量的實參。
```
def fun(*args): print(type(args)) print(args) fun(1,2,3,4,5,6) # 輸出: # <class ‘tuple‘> # (1, 2, 3, 4, 5, 6) def fun(**args): print(type(args)) print(args) fun(a=1,b=2,c=3,d=4,e=5) # 輸出: # <class ‘dict‘> # {‘d‘: 4, ‘e‘: 5, ‘b‘: 2, ‘c‘: 3, ‘a‘: 1}
```
從兩個示例的輸出可以看出:當參數形如*args時,傳遞給函數的任意個實參會按位置被包裝進一個元組(tuple);當參數形如**args時,傳遞給函數的任意個key=value實參會被包裝進一個字典(dict)。
5、通過解包參數調用函數
上一點說到傳遞任意數量的實參時會將它們打包進一個元組或字典,當然有打包也就有解包(unpacking)。通過 單星號和雙星號對List、Tuple和Dictionary進行解包:
```
def fun(a=1, b=2, c=3): print(a+b+c) fun() # 正常調用 list1 = [11, 22, 33] dict1 = {‘a‘:40, ‘b‘:50, ‘c‘:60} fun(*list1) # 解包列表 fun(**dict1) # 解包字典 # 輸出: # 6 # 66 # 150
```
註:*用於解包Sequence,**用於解包字典。解包字典會得到一系列的key=value,故本質上就是使用關鍵字參數調用函數。
---
- lamdba
lambda關鍵詞能創建小型匿名函數。lambda函數能接收任何數量的參數但只能返回一個表達式的值,它的一般形式如下:
```
lambda [arg1 [,arg2,.....argn]] : expression #lambda表達式可以在任何需要函數對象的地方使用,它們在語法上被限制為單一的表達式: f = lambda x, y: x+y print(f(10, 20)) def make_fun(n): return lambda x: x+n f = make_fun(15) print(f(5)) s = lambda x,y,z:(x+y)*z a = int(input("輸入值一:")) b = int(input("輸入值二:")) c = int(input(‘輸入值三:‘)) print (‘結果:‘,s(a,b,c))
```
- 文檔字符串
函式體的第一個語句可以是三引號括起來的字符串, 這個字符串就是函數的文檔字符串,或稱為docstring 。我們可以使用print(function.__doc__)輸出文檔:
```
def fun(): """Some information of this function. This is documentation string.""" return print(fun.__doc__)
```
文檔字符串主要用於描述一些關於函數的信息,讓用戶交互地瀏覽和輸出。建議養成在代碼中添加文檔字符串的好習慣
關於Python3中函數: