1兼吓、所有的函數(shù)都有返回值, 如果有return語(yǔ)句 則執(zhí)行 return語(yǔ)句森枪,如沒(méi)有則返回None视搏。
#沒(méi)有返回值的函數(shù),其實(shí)返回的是None
def run(name):
print name,'runing' '#函數(shù)體語(yǔ)句從下一行開(kāi)始县袱,并且第一行必須是縮進(jìn)的'
>>>run('xiaoming')
xiaoming runing
>>>print run('xiaoming')
xiaoming runing
None '#如果沒(méi)有ruturn語(yǔ)句浑娜,函數(shù)返回的是None'
'#有返回值的參數(shù)'
def run(name):
return name+'runing'
>>>r = run('xiaoming')
>>>r
xiaoming runing
1、 如果一個(gè)函數(shù)的參數(shù)中含有默認(rèn)參數(shù)式散,則這個(gè)默認(rèn)參數(shù)后的所有參數(shù)都必須是默認(rèn)參數(shù) 筋遭,否則會(huì)拋出:SyntaxError: non-default argument follows default argument的異常。
def run(name,age=10,sex):
print name ,age ,sex
SyntaxError: non-default argument follows default argument
2、調(diào)用的四種錯(cuò)誤漓滔。( 只要你有一個(gè)命名參數(shù)编饺,它右邊的所有參數(shù)也都需要是命名參數(shù))
def run(name,age,sex='boy'):
print name,age,sex
>>>run() #TypeError: run() missing 2 required positional arguments: 'name' and 'age'
>>>run(name='gg',23) #SyntaxError: positional argument follows keyword argument
>>>run('gg',name='pp')#TypeError: run() got multiple values for argument 'name'
>>>run(actor='xxxx') #TypeError: run() got an unexpected keyword argument 'actor'
第一種情況是丟失參數(shù)
第二種情況是:如果第一個(gè)使用了keyword綁定,后面的都必須使用keyword綁定 ?
第三種情況:在一次調(diào)用中不能同時(shí)使用位置和keyword綁定
第四種情況:不能使用參數(shù)列表外的關(guān)鍵字
2响驴、默認(rèn)參數(shù)在函數(shù)定義段被解析透且,且只解析一次 。
>>>i = 5
>>>def f(arg=i):
>>> print arg
>>>i = 6
>>>f()
5 結(jié)果是5
image.png
感覺(jué)這里有認(rèn)知錯(cuò)誤:這里并不是只解析一次豁鲤,而是這樣調(diào)用i=6是錯(cuò)誤的石蔗,函數(shù)只會(huì)在函數(shù)體上方查找i的值, 而不是從調(diào)用處(f())上面畅形。
當(dāng)默認(rèn)值是一個(gè)可變對(duì)象养距,諸如鏈表、字典或大部分類(lèi)實(shí)例時(shí)日熬,會(huì)產(chǎn)生一些差異:
>>> def f(a, L=[]):
>>> L.append(a)
>>> return L
>>> print f(1)
>>> print f(2)
>>> print f(3)
[1]
[1, 2]
[1, 2, 3]
#可以用另外一種方式實(shí)現(xiàn):
>>> def f(a, L=None):
>>> if L is None:
>>> L = []
>>> L.append(a)
>>> return L
3.1參數(shù)列的分拆:在使用可變數(shù)量的位置參數(shù)的函數(shù)時(shí)棍厌,可使用序列拆分操作符(*)
>>> args =[3,6]
>>> range(*args)
range(3, 6)
----------------------------
>>> a = [3,20,2]
>>> range(*a)
range(3, 20, 2)
——————————————————————————————————————————————
>>> a = [3,20,2,6]
>>> range(*a)
Traceback (most recent call last):
File "<pyshell#49>", line 1, in <module>
range(*a)
TypeError: range expected at most 3 arguments, got 4
實(shí)驗(yàn)1:
>>> def product(*args,po):
result = 1
for arg in args:
result *= arg
print(result+po)
>>> product(1,2,3,4)
Traceback (most recent call last):
File "<pyshell#2>", line 1, in <module>
product(1,2,3,4)
TypeError: product() missing 1 required keyword-only argument: 'po'
>>> def product(*args,po=1):
result = 1
for arg in args:
result *= arg
print(result+po)
>>> product(1,2,3,4)
25
實(shí)驗(yàn)2:* 本身作為參數(shù) (這里 * 的作用是什么 沒(méi)有搞清楚, 我感覺(jué)像是阻止亂傳參數(shù)用的)
def heron(a,b,c,*,unit="meters"):
print('----------')
>>> heron(1,2,3)
----------
>>> def heron(a,b,c,*,unit):
print('---------')
>>> heron(1,2,3,unit='dfd') `#可以這樣傳參數(shù)`
---------
>>>
>>> heron(1,2,3,4)
Traceback (most recent call last):
File "<pyshell#19>", line 1, in <module>
heron(1,2,3,4)
TypeError: heron() takes 3 positional arguments but 4 were given
>>> heron(1,2,3)
Traceback (most recent call last):
File "<pyshell#20>", line 1, in <module>
heron(1,2,3)
TypeError: heron() missing 1 required keyword-only argument: 'unit'
>>> heron(1,3,4,5)
Traceback (most recent call last):
File "<pyshell#21>", line 1, in <module>
heron(1,3,4,5)
TypeError: heron() takes 3 positional arguments but 4 were given
如果將* 作為第一個(gè)參數(shù),那么不允許使用任何位置參數(shù)竖席,并強(qiáng)制調(diào)用該函數(shù)時(shí)使用關(guān)鍵字參數(shù):def print_set(*,paper="Letter",copies=1,color=False):...耘纱。可以不使用任何參數(shù)調(diào)用 print_set()毕荐,也可以改變某些或全部默認(rèn)值束析。但如果使用位置參數(shù),就會(huì)產(chǎn)生TypeError異常憎亚,比如print_set(“A4”)就會(huì)產(chǎn) 生異常员寇。
>>> def print_set(*,paper="Letter",copies=1,color=False):
print('7452347')
>>> print_set()
7452347
>>> print_set(paper='djfa;lsd')
7452347
3.2、對(duì)映射進(jìn)行拆分時(shí)第美,可使用映射拆分操作符(**)
3.3蝶锋、總結(jié): 不定長(zhǎng)參數(shù)
def test(*arg,**kwargs):
print arg
print kwargs
print "-------------------"
if __name__=='__main__':
test(1,2,3,4,5)
test(a=1,b=2,c=3)
test(1,2,3,a=1,b=3,c=5)
output:
(1, 2, 3, 4, 5)
{}
()
{'a': 1, 'c': 3, 'b': 2}
(1, 2, 3)
{'a': 1, 'c': 5, 'b': 3}
擴(kuò)展:non-keyword arg after keyword arg
在Python中,這兩個(gè)是python中的可變參數(shù)什往,arg表示任意多個(gè)無(wú)名參數(shù)扳缕,類(lèi)型為 tuple,*kwargs表示關(guān)鍵字參數(shù)别威,為dict躯舔,使用時(shí)需將 *arg放在 **kwargs之前,否則會(huì)有“SyntaxError: invalid syntax”的語(yǔ)法錯(cuò)誤
4省古、匿名函數(shù)
>>> def make_incrementor(n):
... return lambda x: x + n #相當(dāng)于創(chuàng)建了一個(gè)一x為參數(shù)的匿名函數(shù)粥庄?
...
>>> f = make_incrementor(42)#f = make_incrementor(n=42),設(shè)置n的值
>>> f(0)#其實(shí)調(diào)用的是匿名函數(shù)衫樊?
42
>>> f(1)
43