愚形,是围棋的专业术语,凡是效率低下且不美观的棋形,统称为愚形。文总结了Python代码中的三大常见“愚形”,快来看看,你中招了吗?
- 不会使用一颗星(*)解包
列表 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
事实上,上面的两种写法都是典型的“愚形”。XM返佣正确的写法应该是用一颗星(*)解包列表:
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
- 不会使用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()函数,因此你无需担心效率问题。
- 忽略了字典的get()方法
字典的使用,似乎从来就不存在问题。但是,当我们试图访问一个不存在的键时,就会发生意外:
grade = dict([('语文',90), ('数学',95), ('英语',93)])
语文 = grade['语文']
物理 = grade['物理']
Traceback (most recent call last):
File "", line 1, in
物理 = grade['物理']
KeyError: '物理'
为了避免程序抛出异常,很多人会小心翼翼地把代码写成这样:
if '物理' in grade:
物理 = grade['物理']
else:
物理 = 0
或者使用三元表达式:
物理 = grade['物理'] if '物理' in grade else 0
1
遗憾的是,上面两种写法都是“愚形”,因为字典对象本身自带一个更简洁优雅的get()方法:
物理 = grade.get('物理', 0)
1
get()的第2个参数,表示键不存在时函数返回的值。如果省略该参数,键不存在时函数返回None(无返回)。
来源:51CTO
作者:专注地一哥
链接:https://blog.51cto.com/14511863/2479253