中文字幕免费精品_亚洲视频自拍_亚洲综合国产激情另类一区_色综合咪咪久久

Python函數(shù)參數(shù)類型*、**的區(qū)別
來源:易賢網(wǎng) 閱讀:1472 次 日期:2015-04-14 15:26:11
溫馨提示:易賢網(wǎng)小編為您整理了“Python函數(shù)參數(shù)類型*、**的區(qū)別”,方便廣大網(wǎng)友查閱!

剛開始學習python,python相對于java確實要簡潔易用得多。內(nèi)存回收類似hotspot的可達性分析, 不可變對象也如同java得Integer類型,with函數(shù)類似新版本C++的特性,總體來說理解起來比較輕松。只是函數(shù)部分參數(shù)的"*"與"**",閉包等問題,著實令人迷糊了一把,弄清概念后寫下此文記錄下來,也希望本文能夠幫助其他初學者。

所以本文是一篇學習筆記,著重于使用的細節(jié)和理解上,首先分別介紹了函數(shù)各種參數(shù)類型在調(diào)用和聲明時的區(qū)別,及其在混用時需要注意的一些細節(jié),之后講了閉包相關的內(nèi)容。如果有不對的地方歡迎指正。

函數(shù)參數(shù)不帶“*”,"*" 與 "**"的區(qū)別

理解這個問題得關鍵在于要分開理解調(diào)用和聲明語法中3者得區(qū)別.

函數(shù)調(diào)用區(qū)別

1. 不同類型的參數(shù)簡述

#這里先說明python函數(shù)調(diào)用得語法為:

代碼如下:

func(positional_args, keyword_args,

*tuple_grp_nonkw_args, **dict_grp_kw_args)

#為了方便說明,之后用以下函數(shù)進行舉例

def test(a,b,c,d,e):

print a,b,c,d,e

舉個例子來說明這4種調(diào)用方式得區(qū)別:

代碼如下:

#-------------------------------

#positional_args方式

>>> test(1,2,3,4,5)

1 2 3 4 5

#這種調(diào)用方式的函數(shù)處理等價于

a,b,c,d,e = 1,2,3,4,5

print a,b,c,d,e

#-------------------------------

#keyword_args方式

>>> test(a=1,b=3,c=4,d=2,e=1)

1 3 4 2 1

#這種處理方式得函數(shù)處理等價于

a=1

b=3

c=4

d=2

e=1

print a,b,c,d,e

#-------------------------------

#*tuple_grp_nonkw_args方式

>>> x = 1,2,3,4,5

>>> test(*x)

1 2 3 4 5

#這種方式函數(shù)處理等價于

代碼如下:

a,b,c,d,e = x

print a,b,c,d,e

#特別說明:x也可以為dict類型,x為dick類型時將鍵傳遞給函數(shù)

>>> y

{'a': 1, 'c': 6, 'b': 2, 'e': 1, 'd': 1}

>>> test(*y)

a c b e d

#---------------------------------

#**dict_grp_kw_args方式

>>> y

{'a': 1, 'c': 6, 'b': 2, 'e': 1, 'd': 1}

>>> test(**y)

1 2 6 1 1

#這種函數(shù)處理方式等價于

a = y['a']

b = y['b']

... #c,d,e不再贅述

print a,b,c,d,e

2. 不同類型參數(shù)混用需要注意的一些細節(jié)

  接下來說明不同參數(shù)類型混用的情況,要理解不同參數(shù)混用得語法需要理解以下幾方面內(nèi)容.

  首先要明白,函數(shù)調(diào)用使用參數(shù)類型必須嚴格按照順序,不能隨意調(diào)換順序,否則會報錯. 如 (a=1,2,3,4,5)會引發(fā)錯誤,; (*x,2,3)也會被當成非法.

  其次,函數(shù)對不同方式處理的順序也是按照上述的類型順序.因為#keyword_args方式和**dict_grp_kw_args方式對參數(shù)一一指定,所以無所謂順序.所以只需要考慮順序賦值(positional_args)和列表賦值(*tuple_grp_nonkw_args)的順序.因此,可以簡單理解為只有#positional_args方式,#*tuple_grp_nonkw_args方式有邏輯先后順序的.

  最后,參數(shù)是不允許多次賦值的.

  舉個例子說明,順序賦值(positional_args)和列表賦值(*tuple_grp_nonkw_args)的邏輯先后關系:

