电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術(shù)文章
文章詳情頁

詳解Python 函數(shù)參數(shù)的拆解

瀏覽:5日期:2022-07-12 15:14:23

本文為閱讀 《Python Tricks: The Book》一書的 3.5 Function Argument Unpacking 的筆記與擴充理解。函數(shù)參數(shù)拆解是定義可變參數(shù)(VarArgs) *args 和 **kwargs 的反向特性。

*args 和 **kwars 是函數(shù)可定義一個形參來接收傳入的不定數(shù)量的實參。

而這里的函數(shù)參數(shù)拆解是形參定義多個,在調(diào)用時只傳入一個集合類型對象(帶上 * 或 ** 前綴),如 list, tuple, dict, 甚至是 generator, 然后函數(shù)能自動從集合對象中取得對應(yīng)的值。

如果能理解下面賦值時的參數(shù)拆解和 Python 3.5 的新增 * ** 操作,那么于本文講述的特性就好理解了。

唯一的不同時作為參數(shù)的集合傳入函數(shù)時必須前面加上 * 或 **, 以此宣告該參數(shù)將被拆解,而非一個整體作為一個函數(shù)參數(shù)。加上 * 或 ** 與 Java 的 @SafeVarargs 有類似的功效,最接近的是 Scala 的 foo(Array[String]('d', 'e') : _*) 寫法。參見:Java 和 Scala 調(diào)用變參的方式

Python 的賦值拆解操作

>>> a, b = [1, 2] # a, b = (1, 2) 也是一樣的效果>>> print(a, b)1 2>>> a, b = {’x’: 1, ’y’:2}>>> print(a, b)x y>>> a, b = {’x’: 1, ’y’:2}.keys()>>> print(a, b)x y>>> a, b = {’x’: 1, ’y’:2}.values()>>> print(a, b)1 2>>> a, b = (x * x for x in range(2))>>> print(a, b)0 1

Python 3.5 的新增拆解操作

>>> [1, 2, *range(3), *[4, 5], *(6, 7)] # * 號能把集合打散,flatten(unwrap)[1, 2, 0, 1, 2, 4, 5, 6, 7]>>> {’x’: 1, **{’y’: 2, ’z’: 3}} # ** 把字典打散, flatten(unwrap) 操作{’x’: 1, ’y’: 2, ’z’: 3}

有些像是函數(shù)編程中的 flatten 或 unwrap 操作。

有了上面的基礎(chǔ)后,再回到原書中的例子,當(dāng)我們定義如下打印 3-D 坐標(biāo)的函數(shù)

def print_vector(x, y, z): print(’<%s, %s, %s>’ % (x, y, z))

依次傳入三個參數(shù)的方式就不值不提了,現(xiàn)在就看如何利用函數(shù)的參數(shù)拆解特性,只傳入一個集合參數(shù),讓該 print_vector 函數(shù)準(zhǔn)確從集合中獲得相應(yīng)的 x, y, 和 z 的值。

函數(shù)參數(shù)拆解的調(diào)用舉例

>>> list_vec = [2, 1, 3]>>> print_vector(*list_vec)<2, 1, 3>>>> print_vector(*(2, 1, 3))<2, 1, 3>>>> dict_vec = {’y’: 2, ’z’: 1, ’x’: 3}>>> print_vector(*dict_vec) # 相當(dāng)于 print_vector(*dict_vec.keys())<y, z, x>>>> print_vector(**dict_vec) # 相當(dāng)于 print_vector(dict_vec[’x’], dict_vec[’y’], dict_vec[’z’]<3, 2, 1>>>> genexpr = (x * x for x in range(3))>>> print_vector(*genexpr)<0, 1, 4>>>> print_vector(*dict_vec.values()) # 即 print_vector(*list(dict_vec.values()))<2, 1, 3>

注意 **dict_vec 有點不一樣,它的內(nèi)容必須是函數(shù) print_vector 的形參 ’x’, ’y’, ’z’ 作為 key 的三個元素。

以下是各種錯誤

**dict_vec 元素個數(shù)不對,或 key 不匹配時的錯誤

