程序员写Python时的5个坏习惯,你有几条?


Posted in Python onNovember 26, 2018

很多文章都有介绍怎么写好 Python,我今天呢,相反,说说写代码时的几个坏习惯。有的习惯会让 Bug 变得隐蔽难以追踪,当然,也有的并没有错误,只是个人觉得不够优雅。

注意:示例代码在 Python 3.6 环境下编写

1 用列表作函数的默认参数

看下面这个例子

def func(a, b=[]): 
   b.append(a) 
   print(f'a: {a}') 
   print(f'b: {b}') 
 func(1) 
 func(2)

正常我们期望的结果应该是这样的

a: 1 
  b: [1] 
  a: 2 
  b: [2]

但当我们执行代码后,只会得到这样的结果

a: 1 
  b: [1] 
  a: 2 
  b: [1, 2]

与预期不一致。为什么呢?因为 Python 列表是可变对象,而且函数传参又是传的引用,所以当第二次调用 func 方法前,b 中已经有了元素 1,调用后 b 最终有两个元素 1 和 2。

示例中 func 方法比较简单,当发现问题的时候简单看下就能找到根源。但是,如果是在一个比较复杂的方法里面,你有可能会粗心的忽略这一点,从而会碰到一些莫名其妙的问题。

所以,当我们要为函数设置默认参数的时候,不要使用可变对象。

上面的代码改成这样就 OK 了

def func(a, b=None): 
   if b is None: 
     b = [] 
   b.append(a) 
   print(f'a: {a}') 
   print(f'b: {b}')

执行后得到预期结果

a: 1 
  b: [1] 
  a: 2 
  b: [2]

2 文件操作

很多刚接触 Python 的伙伴做文件操作的时候很容易写类似的代码

file = open('file_name') 
  try: 
    for line in file: 
      print(line) 
  finally: 
    file.close()

这没有问题,不过文件资源我们没有必要手动去维护,像关闭这样的操作交给上下文管理器做就好。

with open('file_name') as file: 
    for line in file: 
      print(line)

这样看起来不是清爽很多。

3 捕获所有异常

try: 
    pass # 做一些操作 
  except Exception as e: 
    print(f'Exception {e}')

就像上面一样,有时我们为了能够快速的完成功能,很容易不管三七二十一,就捕获 Exception 异常。这可能会捕捉到键盘中断(KeyboardInterrupt)(CTRL + C)或断言错误(AsstionError)等异常。捕获不确定的异常,有时也会让我们的程序出现莫名其妙的问题,我们应该避免这样做。

准确的做法是根据上下文捕获 ValueError 、AttributeError 、TypeError 等比较具体的异常,然后做适当的错误处理,比如打印日志等。

4 忽略 Python 的 for...else 语法

开发中我们很容易碰到类似的需求,在一个列表中,确定某个特定的元素是否存在。比如,下面的代码便是确定列表中有没有奇数存在

numbers = [1, 2, 3, 4, 5] 
 is_odd_exist = False 
 for n in numbers: 
   if n % 2 == 1: 
     is_odd_exist = True 
     break 
 if is_odd_exist: 
   print('Odd exist') 
 else: 
   print('Odd not exist')

这里,我们使用了一个标识 is_odd_exist,默认为 False。当找到奇数时,将其置为 True,然后跳出循环。这样写并没有问题,但是我们可以换种方式

numbers = [1, 2, 3, 4, 5] 
  for n in numbers: 
    if n % 2 == 1: 
      print('Odd exist') 
      break 
  else: 
    print('Odd not exist')

先介绍下 Python 的 for...else 语法,当 for 循环是正常结束时(即不是通过 break 跳出结束的),会执行 else 中的语句。

这里,我们使用了相对于其他语言如 C、PHP 等不同的一种方式,完成了相同的功能,看起来代码也简洁了不少。

5 使用键遍历字典

初学 Python 的伙伴,可能容易写出这样的代码

member = {'name': 'xiaoming', 
       'age': 18, 
       'mobile': '18312341234'} 
  for key in member: 
    print(f'{key}: {member[key]}')

同样,这也是没有问题的,但看起来并不直观。字典遍历的时候,其实可以直接取出键值信息,像这样

member = {'name': 'xiaoming', 
      'age': 18, 
      'mobile': '18312341234'} 
 for key, val in member.items(): 
   print(f'{key}: {val}')

