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

您的位置:首頁技術文章
文章詳情頁

Python如何定義有默認參數的函數

瀏覽:47日期:2022-07-14 15:55:13

問題

你想定義一個函數或者方法,它的一個或多個參數是可選的并且有一個默認值。

解決方案

定義一個有可選參數的函數是非常簡單的,直接在函數定義中給參數指定一個默認值,并放到參數列表最后就行了。例如:

def spam(a, b=42): print(a, b)spam(1) # Ok. a=1, b=42spam(1, 2) # Ok. a=1, b=2

如果默認參數是一個可修改的容器比如一個列表、集合或者字典,可以使用None作為默認值,就像下面這樣:

# Using a list as a default valuedef spam(a, b=None): if b is None: b = [] ...

如果你并不想提供一個默認值,而是想僅僅測試下某個默認參數是不是有傳遞進來,可以像下面這樣寫:

_no_value = object()def spam(a, b=_no_value): if b is _no_value: print(’No b value supplied’) ...

我們測試下這個函數:

>>> spam(1)No b value supplied>>> spam(1, 2) # b = 2>>> spam(1, None) # b = None>>>

仔細觀察可以發現到傳遞一個None值和不傳值兩種情況是有差別的。

討論

定義帶默認值參數的函數是很簡單的,但絕不僅僅只是這個,還有一些東西在這里也深入討論下。

首先,默認參數的值僅僅在函數定義的時候賦值一次。試著運行下面這個例子:

>>> x = 42>>> def spam(a, b=x):... print(a, b)...>>> spam(1)1 42>>> x = 23 # Has no effect>>> spam(1)1 42>>>

注意到當我們改變x的值的時候對默認參數值并沒有影響,這是因為在函數定義的時候就已經確定了它的默認值了。

其次,默認參數的值應該是不可變的對象,比如None、True、False、數字或字符串。 特別的,千萬不要像下面這樣寫代碼:

def spam(a, b=[]): # NO! ...

如果你這么做了,當默認值在其他地方被修改后你將會遇到各種麻煩。這些修改會影響到下次調用這個函數時的默認值。比如:

>>> def spam(a, b=[]):... print(b)... return b...>>> x = spam(1)>>> x[]>>> x.append(99)>>> x.append(’Yow!’)>>> x[99, ’Yow!’]>>> spam(1) # Modified list gets returned![99, ’Yow!’]>>>

這種結果應該不是你想要的。為了避免這種情況的發生,最好是將默認值設為None, 然后在函數里面檢查它,前面的例子就是這樣做的。

在測試None值時使用 is 操作符是很重要的,也是這種方案的關鍵點。 有時候大家會犯下下面這樣的錯誤:

def spam(a, b=None): if not b: # NO! Use ’b is None’ instead b = [] ...

這么寫的問題在于盡管None值確實是被當成False, 但是還有其他的對象(比如長度為0的字符串、列表、元組、字典等)都會被當做False。 因此,上面的代碼會誤將一些其他輸入也當成是沒有輸入。比如:

>>> spam(1) # OK>>> x = []>>> spam(1, x) # Silent error. x value overwritten by default>>> spam(1, 0) # Silent error. 0 ignored>>> spam(1, ’’) # Silent error. ’’ ignored>>>

最后一個問題比較微妙,那就是一個函數需要測試某個可選參數是否被使用者傳遞進來。 這時候需要小心的是你不能用某個默認值比如None、 0或者False值來測試用戶提供的值(因為這些值都是合法的值,是可能被用戶傳遞進來的)。 因此,你需要其他的解決方案了。

為了解決這個問題,你可以創建一個獨一無二的私有對象實例,就像上面的_no_value變量那樣。 在函數里面,你可以通過檢查被傳遞參數值跟這個實例是否一樣來判斷。 這里的思路是用戶不可能去傳遞這個_no_value實例作為輸入。 因此,這里通過檢查這個值就能確定某個參數是否被傳遞進來了。

這里對 object() 的使用看上去有點不太常見。object 是python中所有類的基類。 你可以創建 object 類的實例,但是這些實例沒什么實際用處,因為它并沒有任何有用的方法, 也沒有任何實例數據(因為它沒有任何的實例字典,你甚至都不能設置任何屬性值)。 你唯一能做的就是測試同一性。這個剛好符合我的要求,因為我在函數中就只是需要一個同一性的測試而已。

以上就是Python如何定義有默認參數的函數的詳細內容,更多關于Python定義有默認參數的函數的資料請關注好吧啦網其它相關文章!

