函數(shù)的定義敦姻、創(chuàng)建以及參數(shù)的定義,全局變量和局部變量的聲明和作用域, *args, **kwargs的使用
-
函數(shù)的定義瘾境、 創(chuàng)建以及參數(shù)的定義
- 函數(shù)的定義:函數(shù)是組織好的,可重復(fù)使用的,實(shí)現(xiàn)單一的,或者相關(guān)聯(lián)功能的代碼塊
- 函數(shù)的創(chuàng)建
- 用戶自定義的函數(shù)是用def語(yǔ)句來(lái)創(chuàng)建的
- 標(biāo)題行由def關(guān)鍵字歧杏、函數(shù)的名字(大駝峰、小駝峰等)寄雀、以及參數(shù)的集合(如果有的話)三部分組成
- 剩余部分包括一個(gè)可選的字符串和一個(gè)必須的函數(shù)體
- 參數(shù)的定義:從調(diào)用的角度分為形式參數(shù)和實(shí)際參數(shù)
- 形式參數(shù)是函數(shù)創(chuàng)建和定義的過(guò)程中小括號(hào)里面的參數(shù)
- 實(shí)際參數(shù)是函數(shù)在被調(diào)用過(guò)程中傳進(jìn)來(lái)的參數(shù)
-
函數(shù)中參數(shù)的定義
# 函數(shù)中參數(shù)定義的四種方式 # 常見(jiàn)的參數(shù)定義方式,可以定義多個(gè)參數(shù);參數(shù)之間用逗號(hào)隔開(kāi); def func(arg1,agr2): pass # 傳入的參數(shù),給參數(shù)一個(gè)默認(rèn)值 def func(arg1,arg2=value2): pass # 在不知道用多少參數(shù)的情況下傳入多個(gè)參數(shù) def func(*args): # *arg表示傳入的參數(shù)可以為0或者n個(gè),都存在以形參名為標(biāo)識(shí)符的元組中 pass # 參數(shù)在函數(shù)內(nèi)部被存放在以形參名為標(biāo)識(shí)符的字典中,調(diào)用函數(shù)采用arg1=value1,arg2=value2的形式即可 def func(**kwargs): pass In [42]: def func(*arg): ...: print arg ...: In [43]: func(1,2,3) (1, 2, 3) In [44]: def func(**kwargs): ...: print kwargs ...: In [45]: func(x=1,y=2,z=3) {'y': 2, 'x': 1, 'z': 3}
-
全局變量和局部變量的聲明和作用域
- 全局變量是在整個(gè)py文件中聲明,全局范圍內(nèi)都可以訪問(wèn)得滤;
- 局部變量是在某個(gè)函數(shù)中聲明的,只能在該函數(shù)中調(diào)用它;
- 變量的作用域由代碼賦值的位置決定
- 變量可以在三個(gè)不同地方,對(duì)應(yīng)三種不同作用域
- 一個(gè)變量在函數(shù)內(nèi)部賦值,它的作用域被定義在函數(shù)之內(nèi)
- 當(dāng)變量是在一個(gè)嵌套的函數(shù)中賦值時(shí),對(duì)于這個(gè)嵌套的函數(shù)來(lái)說(shuō),這個(gè)變量是非本地的
- 變量在函數(shù)外賦值,它的作用域就是當(dāng)前整個(gè)文件的全局變量
- global語(yǔ)句的作用是重定義全局變量的值或者把局部變量的值聲明為全局變量被其他函數(shù)調(diào)用
In [46]: total = 0 total = 1 In [47]: def sum(arg1,arg2): def func(): ...: total = arg1+arg2 global total # 重定義全局變量 ...: print "局部變量:", total total = 2 ...: return total func() ...: print total # 此時(shí)total的結(jié)果為2 In [48]: sum(1,2) 局部變量: 3 Out[48]: 3 In [49]: print "函數(shù)的全局變量:", total 函數(shù)的全局變量: 0
-
*args盒犹、**kwargs的使用
- 當(dāng)函數(shù)中參數(shù)的變量是可變參數(shù)時(shí),使用*args和*kwargs,其中*args對(duì)應(yīng)的可變參數(shù)不含key,而*kwargs對(duì)應(yīng)的可變參數(shù)含有key
# *args的用法 In [57]: def fun(*args): ...: for item in args: ...: print item ...: In [58]: fun(1,'aa',2) 1 aa 2 # **kwargs的用法 In [61]: def func(**kwargs): ...: for item in kwargs: ...: print '%s:%s' %(item, kwargs[item]) ...: In [62]: func(a=1,b=2,c=3) a:1 c:3 b:2
-
可變長(zhǎng)參數(shù)的用法
- args表示這個(gè)參數(shù)是一個(gè)元組參數(shù)懂更,默認(rèn)值為();*kwargs表示這個(gè)參數(shù)是字典參數(shù),默認(rèn)值為[];
- 可以把args急膀、*kwargs看成是兩個(gè)默認(rèn)參數(shù)沮协;多余的非關(guān)鍵字參數(shù),函數(shù)調(diào)用時(shí)被放在元組參數(shù)args中卓嫂;多余的關(guān)鍵字參數(shù)慷暂,函數(shù)調(diào)用時(shí)被放在字典參數(shù)kwargs中;
In [107]: def foo(arg1,arg2='OK',*tupleArg,**dictArg):
...: print 'arg1=',arg1
...: print 'arg2=',arg2
...: for i,element in enumerate(tupleArg):
...: print 'tupleArg %d-->%s' %(i,str(element))
...: for key in dictArg:
...: print 'dictArg %s-->%s' %(key, dictArg[key])
...:
In [109]: myList=['my1','my2']
In [110]: myDict={'name':'Tom','age':22}
In [111]: foo('formal_args',arg2='argSecond',a=1)
arg1= formal_args
arg2= argSecond
dictArg a-->1
In [113]: foo(123,myList,myDict)
arg1= 123
arg2= ['my1', 'my2']
tupleArg 0-->{'age': 22, 'name': 'Tom'}
In [114]: foo(123,rt=123,*myList,**myDict)
arg1= 123
arg2= my1
tupleArg 0-->my2
dictArg rt-->123
dictArg age-->22
dictArg name-->Tom
- 總結(jié)1:上述代碼In113中可以看出
- 元組對(duì)象前面如果不帶"*"晨雳、字典對(duì)象如果前面不帶"**",則作為普通的對(duì)象傳遞參數(shù)
- 多余的 普通參數(shù)行瑞,在foo(123,myList,myDict)中,123賦給參數(shù)arg1,myList賦給參數(shù)arg2,多余的參數(shù)myDict默認(rèn)為元組賦給myList
- 總結(jié)2:上述代碼In114中可以看出
- 參數(shù)中如果使用"*"元組參數(shù)或者"**"字典參數(shù)餐禁,這兩種參數(shù)應(yīng)該放在參數(shù)列表的最后血久;并且"*"元組參數(shù)位于"**"字典參數(shù)之前
- 關(guān)鍵字參數(shù)rt=123,因?yàn)楹瘮?shù)foo(arg1,arg2="OK",*tupleArg,**dictArg)中沒(méi)有rt參數(shù),所以最后也歸到字典參數(shù)中