定义带有默认参数的函数

本文探讨了在Python中定义带有默认参数的函数时遇到的问题,特别是当默认值是可变容器如列表、集合或字典时。建议使用None作为默认值,并在函数内部检查。总结强调,不应直接在函数外部修改默认值,以免影响后续调用。推荐使用is操作符来检测None,避免误判其他假值。最后,提出用object()创建独特实例来检测用户是否提供了参数,以避免与合法参数混淆。
1.问题

想定义一个函数或者方法,其中一个或者多个参数是可选的并且带有默认值

2.解决方案

表面上定义一个带有可选默认参数的函数时非常简单的

In [1]: def func(a, b =1):
   ...:     return a + b
   ...:     

In [2]: func(1)
Out[2]: 2

In [3]: func(1,2)
Out[3]: 3

但如果默认值时可变容器的话,比如果列表、集合或者字典等,那么应该把None作为默认值。
代码如下:

In [4]: def func(a, b = None):
   ...:     if b is None: 
   ...:         b = []

如果不打算提供一个默认值,只是想编写代码来检测可选参数否被赋予了某个特定的值,那么可以采用下面的惯用手法

In [5]: _no_value = object()

In [6]: def func(a, b = _no_value):
   ...:     if b is _no_value:
   ...:         print("No b value supplied")
   
In [7]: func(1)  
No b value supplied

In [8]: func(1,2)  # b = 2

In [9]: func(1,None) # b = None
# 请仔细区分不传递任何值和传递None之间的额区别  
3.总结

给默认参数赋值的应该总是不可变的对象,比如None、True、False、数字或者字符串等。特别注意的是,绝对不要编写下面这样的代码
如果默认值在函数体外被修改了,那么这种修改将在之后的函数调用后对参数的默认值产生持续的影响

In [1]: def func(a, b =[]):
   ...:     return b
   ...:     

In [2]: x = func(1)

In [3]: x
Out[3]: []

In [4]: x.append(1)

In [5]: x.append("A")

In [6]: x
Out[6]: [1, 'A']

In [7]: func(1)  # 返回了之前修改的列表
Out[7]: [1, 'A']

这可能是很多人不期待的结果,要避免这种问题,最好使用解决方案中的做法,使用None作为默认值,并在函数体中曾家岩一个队默认值的检查

当检测默认值是否为None的时候,关键之处在于对is操作符的运用,有时候可能会犯下面这样的错误

In [1]: def func(a, b =None):
   ...:     if b == None:
   ...:         b = []
   ...: 

但是这里的问题在于,尽管None会被检测为False,但是还有其他许多的对象(比如空字符串、空列表、空元组、空字典)也会被检测为False,因此这种方法不可取


在函数检测视为可选参数提供了某个特定值(可以是任意值),这里最为棘手的是我们不能用None、0、Fasle当做默认自来检测用户是否提供了参数(因为这些值都是完全合法的参数,用户极有可能把他们当做参数)。要解决这个问题,可以利用object()来创建一个独特的私有实例,在函数中可以用这个特殊值来同用户提供的参数做相等性测试,以此判断是否输入了参数。

In [5]: object
Out[5]: object

In [6]: object()
Out[6]: <object at 0x6318f40>

这里用到的object()可能看起来很不常见.object作为Python中几乎所有对象的基类而存在.可以穿件object的实例,但是他没有任何值得注意的方法,也没有任何实例数据(因为底层缺少__dict__方法,我们甚至没有办法为他设置任何属性)。唯一可做的就是检测相等性,这也使得他可以作为特殊值来使用。

该银行系统平台集成了多项核心金融服务模块,旨在提升客户体验与操作效率。平台主要涵盖以下功能:1. 客户服务交互模块:支持即时通讯服务,使客户能够与银行服务专员进行实时对话,以解答各类疑问、处理反馈事项。2. 金融产品信息库:系统整合了多种投资工具(例如证券、债务凭证、集合投资计划等)的详细资料,涵盖产品分类、费用结构及风险评级,便于客户进行比较与选择。3. 财富管理产品维护:负责投资类产品的上架、内容修订、下架及全面信息公示,协助客户识别并认购符合自身需求的理财方案。4. 账户卡片事务处理:办理借记卡或信用卡的申办、遗失申报、补发申请、销户等操作流程,同时支持卡片基本资料的查阅与变更。5. 储蓄业务操作:支持定期储蓄与活期储蓄等存款服务的处理,包含资金存入、利息核算、到期结算以及提前赎回等操作。6. 交易流水管理:系统完整记录并维护账户涉及的所有资金往来明细,包括储蓄、提现、汇款、支付等记录,既便于客户查阅,也为银行内部审计提供依据。7. 现金支取服务:处理客户发起的取款申请,涵盖自助设备取款与柜面取款等多种渠道,保障资金安全、准确地交付给客户。8. 资金划转功能:实现不同账户之间的款项转移,包括本行内部转账及跨行汇款,支持即时到账与定时转账两种模式,确保转账过程既安全又高效。资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值