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

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

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

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

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

2. 不会使用enumerate()函数

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

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

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

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

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

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

使用枚举函数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: '物理'

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

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

或者使用三元表达式:

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

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

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

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

发布了98 篇原创文章 · 获赞 1万+ · 访问量 149万+

猜你喜欢

转载自blog.csdn.net/xufive/article/details/104894182