代碼如下:

#只有在順序賦值,列表賦值在結果上存在羅輯先后關系

#正確的例子1

>>> x = {3,4,5}

>>> test(1,2,*x)

1 2 3 4 5

#正確的例子2

>>> test(1,e=2,*x)

1 3 4 5 2

#錯誤的例子

>>> test(1,b=2,*x)

Traceback (most recent call last):

File "<stdin>", line 1, in <module>

TypeError: test() got multiple values for keyword argument 'b'

#正確的例子1,處理等價于

a,b = 1,2 #順序參數(shù)

c,d,e = x #列表參數(shù)

print a,b,c,d,e

#正確的例子2,處理等價于

a = 1 #順序參數(shù)

e = 2 #關鍵字參數(shù)

b,c,d = x #列表參數(shù)

#錯誤的例子,處理等價于

a = 1 #順序參數(shù)

b = 2 #關鍵字參數(shù)

b,c,d = x #列表參數(shù)

#這里由于b多次賦值導致異常,可見只有順序參數(shù)和列表參數(shù)存在羅輯先后關系

函數(shù)聲明區(qū)別

  理解了函數(shù)調(diào)用中不同類型參數(shù)得區(qū)別之后,再來理解函數(shù)聲明中不同參數(shù)得區(qū)別就簡單很多了.

1. 函數(shù)聲明中的參數(shù)類型說明

  函數(shù)聲明只有3種類型, arg, *arg , **arg 他們得作用和函數(shù)調(diào)用剛好相反. 調(diào)用時*tuple_grp_nonkw_args將列表轉換為順序參數(shù),而聲明中的*arg的作用是將順序賦值(positional_args)轉換為列表. 調(diào)用時**dict_grp_kw_args將字典轉換為關鍵字參數(shù),而聲明中**arg則反過來將關鍵字參數(shù)(keyword_args)轉換為字典.

特別提醒:*arg 和 **arg可以為空值.

以下舉例說明上述規(guī)則:

代碼如下:

#arg, *arg和**arg作用舉例

def test2(a,*b,**c):

print a,b,c

#---------------------------

#*arg 和 **arg可以不傳遞參數(shù)

>>> test2(1)

1 () {}

#arg必須傳遞參數(shù)

>>> test2()

Traceback (most recent call last):

File "<stdin>", line 1, in <module>

TypeError: test2() takes at least 1 argument (0 given)

#----------------------------

#*arg將順positional_args轉換為列表

>>> test2(1,2,[1,2],{'a':1,'b':2})

1 (2, [1, 2], {'a': 1, 'b': 2}) {}

#該處理等價于

a = 1 #arg參數(shù)處理

b = 2,[1,2],{'a':1,'b':2} #*arg參數(shù)處理

c = dict() #**arg參數(shù)處理

print a,b,c

#-----------------------------

#**arg將keyword_args轉換為字典

>>> test2(1,2,3,d={1:2,3:4}, c=12, b=1)

1 (2, 3) {'c': 12, 'b': 1, 'd': {1: 2, 3: 4}}

#該處理等價于

a = 1 #arg參數(shù)處理

b= 2,3 #*arg參數(shù)處理

#**arg參數(shù)處理

c = dict()

c['d'] = {1:2, 3:4}

c['c'] = 12

c['b'] = 1

print a,b,c

2. 處理順序問題

  函數(shù)總是先處理arg類型參數(shù),再處理*arg和**arg類型的參數(shù). 因為*arg和**arg針對的調(diào)用參數(shù)類型不同,所以不需要考慮他們得順序.

代碼如下:

def test2(a,*b,**c):

print a,b,c

>>> test2(1, b=[1,2,3], c={1:2, 3:4},a=1)

Traceback (most recent call last):

File "<stdin>", line 1, in <module>

TypeError: test2() got multiple values for keyword argument 'a'

#這里會報錯得原因是,總是先處理arg類型得參數(shù)

#該函數(shù)調(diào)用等價于

#處理arg類型參數(shù):

a = 1

a = 1 #多次賦值,導致異常

#處理其他類型參數(shù)

...

print a,b,c