>>> print_vector(**{’y’: 2, ’z’: 1, ’x’: 3})<3, 2, 1>>>> print_vector(**{’y’: 2, ’z’: 1, ’a’: 3}) #元素個數(shù)是3 個,但出現(xiàn) x, y, z 之外的 keyTraceback (most recent call last): File '<pyshell#39>', line 1, in <module> print_vector(**{’y’: 2, ’z’: 1, ’a’: 3})TypeError: print_vector() got an unexpected keyword argument ’a’>>> print_vector(**{’y’: 2, ’z’: 1, ’x’: 3, ’a’: 4}) # 包含有 x, y, z, 但有四個元素,key ’a’ 不能識別Traceback (most recent call last): File '<pyshell#40>', line 1, in <module> print_vector(**{’y’: 2, ’z’: 1, ’x’: 3, ’a’: 4})TypeError: print_vector() got an unexpected keyword argument ’a’>>> print_vector(**{’y’: 2, ’z’: 1}) # 缺少 key ’x’ 對應(yīng)的元素Traceback (most recent call last): File '<pyshell#41>', line 1, in <module> print_vector(**{’y’: 2, ’z’: 1})TypeError: print_vector() missing 1 required positional argument: ’x’

不帶星星的錯誤

>>> print_vector([2, 1, 3])Traceback (most recent call last): File '<pyshell#44>', line 1, in <module> print_vector([2, 1, 3])TypeError: print_vector() missing 2 required positional arguments: ’y’ and ’z’

把集合對象整體作為第一個參數(shù),所以未傳入 y 和 z,因此必須用前綴 * 或 ** 通告函數(shù)進行參數(shù)拆解

集合長度與函數(shù)參數(shù)個數(shù)不匹配時的錯誤

>>> print_vector(*[2, 1]) # 拆成了 x=2, y=1, 然后 z 呢?Traceback (most recent call last): File '<pyshell#47>', line 1, in <module> print_vector(*[2, 1])TypeError: print_vector() missing 1 required positional argument: ’z’>>> print_vector(*[2, 1, 3, 4]) # 雖然拆出了 x=2, y=1, z=3, 但也別想強塞第四個元素給該函數(shù)(只定義的三個參數(shù))Traceback (most recent call last): File '<pyshell#48>', line 1, in <module> print_vector(*[2, 1, 3, 4])TypeError: print_vector() takes 3 positional arguments but 4 were given

上面這兩個錯誤與賦值時的拆解因元素個數(shù)不匹配時的錯誤是相對應(yīng)的

>>> a, b = [1]Traceback (most recent call last): File '<pyshell#54>', line 1, in <module> a, b = [1]ValueError: not enough values to unpack (expected 2, got 1)>>> a, b = [1, 2, 3]Traceback (most recent call last): File '<pyshell#55>', line 1, in <module> a, b = [1, 2, 3]ValueError: too many values to unpack (expected 2)

當(dāng)然在賦值時 Python 可以像下面那樣做

a, b, *c = [1, 2, 3, 4]>>> print(a, b, c)1 2 [3, 4]

補充(2020-07-02): 迭代的拆解在 Python 中的術(shù)語是 Iterable Unpacking, 找到兩個相關(guān)的 PEP 448, PEP 3132。在實際上用處還是很大的,比如在拆分字符串時只關(guān)系自己有興趣的字段

line = ’2020-06-19 22:14:00 2688 abc.json’date, time, size, name = line.split() # 獲得所有字段值_, time, _, name = line.split() # 只對 time 和 name 有興趣date, *_ = line.split() # 只對第一個 date 有興趣*_, name = line.split() # 只對最后的 name 有興趣date, *_, name = line.split() # 對兩邊的 date, name 有興趣

這樣就避免了用索引號來引用拆分后的值,如 split[0], splint[2] 等,有名的變量不容易出錯。注意到 Python 在拆解時非常聰明,它知道怎么去對應(yīng)位置,用了星號(*) 的情況,明白如何處理前面跳過多少個,中間跳過多少個,或最后收集多少個元素。

鏈接:

PEP 448 -- Additional Unpacking GeneralizationsPEP 3132 -- Extended Iterable Unpacking

