Python 序列類型以及函數(shù)參數(shù)類型

當(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í),?*?可以用于解包「列表」(或其它「序列類型」),**?可以用于解包「字典」。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容