閉包

  python的函數(shù),原本只能訪問兩個區(qū)域的變量:全局,和局部(函數(shù)上下文). 實際上,函數(shù)本身也是一個對象,也有自己的作用域. 閉包通過函數(shù)與引用集合的組合,使得函數(shù)可以在它被定義的區(qū)域之外執(zhí)行. 這個集合可以通過func_closure來獲取這個引用集合. 這與python處理全局變量得方式一樣,只不過全局變量將引用集合存儲在__globals__字段中.func_closure是一個存儲cell類型的元組,每個cell存儲一個上下文變量.

  另外,舊版本得python的內(nèi)部函數(shù)不能在其他作用域使用的原因,并不是因為每個作用域的變量嚴格相互隔離,而是脫離原本的作用域后,函數(shù)失去了原本上下文的引用。需要注意的是,閉包存儲的上下文信息一樣是淺拷貝,所以傳遞給內(nèi)部函數(shù)的可變對象仍然會被其他擁有該對象引用得變量修改.

舉個例子:

代碼如下:

>>> def foo(x,y):

... def bar():

... print x,y

... return bar

...

#查看func_closure的引用信息

>>> a = [1,2]

>>> b = foo(a,0)

>>> b.func_closure[0].cell_contents

[1, 2]

>>> b.func_closure[1].cell_contents

0

>>> b()

[1, 2] 0

#可變對象仍然能被修改

>>> a.append(3)

>>> b.func_closure[0].cell_contents

[1, 2, 3]

>>> b()

[1, 2, 3] 0

更多信息請查看IT技術專欄

更多信息請查看腳本欄目
易賢網(wǎng)手機網(wǎng)站地址:Python函數(shù)參數(shù)類型*、**的區(qū)別
關于我們 | 聯(lián)系我們 | 人才招聘 | 網(wǎng)站聲明 | 網(wǎng)站幫助 | 非正式的簡要咨詢 | 簡要咨詢須知 | 新媒體/短視頻平臺 | 手機站點

版權所有:易賢網(wǎng)