以上就是詳解Python 函數(shù)參數(shù)的拆解的詳細內(nèi)容,更多關(guān)于python 函數(shù)參數(shù)拆解的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Python 編程
相關(guān)文章:
主站蜘蛛池模板: 板框压滤机-隔膜压滤机配件生产厂家-陕西华星佳洋装备制造有限公司 | 中天寰创-内蒙古钢结构厂家|门式刚架|钢结构桁架|钢结构框架|包头钢结构煤棚 | 不锈钢法兰-碳钢法兰-法兰盘生产加工厂家-[鼎捷峰]-不锈钢法兰-碳钢法兰-法兰盘生产加工厂家-[鼎捷峰] | 培训中心-海南香蕉蛋糕加盟店技术翰香原中心官网总部 | 储气罐,真空罐,缓冲罐,隔膜气压罐厂家批发价格,空压机储气罐规格型号-上海申容压力容器集团有限公司 | POS机办理_个人POS机免费领取 - 银联POS机申请首页 | 土壤墒情监测站_土壤墒情监测仪_土壤墒情监测系统_管式土壤墒情站-山东风途物联网 | 顶空进样器-吹扫捕集仪-热脱附仪-二次热解吸仪-北京华盛谱信仪器 | 湖南教师资格网-湖南教师资格证考试网 | 点胶机_点胶阀_自动点胶机_智能点胶机_喷胶机_点胶机厂家【欧力克斯】 | 杭州用友|用友软件|用友财务软件|用友ERP系统--杭州协友软件官网 | 碳纤维布-植筋胶-灌缝胶-固特嘉加固材料公司 | 上海防爆真空干燥箱-上海防爆冷库-上海防爆冷柜?-上海浦下防爆设备厂家? | STRO|DTRO-STRO反渗透膜(科普)_碟滤 | SF6环境监测系统-接地环流在线监测装置-瑟恩实业 | 砖机托板价格|免烧砖托板|空心砖托板厂家_山东宏升砖机托板厂 | 水压力传感器_数字压力传感器|佛山一众传感仪器有限公司|首页 | 电解抛光加工_不锈钢电解抛光_常州安谱金属制品有限公司 | 华禹护栏|锌钢护栏_阳台护栏_护栏厂家-华禹专注阳台护栏、楼梯栏杆、百叶窗、空调架、基坑护栏、道路护栏等锌钢护栏产品的生产销售。 | 无线联网门锁|校园联网门锁|学校智能门锁|公租房智能门锁|保障房管理系统-KEENZY中科易安 | 电缆接头_防水接头_电缆防水接头_防水电缆接头_上海闵彬 | 无纺布包装机|径向缠绕包装机|缠绕膜打包机-上海晏陵智能设备有限公司 | 定量包装机,颗粒定量包装机,粉剂定量包装机,背封颗粒包装机,定量灌装机-上海铸衡电子科技有限公司 | 卫生人才网-中国专业的医疗卫生医学人才网招聘网站! | 医用酒精_84消毒液_碘伏消毒液等医用消毒液-漓峰消毒官网 | 华禹护栏|锌钢护栏_阳台护栏_护栏厂家-华禹专注阳台护栏、楼梯栏杆、百叶窗、空调架、基坑护栏、道路护栏等锌钢护栏产品的生产销售。 | 首页 - 张店继勇软件开发工作室 兰州UPS电源,兰州山特UPS-兰州万胜商贸 | 客服外包专业服务商_客服外包中心_网萌科技 | 选矿设备-新型重选设备-金属矿尾矿重选-青州冠诚重工机械有限公司 | 会议会展活动拍摄_年会庆典演出跟拍_摄影摄像直播-艾木传媒 | 山东钢格板|栅格板生产厂家供应商-日照森亿钢格板有限公司 | 广州展台特装搭建商|特装展位设计搭建|展会特装搭建|特装展台制作设计|展览特装公司 | 木材烘干机,木炭烘干机,纸管/佛香烘干设备-河南蓝天机械制造有限公司 | 水性绝缘漆_凡立水_绝缘漆树脂_环保绝缘漆-深圳维特利环保材料有限公司 | 上海租车公司_上海包车_奔驰租赁_上海商务租车_上海谐焕租车 | 黄石东方妇产医院_黄石妇科医院哪家好_黄石无痛人流医院 | 南汇8424西瓜_南汇玉菇甜瓜-南汇水蜜桃价格 | 活性炭-果壳木质煤质柱状粉状蜂窝活性炭厂家价格多少钱 | 电动高尔夫球车|电动观光车|电动巡逻车|电动越野车厂家-绿友机械集团股份有限公司 | 不锈钢轴流风机,不锈钢电机-许昌光维防爆电机有限公司(原许昌光维特种电机技术有限公司) | 集菌仪_智能集菌仪_全封闭集菌仪_无菌检查集菌仪厂家-那艾 |