python 定义空list_Python优雅编程(四)

fffa63ac3353f06dc5d2f22397bcd22c.png

关于日常使用到的一些Python技巧,计划用五个章节完成分享,当前为第四个章节。

本章节主要介绍一下,在Python开发中遇到的一些隐藏的坑。从入门到放弃的血泪史,手动滑稽。

在函数参数中的默认值参数

将Python函数的某个参数设置为默认值,使得调用此函数时该参数可以成为一个可选参数。但这当这个默认值是可变对象(列表,字典)时,稍不注意容易踩坑。

例如,看如下两个函数。toutiao_dict()、toutiao_list()的函数定义:

f62b9badf5626dfd727233ed90f85923.png

每次在调用函数时,可能会认为当不对可选参数进行赋值时,它会被附默认的值。例如,在上面的toutiao_list()函数中,可能会认为重复调用此函数(不对可选参数赋值),这个函数会总是返回的username为['iTestOps'],那么我们尝试一下,两次重复调用该函数的时候使用默认参数,参数username会被置为[]、{}(即,一个空的可变对象),如下。

53fedd4029df62698b7d5780b4204b23.png

看下这么做的时候会输出什么,如下:

d91cf6015cd2680fcebf1b548732b314.png

为何重复调用toutiao_list()的时候,toutiao_list()函数总是在一个已经存在的列表后面添加我们的默认值'iTestOps',而不是每次都基于空的列表,返回['iTestOps']?

原因是Python函数中参数的默认值,仅在该函数定义的时候,被赋值一次。因此,只有当函数toutiao_list()第一次被定义的时候,才将参数username的默认值初始化到它的默认值(即一个空的列表)。当调用toutiao_list()的时候(不对可选参数赋值),会继续使用username最早初始化时的那个默认值列表。

可以参考以下解决方案

f35b216e1a9136bde582333598546876.png

此时的输出如下:

407fefa6c60985fb21749f3129bb516a.png

在异常处理时捕获多个异常

使用try / except进行异常处理时,希望同时捕获两个异常,如下:

d62e335afe267c383fdb4b65633a1583.png

输出如下,发现IndexError异常并没有被except语句捕捉到。

b900ab002879e53672ea6169db62d0b9.png

这里的坑在于except语句不会像“except ValueError,IndexError:”这样去接受多个异常。

并且,except异常可以带上参数,可作为输出的异常信息参数,在Python 2.x里面,其语法"except Exception, e",通过参数e输出对应的Exception异常信息。

因此,在上面的代码中,IndexError异常不会被except语句捕捉到;而当捕获ValueError异常时,其异常信息绑定在了IndexError的参数上。

在except语句中捕捉多个异常的正确做法是将所有需要捕捉的异常添加到一个元组(tuple)中,并作为第一个参数给except语句,示例如下。

13c74f478d8297173cea66e37ed11a4a.png

在遍历列表的同时修改列表

在不经意间,容易犯一些逻辑上的错误,比如遍历列表的同时又删除里面的元素,导致程序抛出异常,如下:

8a7e95f8acb415d8c3cca190e2dff9e3.png

输出如下:

824172f2f675d635027a8c4394603103.png

可以使用列表推导式避免这样的问题。

1dd14fe432ee99a8f0b4d0b631ecf80b.png

输出如下:

36e5e48b597faf7a39ea473b7398df1b.png

若对你有所帮助,欢迎大家评论、留言、关注,感谢支持!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值