Python代码中的三大常见“愚形”,你中招了吗?

举报
天元浪子 发表于 2021/07/26 23:18:38 2021/07/26
【摘要】 愚形,是围棋的专业术语,凡是效率低下且不美观的棋形,统称为愚形。比如空三角和团子,就是典型的愚形。低水平棋手经常会在无意中走出愚形,而那些高手平棋手,尽管在生死存亡的危机时刻也会用愚形求生或者逃命,但在正常局面下他们是不会走出愚形的。在Python代码中,初学者也会写出一些类似围棋愚形的写法,不仅臃肿繁琐,而且效率低下。本文总结了Python代码中的三大常见“愚形”,快...

愚形,是围棋的专业术语,凡是效率低下且不美观的棋形,统称为愚形。比如空三角和团子,就是典型的愚形。低水平棋手经常会在无意中走出愚形,而那些高手平棋手,尽管在生死存亡的危机时刻也会用愚形求生或者逃命,但在正常局面下他们是不会走出愚形的。在Python代码中,初学者也会写出一些类似围棋愚形的写法,不仅臃肿繁琐,而且效率低下。本文总结了Python代码中的三大常见“愚形”,快来看看,你中招了吗?
在这里插入图片描述

1. 不会使用一颗星(*)解包

列表 grade 是语文、数学、英语等三门课程的成绩,要把成绩格式化为“语文90,数学95,英语93”样式的字符串,不管是习惯用C语言风格的格式化输出,还是习惯用format函数,大概很多人都会这样写吧:

>>> grade = [90, 95, 93]
>>> print("语文%d,数学%d,英语%d"%(grade[0], grade[1], grade[2]))
语文90,数学95,英语93
>>> print("语文{},数学{},英语{}".format(grade[0], grade[1], grade[2]))
语文90,数学95,英语93

  
 
  • 1
  • 2
  • 3
  • 4
  • 5

事实上,上面的两种写法都是典型的“愚形”。正确的写法应该是用一颗星(*)解包列表:

>>> print("语文%d,数学%d,英语%d"%(*grade,))
语文90,数学95,英语93
>>> print("语文{},数学{},英语{}".format(*grade,))
语文90,数学95,英语93

  
 
  • 1
  • 2
  • 3
  • 4

如果再加上一个变量,也是同样的写法:

>>> name = '阿美'
>>> grade = [90, 95, 93]
>>> print("%s的成绩:语文%d,数学%d,英语%d"%(name, *grade))
阿美的成绩:语文90,数学95,英语93
>>> print("{}的成绩:语文{},数学{},英语{}".format(name, *grade))
阿美的成绩:语文90,数学95,英语93

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

2. 不会使用enumerate()函数

遍历列表是Python代码中最常见的结构:

>>> grade = [90, 95, 93]
>>> for g in grade:
	print(g)
	
90
95
93

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

如果遍历列表时,循环体内同时用到了元素及其索引,下面的写法似乎是自然而然的:

>>> grade = [90, 95, 93]
>>> for i in range(len(grade)):
	print(i, grade[i])
	
0 90
1 95
2 93

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

然而,这也是“愚形”。漂亮的写法是使用枚举函数:

>>> grade = [90, 95, 93]
>>> for i, g in enumerate(grade):
	print(i, g)
	
0 90
1 95
2 93

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

使用枚举函数enumerate(),返回的是一个迭代器,类似于range()函数,因此你无需担心效率问题。

3. 忽略了字典的get()方法

字典的使用,似乎从来就不存在问题。但是,当我们试图访问一个不存在的键时,就会发生意外:

>>> grade = dict([('语文',90), ('数学',95), ('英语',93)])
>>> 语文 = grade['语文']
>>> 物理 = grade['物理']
Traceback (most recent call last):
  File "<pyshell#44>", line 1, in <module> 物理 = grade['物理']
KeyError: '物理'

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

为了避免程序抛出异常,很多人会小心翼翼地把代码写成这样:

>>> if '物理' in grade:
	物理 = grade['物理']
else:
	物理 = 0

  
 
  • 1
  • 2
  • 3
  • 4

或者使用三元表达式:

>> 物理 = grade['物理'] if '物理' in grade else 0

  
 
  • 1

遗憾的是,上面两种写法都是“愚形”,因为字典对象本身自带一个更简洁优雅的get()方法:

>>> 物理 = grade.get('物理', 0)

  
 
  • 1

get()的第2个参数,表示键不存在时函数返回的值。如果省略该参数,键不存在时函数返回None(无返回)。

文章来源: xufive.blog.csdn.net,作者:天元浪子,版权归原作者所有,如需转载,请联系作者。

原文链接:xufive.blog.csdn.net/article/details/104894182

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。