這里主要是總結學習過程中遇到的一些問題和注意事項
文章目錄
- 關于函數參數問題
- 默認參數
- 可變參數
- 關鍵參數
- 關于函數作為返回值
- 關于Function 和 Method理解
-
關于函數參數問題
默認參數
函數參數可以有默認參數,而默認參數使用不當很容易掉坑里。
def personInfo ( name , age = 22 , city = 'BeiJing' ) : print ( name , age , city ) personInfo ( 'allen' ) # ==> allen 22 BeiJing personInfo ( 'allen' , city = 'SH' ) # ==> allen 22 SH personInfo ( 'allen' , 18 ) # ==> allen 18 BeiJing
以上函數執行的時候,沒有問題,很正常。在看一下下面的函數
def add_end ( L = [ ] ) : L . append ( 'END' ) print ( L ) add_end ( [ 1 , 2 , 3 ] ) # ==> [1, 2, 3, 'END'] add_end ( ) # ==> ['END'] add_end ( ) # ==> ['END', 'END']
我們看到默認值是
[]
,為什么調用兩次之后add_end()
之后會出現['END', 'END']
這樣的結果,原因是[]
是可變對象,如果學過c++的同學可能很容易理解,在里的L
是一個指針,指向一塊地址,而這塊地址的內容在多次調用add_end()
之后內容發生變化,而指針所指向的地址未發生變化。這里我們需要注意: 定義默認參數要牢記一點:默認參數必須指向不可變對象
修改上述例子:def add_end ( L = None ) : if L is None : L = [ ] L . append ( 'END' ) print ( L )
可變參數
在參數前面加一個
*
號,函數內部參數param
接收到一個tuple。同樣Python允許你在list或tuple前面加一個*
號,把list或tuple的元素變成可變參數傳進去def printParam ( * param ) : for x in param : print ( x ) printParam ( 1 , 2 , 3 ) # ==> 1,2,3 printParam ( [ 1 , 2 , 3 ] ) # ==> [1,2,3] printParam ( * [ 1 , 2 , 3 ] ) # ==> 1,2,3
關鍵參數
關鍵參數
**
+參數,如**kw
,kw
將獲得一個dict.# 關鍵字參數 def person ( name , age , ** kw ) : print ( 'name:' , name , 'age:' , age , 'kw:' , kw ) ; person ( 'yy' , 22 ) person ( 'yy' , 22 , city = 'BJ' , addr = 'CY' )
命名關鍵參數
和關鍵字參數**kw不同,命名關鍵字參數需要一個特殊分隔符*, 后面的參數被視為命名關鍵字參數。有一種情況,如果函數定義中已經有了一個可變參數,后面跟著的命名關鍵字參數就不再需要一個特殊分隔符 了。# 命名關鍵字參數 # 和關鍵字參數**kw不同,命名關鍵字參數需要一個特殊分隔符*,*后面的參數被視為命名關鍵字參數 def student ( name , age , * , city , grade ) : print ( 'name:%s,age:%d,city:%s,grade:%s' % ( name , age , city , grade ) ) student ( 'DH' , 12 , city = "BeiJing" , grade = 'A' ) #==> name:DH,age:12,city:BeiJing,grade:A student ( 'DH' , 12 ) #==> 提示缺少 'city' and 'grade' 參數 # 如果函數定義中已經有了一個可變參數,后面跟著的命名關鍵字參數就不再需要一個特殊分隔符*了: def student2 ( name , age , * args , city , grade ) : print ( 'name:%s,age:%d,city:%s,grade:%s, args:' % ( name , age , city , grade ) , args ) student2 ( 'DH' , 12 , 1 , 2 , 3 , 4 , city = "BeiJing" , grade = 'A' ) #==> name:DH,age:12,city:BeiJing,grade:A, args: (1, 2, 3, 4)
-
關于函數作為返回值
我們來看一個函數
def count ( ) : fs = [ ] for i in range ( 1 , 4 ) : def f ( ) : return i * i fs . append ( f ) return fs for f in count ( ) : print ( f ( ) ) //= = > 9 9 9
看看這個函數,輸出結果跟我們預想的1,4,9不符合。這是因為變量
i
在循環3次之后,i
已經變成3了,因此結果是9,9,9
注意:返回閉包時牢記一點,返回函數不要引用任何循環變量,或者后續會發生變化的變量
上個函數我們做個改變def count ( ) : def f ( j ) : def g ( ) : return j * j return g fs = [ ] for x in range ( 1 , 4 ) : fs . append ( f ( x ) ) ; return fs
-
關于Function 和 Method理解
class Student ( object ) : def set_age ( self , age ) : self . age = age def set_name ( self , name ) : self . name = name Student . set_name = set_name print ( type ( Student . set_name ) ) #==>
print ( type ( Student . set_age ) ) #==> s = Student ( ) print ( type ( s . set_name ) ) #==> print ( type ( s . set_age ) ) #==>
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