这样的话,看起来要明了一些。

总结

以上所述是小编给大家介绍的程序员写Python时的5个坏习惯,你有几条?希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Python 相关文章推荐
Python抓取淘宝下拉框关键词的方法
Jul 08 Python
编写Python爬虫抓取暴走漫画上gif图片的实例分享
Apr 20 Python
浅谈function(函数)中的动态参数
Apr 30 Python
解决PySide+Python子线程更新UI线程的问题
Jan 11 Python
TensorFlow实现简单的CNN的方法
Jul 18 Python
python3 深浅copy对比详解
Aug 12 Python
pytorch 实现在一个优化器中设置多个网络参数的例子
Feb 20 Python
Django更新models数据库结构步骤
Apr 01 Python
在python image 中实现安装中文字体
May 16 Python
Django如何使用asyncio协程和ThreadPoolExecutor多线程
Oct 12 Python
详解Open Folder as PyCharm Project怎么添加的方法
Dec 29 Python
Python基于opencv的简单图像轮廓形状识别(全网最简单最少代码)
Jan 28 Python
Django2.1.3 中间件使用详解
Nov 26 #Python
django+echart绘制曲线图的方法示例
Nov 26 #Python
详解配置Django的Celery异步之路踩坑
Nov 25 #Python
利用Python如何实现一个小说网站雏形
Nov 23 #Python
Python + selenium + requests实现12306全自动抢票及验证码破解加自动点击功能
Nov 23 #Python
python+selenium实现自动抢票功能实例代码
Nov 23 #Python
3分钟学会一个Python小技巧
Nov 23 #Python
You might like
php简单浏览目录内容的实现代码
2013/06/07 PHP
微信小程序 消息推送php服务器验证实例详解
2017/03/30 PHP
PHP将整数数字转换为罗马数字实例分享
2019/03/17 PHP
flexigrid 类似ext grid的JS表格代码
2010/07/17 Javascript
jquery getScript动态加载JS方法改进详解
2012/11/15 Javascript
JS网页在线获取鼠标坐标值的方法
2015/02/28 Javascript
javascript实现表格增删改操作实例详解
2015/05/15 Javascript
javaScript中push函数用法实例分析
2015/06/08 Javascript
移除AngularJS下URL中的#字符的方法
2015/06/19 Javascript
五种js判断是否为整数类型方式
2015/12/03 Javascript
JavaScript实现的微信二维码图片生成器的示例
2016/10/26 Javascript
jQuery实现用户信息表格的添加和删除功能
2017/09/12 jQuery
浅析Vue自定义组件的v-model
2017/11/26 Javascript
VueJS 组件参数名命名与组件属性转化问题
2018/12/03 Javascript
JS函数动态传递参数的方法分析【基于arguments对象】
2019/06/05 Javascript
百度小程序自定义通用toast组件
2019/07/17 Javascript
Vue退出登录时清空缓存的实现
2019/11/12 Javascript
React冒泡和阻止冒泡的应用详解
2020/08/18 Javascript
jQuery实现本地存储
2020/12/22 jQuery
python中安装模块包版本冲突问题的解决
2017/05/02 Python
python 画二维、三维点之间的线段实现方法
2019/07/07 Python
Python画图实现同一结点多个柱状图的示例
2019/07/07 Python
keras CNN卷积核可视化,热度图教程
2020/06/22 Python
可能这些是你想要的H5软键盘兼容方案(小结)
2019/04/23 HTML / CSS
美国内衣品牌:Leonisa
2016/08/14 全球购物
澳洲Chemist Direct药房中文网:澳洲大型线上直邮药房
2019/11/04 全球购物
双立人加拿大官网:Zwilling加拿大
2020/08/10 全球购物
PHP如何自定义函数
2016/09/16 面试题
春节活动策划方案
2014/01/24 职场文书
办公室综合文员岗位职责范本
2014/02/13 职场文书
财务管理专业自荐书
2014/09/02 职场文书
房产公证书格式
2015/01/26 职场文书
宪法宣传标语100条
2019/10/15 职场文书
php 解析非标准json、非规范json
2021/04/01 PHP
详解overflow:hidden的作用(溢出隐藏、清除浮动、解决外边距塌陷)
2021/07/01 HTML / CSS
js 数组 fill() 填充方法
2021/11/02 Javascript