標簽: Python 編程
相關文章:
主站蜘蛛池模板: 氮化镓芯片-碳化硅二极管 - 华燊泰半导体 | 超细|超微气流粉碎机|气流磨|气流分级机|粉体改性机|磨粉机|粉碎设备-山东埃尔派粉体科技 | 定做大型恒温循环水浴槽-工业用不锈钢恒温水箱-大容量低温恒温水槽-常州精达仪器 | 背压阀|减压器|不锈钢减压器|减压阀|卫生级背压阀|单向阀|背压阀厂家-上海沃原自控阀门有限公司 本安接线盒-本安电路用接线盒-本安分线盒-矿用电话接线盒-JHH生产厂家-宁波龙亿电子科技有限公司 | 酒糟烘干机-豆渣烘干机-薯渣烘干机-糟渣烘干设备厂家-焦作市真节能环保设备科技有限公司 | 德国BOSCH电磁阀-德国HERION电磁阀-JOUCOMATIC电磁阀|乾拓百科 | 电动卫生级调节阀,电动防爆球阀,电动软密封蝶阀,气动高压球阀,气动对夹蝶阀,气动V型调节球阀-上海川沪阀门有限公司 | 上海三信|ph计|酸度计|电导率仪-艾科仪器 | 旋振筛_不锈钢旋振筛_气旋筛_旋振筛厂家—新乡市大汉振动机械有限公司 | 广州市哲铭油墨涂料有限公司,水性漆生产研发基地 | 双杰天平-国产双杰电子天平-美国双杰-常熟双杰仪器 | 猎头招聘_深圳猎头公司_知名猎头公司 | 合肥花魁情感婚姻咨询中心_挽回爱情_修复婚姻_恋爱指南 | 烘干设备-热泵烘干机_广东雄贵能源设备有限公司 | 众品家具网-家具品牌招商_家具代理加盟_家具门户的首选网络媒体。 | 楼承板-钢筋楼承板-闭口楼承板-无锡优贝斯楼承板厂 | 远程会诊系统-手术示教系统【林之硕】医院远程医疗平台 | 健康管理师报考条件,考试时间,报名入口—首页 | 桨叶搅拌机_螺旋挤压/方盒旋切造粒机厂家-无锡市鸿诚输送机械有限公司 | 层流手术室净化装修-检验科ICU改造施工-华锐净化工程-特殊科室建设厂家 | 消防设施操作员考试报名时间,报名入口,报考条件 | 密集架|电动密集架|移动密集架|黑龙江档案密集架-大量现货厂家销售 | 宏源科技-房地产售楼系统|线上开盘系统|售楼管理系统|线上开盘软件 | 低压载波电能表-单相导轨式电能表-华邦电力科技股份有限公司-智能物联网综合管理平台 | 诺冠气动元件,诺冠电磁阀,海隆防爆阀,norgren气缸-山东锦隆自动化科技有限公司 | 不锈钢螺丝 - 六角螺丝厂家 - 不锈钢紧固件 - 万千紧固件--紧固件一站式采购 | 广东风淋室_广东风淋室厂家_广东风淋室价格_广州开源_传递窗_FFU-广州开源净化科技有限公司 | 交变/复合盐雾试验箱-高低温冲击试验箱_安奈设备产品供应杭州/江苏南京/安徽马鞍山合肥等全国各地 | 运动木地板厂家,篮球场木地板品牌,体育场馆木地板安装 - 欧氏运动地板 | 爱德华真空泵油/罗茨泵维修,爱发科-比其尔产品供应东莞/杭州/上海等全国各地 | 上海单片机培训|重庆曙海培训分支机构—CortexM3+uC/OS培训班,北京linux培训,Windows驱动开发培训|上海IC版图设计,西安linux培训,北京汽车电子EMC培训,ARM培训,MTK培训,Android培训 | 许昌奥仕达自动化设备有限公司| 今日娱乐圈——影视剧集_八卦娱乐_明星八卦_最新娱乐八卦新闻 | 智能家居全屋智能系统多少钱一套-小米全套价格、装修方案 | 电动葫芦|防爆钢丝绳电动葫芦|手拉葫芦-保定大力起重葫芦有限公司 | 耐磨陶瓷管道_除渣器厂家-淄博浩瀚陶瓷科技有限公司 | 防爆电机生产厂家,YBK3电动机,YBX3系列防爆电机,YBX4节防爆电机--河南省南洋防爆电机有限公司 | 行吊_电动单梁起重机_双梁起重机_合肥起重机_厂家_合肥市神雕起重机械有限公司 | 不锈钢散热器,冷却翅片管散热器厂家-无锡市烨晟化工装备科技有限公司 | 焊接烟尘净化器__焊烟除尘设备_打磨工作台_喷漆废气治理设备 -催化燃烧设备 _天津路博蓝天环保科技有限公司 | 蓝莓施肥机,智能施肥机,自动施肥机,水肥一体化项目,水肥一体机厂家,小型施肥机,圣大节水,滴灌施工方案,山东圣大节水科技有限公司官网17864474793 |