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

很多文章都有介绍怎么写好 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个坏习惯,你有几条?希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!

(0)

相关推荐

  • Python入门篇之编程习惯与特点

    1.代码风格 在Python中,每行程序以换行符代表结束,如果一行程序太长的话,可以用"\"符号扩展到下一行.在python中以三引号(""")括起来的字符串,列表,元组和字典都能跨行使用.并且以小括号(...).中括号[...]和大括号{...}包围的代码不用加"\"符也可扩展到多行. 在Python中是以缩进来区分程序功能块的,缩进的长度不受限制,但就一个功能块来讲,最好保持一致的缩进量. 如果一行中有多条语句,语句间要以分号(;)

  • 符合语言习惯的 Python 优雅编程技巧【推荐】

    Python最大的优点之一就是语法简洁,好的代码就像伪代码一样,干净.整洁.一目了然.要写出 Pythonic(优雅的.地道的.整洁的)代码,需要多看多学大牛们写的代码,github 上有很多非常优秀的源代码值得阅读,比如:requests.flask.tornado,下面列举一些常见的Pythonic写法. 0. 程序必须先让人读懂,然后才能让计算机执行. "Programs must be written for people to read, and only incidentally f

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

    很多文章都有介绍怎么写好 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:

  • vscode写python时的代码错误提醒和自动格式化的方法

    python的代码错误检查通常用pep8.pylint和flake8,自动格式化代码通常用autopep8.yapf.black.这些工具均可以利用pip进行安装,这里介绍传统的利用pip.exe安装和在VScode中安装两种方式. [温馨提醒] 要使用flake8或要想flake8等工具起作用,前提是必须把settings.json文件中的"python.linting.enabled"值设为"true",否则即使安装了这些工具,也起不到代码的错误提醒. [传统安

  • 酷! 程序员用Python带你玩转冲顶大会

    2018年1月3日,王思聪被迫动用自己的微博,为一个诞生不到10天的App打了广告,"每天我都发奖金,今晚9点就发10万".对他而言,这天的微博并非生日宴会,而是战场.王思聪的一则微博开启了"全民竞答"类APP的爆红之路. 一时间,直播巨头们都跟上"王校长"的节奏,"冲顶大会"之外,映客旗下的"芝士超人".今日头条旗下的"百万英雄"和花椒直播旗下的"百万作战"纷纷亮相

  • Java 程序员容易犯的10个SQL错误

    Java程序员编程时需要混合面向对象思维和一般命令式编程的方法,能否完美的将两者结合起来完全得依靠编程人员的水准: 技能(任何人都能容易学会命令式编程) 模式(有些人用"模式-模式",举个例子,模式可以应用到任何地方,而且都可以归为某一类模式) 心境(首先,要写个好的面向对象程序是比命令式程序难的多,你得花费一些功夫) 但当Java程序员写SQL语句时,一切都不一样了.SQL是说明性语言而非面向对象或是命令式编程语言.在SQL中要写个查询语句是很简单的.但在Java里类似的语句却不容易

  • 程序员编程从初级到中级的10个秘诀

    这个观点很好,有关程序员如何从初级跃升到中级的信息极少.以下是为了实现这种转变需要你去做的10件事. 1.学习另一门语言 其实你学的是哪一门语言并没有关系,但是学习另一门语言(不管你已经了解多少种语言)将把你打造为更好的程序员.能学会一门与你日常使用的语言风格迥异的语言则更佳.打个比方,如果你是C#程序员,学习VB.NET或者Java对你的帮助就没有学习Ruby或者Groovy大. 我说"学另一门语言"的意思是要真正学会它.学习一门语言包括三个领域的知识:语法.内置操作符和库,以及&q

  • 新手程序员编程必不可少的工具

    对于程序员来说,编程是一个相当耗费时间和经历的过程,而在这个过程中,一个称手而高效的工具就显得非常重要. 加上近期有不少小伙伴在问一些方方面面的工具,所以今天就总结了一些新手编程能用上的工具一一介绍给小伙伴们,希望对大家的学习和工作有所帮助. 1.Notepad++ 老规矩,每次工具第一推荐,Notepad++是一套非常有特色的自由软件的纯文字编辑器.有完整的中文化接口及支持多国语言编写的功能(UTF8 技术).它的功能比 Windows 中的 Notepad(记事本)强大,十分适合当作编写电脑

  • 十个Python程序员易犯的错误

    常见错误1:错误地将表达式作为函数的默认参数 在Python中,我们可以为函数的某个参数设置默认值,使该参数成为可选参数.虽然这是一个很好的语言特性,但是当默认值是可变类型时,也会导致一些令人困惑的情况.我们来看看下面这个Python函数定义: >>> def foo(bar=[]): # bar是可选参数,如果没有提供bar的值,则默认为[], ... bar.append("baz") # 但是稍后我们会看到这行代码会出现问题. ... return bar Py

  • 每个程序员都应该学习使用Python或Ruby

    如果你是个学生,你应该会C,C++和Java.还会一些VB,或C#/.NET.多少你还可能开发过一些Web网页,你知道一些HTML,CSS和JavaScript知识.总体上说,我们很难发现会有学生显露出掌握超出这几种语言范围外的语言的才能.这真让人遗憾,因为还有很多种编程语言,它们能让你成为一个更好的程序员. 在这篇文章里,我将会告诉你,为什么你一定要学习Python或Ruby语言. 跟C/C++/Java相比 - Python/Ruby能让你用少的多的多的代码写出相同的程序.有人计算过,Pyt

  • 在Python程序员面试中被问的最多的10道题

    我们在为大家整Python程序员面试试题中,发现了一些被面试官问到的最多的一些问题,以下就是本篇内容: Python是个非常受欢迎的编程语言,随着近些年机器学习.云计算等技术的发展,Python的职位需求越来越高.下面我收集了10个Python面试官经常问的问题,供大家参考学习. 类继承 有如下的一段代码: class A(object): def show(self): print 'base show' class B(A): def show(self): print 'derived s

  • Python程序员面试题 你必须提前准备!(答案及解析)

    在发布<Python程序员面试,这些问题你必须提前准备!>一文后,应广大程序员朋友的强烈要求,小编就Python程序员面试必备问题整理了一份参考答案,希望能对准备换工作的程序员朋友有所帮助.如对答案有疑问,欢迎留言讨论. 小编将这些面试问题大致分为四类: 什么(what)?如何做(how)?说区别/谈优势(difference)以及实践操作(practice). What? 1. 什么是Python? Python是一种编程语言,它有对象.模块.线程.异常处理和自动内存管理.可以加入与其他语言

随机推荐