中文字幕免费精品_亚洲视频自拍_亚洲综合国产激情另类一区_色综合咪咪久久
视频在线观看一区| 亚洲色图制服丝袜| 欧美日韩另类一区| 欧美主播一区二区三区美女| 99麻豆久久久国产精品免费优播| 国产河南妇女毛片精品久久久| 美女视频免费一区| 精品一区二区三区日韩| 精品制服美女久久| 国产99精品国产| 国产91色综合久久免费分享| 春色校园综合激情亚洲| 成人精品一区二区三区四区 | 欧美一区二区女人| 2023国产一二三区日本精品2022| 亚洲欧美国产毛片在线| 亚洲一区二区视频| 国产精品亚洲午夜一区二区三区| 精品一区免费av| 精品国产污污免费网站入口| 久久精品99国产精品日本| 日本伊人色综合网| 国产一区不卡视频| 成人性生交大片免费看中文网站| 国产99精品国产| 在线视频欧美精品| 欧美一卡二卡在线观看| 久久精品一区四区| 亚洲蜜臀av乱码久久精品| 午夜精品爽啪视频| 国产福利一区二区三区| 欧美日韩中文一区| 国产一区二区三区黄视频| 欧美午夜片在线看| 欧美蜜桃一区二区三区| 日韩精品在线看片z| 中文字幕视频一区二区三区久| 一区二区三区视频在线看| 精品一区二区三区久久久| 成人高清免费观看| 欧美日韩你懂得| 国产网站一区二区三区| 午夜精品福利一区二区三区av| 精品一区二区三区日韩| 色94色欧美sute亚洲线路二| 337p粉嫩大胆噜噜噜噜噜91av| 中文字幕日本不卡| 韩国av一区二区| 在线观看网站黄不卡| 精品国产网站在线观看| 亚洲永久精品国产| 成人免费视频免费观看| 日韩情涩欧美日韩视频| 亚洲影院理伦片| 国产成人精品亚洲午夜麻豆| 欧美丰满高潮xxxx喷水动漫| 亚洲精品日韩一| 不卡欧美aaaaa| 久久久99久久| 一区二区三区91| 欧美性高清videossexo| 国产喷白浆一区二区三区| 三级亚洲高清视频| 欧美无人高清视频在线观看| 亚洲欧洲日产国码二区| 国产一区亚洲一区| 欧美二区在线观看| 亚洲成人动漫在线免费观看| 一本大道久久a久久精品综合 | 国产精品国产自产拍高清av王其| 日韩成人午夜精品| 欧美日精品一区视频| 亚洲精品久久嫩草网站秘色| www.亚洲激情.com| 亚洲精品一区二区三区精华液| 奇米在线7777在线精品| 欧美日韩国产大片| 性欧美疯狂xxxxbbbb| 91福利小视频| 亚洲高清免费视频| 91黄色免费看| 亚洲h动漫在线| 欧美二区三区的天堂| 天使萌一区二区三区免费观看| 欧美视频在线一区| 午夜伦理一区二区| 欧美一区二区三区免费观看视频 | 一区二区三区四区高清精品免费观看 | 99久久免费视频.com| 欧美激情中文字幕一区二区| 岛国av在线一区| 中文字幕一区二区三区蜜月| 99re视频精品| 亚洲第一会所有码转帖| 91.成人天堂一区| 人人爽香蕉精品| 国产欧美视频一区二区| 国内精品久久久久影院薰衣草| 久久综合色鬼综合色| 国产盗摄精品一区二区三区在线| 国产精品天干天干在线综合| 99精品欧美一区二区蜜桃免费 | 国产亚洲欧美色| 91香蕉视频黄| 日本不卡一区二区三区| 精品对白一区国产伦| 成人av免费在线| 亚洲国产欧美日韩另类综合 | 久久精品久久99精品久久| 久久精品视频在线看| 94色蜜桃网一区二区三区| 午夜精品一区二区三区免费视频 | 欧美在线免费视屏| 日韩av一区二区三区四区| 欧美激情中文不卡| 在线不卡欧美精品一区二区三区| 黄色资源网久久资源365| 亚洲色图一区二区三区| 日韩欧美国产麻豆| 91丨porny丨国产| 极品少妇xxxx精品少妇偷拍| 最新中文字幕一区二区三区| 日韩一区二区在线观看| 色94色欧美sute亚洲13| 国产一区二区三区日韩| 亚洲v日本v欧美v久久精品| 中国av一区二区三区| 欧美日韩电影一区| 97久久超碰精品国产| 国产综合色在线| 免费在线观看视频一区| 夜夜嗨av一区二区三区四季av| 久久嫩草精品久久久久| 91麻豆精品国产91久久久 | 国产一区二区三区免费看| 亚洲自拍欧美精品| 中文字幕日韩av资源站| 久久久久久99久久久精品网站| 欧美日韩一级片在线观看| 91视视频在线观看入口直接观看www| 日本三级亚洲精品| 亚洲最大色网站| 中文字幕亚洲一区二区av在线 | 久久成人久久鬼色| 日日夜夜一区二区| 亚洲制服欧美中文字幕中文字幕| 国产精品的网站| 国产精品萝li| 国产女人水真多18毛片18精品视频| 日韩一级片在线观看| 宅男噜噜噜66一区二区66| 在线观看亚洲一区| 欧美亚洲日本一区| 色悠悠亚洲一区二区| 成人av网站在线| 波多野结衣中文字幕一区| 国产成人精品aa毛片| 成人免费观看男女羞羞视频| 成人免费视频app| www.日本不卡| 99久久综合色| 91在线高清观看| 在线一区二区视频| 欧美日韩免费观看一区二区三区 | 国产欧美一区二区三区网站 | 91香蕉视频污| 91久久精品一区二区| 欧美性生活久久| 欧美一区二区三区白人| 2欧美一区二区三区在线观看视频| 亚洲精品在线电影| 国产精品免费久久久久| 国产精品卡一卡二卡三| 亚洲视频在线一区二区| 亚洲成国产人片在线观看| 美女视频免费一区| 国产一区福利在线| 不卡视频在线观看| 欧美午夜不卡在线观看免费| 日韩一级欧美一级| 国产精品美女久久久久久久久久久 | 成人黄页在线观看| 欧美亚洲免费在线一区| 欧美日韩在线播| 欧美大片在线观看一区二区| 久久午夜国产精品| 亚洲精品亚洲人成人网| 日韩在线一区二区| 国产91精品一区二区| 欧美视频一区二区在线观看| 日韩精品专区在线影院重磅| 久久嫩草精品久久久精品一| 亚洲欧洲精品成人久久奇米网| 亚洲一级二级三级在线免费观看| 日本中文一区二区三区| 国产精品99久久久久久有的能看| 色综合天天性综合| 欧美α欧美αv大片| 国产精品国产自产拍在线| 日韩电影在线免费观看|