
當(dāng)然在學(xué)習(xí)Python的道路上肯定會(huì)困難,沒有好的學(xué)習(xí)資料,怎么去學(xué)習(xí)呢??學(xué)習(xí)Python中有不明白推薦加入交流群號:984137898?群里有志同道合的小伙伴,互幫互助,?群里有不錯(cuò)的視頻學(xué)習(xí)教程和PDF!
我們先來看個(gè)例子
>>> x, y, z = [1,2,3]>>> x1>>> y2>>> z3復(fù)制代碼
上面的操作叫做「多重賦值」,其實(shí),只要是「序列類型」的,都可以有這種操作。
序列類型包括這幾種:列表(list)、元組(tuple)、range、str、binary sequence type
>>> [1,2,3]# 列表>>> (1,3,3)# 元祖>>> range(1,4)# range>>>'text string: 文本字符串'# str>>> b'abc'# byte (binary sequence type 的一種,這里了解就行)復(fù)制代碼
所以,我們看到下面的用法就不奇怪了
>>> x, y ='你好'>>> x'你'>>> y'好'復(fù)制代碼
這個(gè)也好理解
>>>'abc'>'aac'# 字典序比較True>>> ['a','b','c'] > ['a','a','c']# 同上True復(fù)制代碼
當(dāng)然,「序列類型」還有很多類似的操作
>>>1in [1,2,3]# x in sTrue>>>'a'in'abc'True>>> [1] *5# s * n[1,1,1,1,1]>>>'a'*3'aaa'>>> len([1,2,3])# len(s)3>>> len('abc')3>>># 等等...復(fù)制代碼
函數(shù)參數(shù)類型
共有三種:位置參數(shù)(Positional Arguments)、可變參數(shù)(Arbitrary Arguments)、關(guān)鍵字參數(shù)(Keyword Arguments)。
先有個(gè)整體的認(rèn)識。函數(shù)定義如下
defintroduce(name, *hobbies, **extra_info):print('Name:')? ? print(name)? ? print('Hobbies:')forhobbyinhobbies:? ? ? ? print(hobby)? ? print('Extra info:')forkeyinextra_info:? ? ? ? print(key,':', extra_info[key])復(fù)制代碼
調(diào)用
introduce('xiaoming','movie','game',? ? ? ? ? age=22, address='cn')復(fù)制代碼
輸出如下
Name:xiaomingHobbies:moviegameExtrainfo:age :22address : cn復(fù)制代碼
其中,name 為「位置參數(shù)」,?*hobbies?為「可變參數(shù)」,?**extra_info?為「關(guān)鍵字參數(shù)」。
「位置參數(shù)」是指函數(shù)調(diào)用時(shí)根據(jù)參數(shù)位置進(jìn)行賦值
>>> # arg1 , arg2 為「位置參數(shù)」...>>> deff(arg1, arg2):... print(arg1, arg2)...>>> # 實(shí)參 1 對應(yīng)形參 arg1 ,所以 arg1 = 1 。arg2 類似...>>> f(1,2)12>>> f(1)# 少參數(shù)會(huì)報(bào)錯(cuò)Traceback (most recent call last):? File"<stdin>", line1,inTypeError: f() missing1required positional argument:'arg2'>>> f(1,2,3)# 多參數(shù)也會(huì)報(bào)錯(cuò)Traceback (most recent call last):? File"<stdin>", line1,inTypeError: f() takes2positional arguments but3were given>>>>>> # 但這可以通過設(shè)置參數(shù)默認(rèn)值解決...>>> deff(arg1, arg2=2, arg3=3):... print(arg1, arg2, arg3)...>>> f(1)123>>> f(1,3)133>>> f(1,3,5)135復(fù)制代碼
「可變參數(shù)」,個(gè)人理解就是用來解決不確定參數(shù)的問題的
>>> defmy_join(sep, *args):... returnsep.join(args)...>>> my_join(', ','apple','pear')'apple, pear'復(fù)制代碼
args 是一個(gè)元組,函數(shù)調(diào)用時(shí),除掉「位置參數(shù)」用掉的參數(shù),剩下的都會(huì)按順序放到這個(gè)元組。
「關(guān)鍵字參數(shù)」是指以?keyword=value?形式定義的參數(shù)
>>> deff(name, age=22, address='cn'):... print('name:', name)... print('age:', age)... print('address:', address)...>>> # 只傳一個(gè)參數(shù)...>>> f('xiaoming')name: xiaomingage:22address: cn>>>>>> # 三個(gè)都傳...>>> f('xm', age=23, address='us')name: xmage:23address: us>>>>>> # 順序可以隨意...>>> f('xm', address='us', age=23)name: xmage:23address: us>>>>>> # 多了會(huì)出問題...>>> f('xm', age=23, address='us',? height='175cm')Traceback (most recent call last):? File"<stdin>", line1,inTypeError: f() got an unexpected keyword argument'height'>>>>>> # 但可以這樣解決...>>> deff(name, age=22, address='cn', **extra_info):... print('name:', name)... print('age:', age)... print('address:', address)... print('extra_info:')... forkwinextra_info:... print(kw,':', extra_info[kw])...>>> f('xm', age=23, address='us',? height='175cm')# 搞定name: xmage:23address: usextra_info:height :175cm復(fù)制代碼
extra_info 是一個(gè)字典,由與前面參數(shù)對應(yīng)不上的「關(guān)鍵字參數(shù)」組成。
相信很多朋友看到這,都有點(diǎn)疑惑,這「位置參數(shù)」和「關(guān)鍵字參數(shù)」怎么區(qū)分呢?我的理解是不用區(qū)分。理由如下
>>> deff(name, age=22, address='cn'):... print('name:', name)... print('age:', age)... print('address:', address)...>>> # 不傳參會(huì)報(bào)錯(cuò), name 像是一個(gè)「位置參數(shù)」...>>> f()Traceback (most recent call last):? File"<stdin>", line1,inTypeError: f() missing1required positional argument:'name'>>>>>> # name 當(dāng)作「關(guān)鍵字參數(shù)」也沒問題...>>> f(age=23, address='us', name='xm')name: xmage:23address: us復(fù)制代碼
「位置參數(shù)」和「關(guān)鍵字參數(shù)」是一個(gè)相對的概念,不用去死磕。有的把三個(gè)參數(shù)都當(dāng)作「位置參數(shù)」,有的把三個(gè)參數(shù)都當(dāng)作「關(guān)鍵字參數(shù)」,有的把第一個(gè)當(dāng)作「位置參數(shù)」,后面兩個(gè)當(dāng)作「關(guān)鍵字參數(shù)」。理解上其實(shí)都沒問題,我們只要明白在各種情況下如何使用就好。(不過我個(gè)人傾向于最后一種理解)
另外需要注意下相關(guān)的兩個(gè)操作
>>> deff(arg1, arg2, arg3):... print(arg1, arg2, arg3)...>>> # *s 相當(dāng)于 s 中的元素解包,然后按順序放到參數(shù)列表(s 可以是「序列類型」中的一種)...>>> f(*[1,3,5])# 等同 f(1, 2, 3)135>>>>>> # **d 相當(dāng)于把 d 中的鍵值對解包,然后放到參數(shù)列表(d 可以是「字典」)...>>> f(**{'arg1':2,'arg2':4,'arg3':6})# 等同 f(arg1=2, arg2=4, arg3=6)246復(fù)制代碼
最后來個(gè)總結(jié),放出本小節(jié)的第一個(gè)函數(shù)定義
defintroduce(name, *hobbies, **extra_info):pass復(fù)制代碼
當(dāng)「位置參數(shù)」、「可變參數(shù)」和「關(guān)鍵字參數(shù)」同時(shí)存在時(shí),「可變參數(shù)」在「關(guān)鍵字參數(shù)」之前,「位置參數(shù)」在最前?!肝恢脜?shù)」和「關(guān)鍵字參數(shù)」沒必要強(qiáng)行去區(qū)分,有自己的合理理解即可。還有就是理解函數(shù)調(diào)用時(shí),?*?可以用于解包「列表」(或其它「序列類型」),**?可以用于解包「字典」。