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(无返回)。
Python代码中的三大常见“愚形”,你中招了吗?相关推荐
- Python代码中的数学之美:从自由落体到爬虫悖论,十分钟开启数学思维
数学思维,就是用数学的方式去解决问题,就象吃饭用筷子.喝水用杯子一样,自然而然又理所当然.数学思维并非知识的积累,而是一种由特定思维习惯蕴育而成的能力--这种特定习惯的养成,往往是从解决看似简单的问题 ...
- mpython 直接访问_如何从python代码中直接访问Android的Service
在Kivy中,通过pyjnius扩展可以间接调用Java代码,而pyjnius利用的是Java的反射机制.但是在Python对象和Java对象中转来转去总让人感觉到十分别扭.好在android提供了b ...
- python代码中添加环境变量
比如命令行需要: export MASTER_PORT=5678 在python代码中就是: import osos.environ['MASTER_PORT'] = '5678'
- python另存为excel_为什么不能从python代码中“另存为”Excel文件?
我有一条蟒蛇 ExcelDocument 类,它为读取/写入/格式化Excel文件提供了基本的方便方法,而我在看似简单的Python代码中遇到了一个奇怪的错误.我有一个储蓄和 saveAs 方法: d ...
- 在python代码中调用vba宏的四种方法
在python代码中调用vba宏 工作以python为主体,但是遇到了一些word操作的需求(详见上一篇),这个需求用word自带的功能会很容易实现,于是就想着能不能用python调用宏来处理. 网上 ...
- python代码中疯狂print影响python性能吗?print是io吗?结论是做代码性能测试千万不要疯狂print,否则结果严重不准确,性能大幅下降。...
很多人做性能测试,吧print打开,吧log调到debug级别并使用了streamhandler,那就会疯狂打印到控制台. 打印控制台会影响代码性能吗?这是毫无疑问的,python print会严重影 ...
- python强制用什么作为语句缩进符号_python从入门到放弃 第二天 谈谈python代码中的冒号和缩进...
如同格子衬衫一样规整的源代码书写层次,是一个优秀的码农必备的编程习惯.python的作者无意就是这样一个人. python是用冒号(:)和强制缩进作为代码层次来划分代码组的.这是一个很小的知识点,但是 ...
- Python代码中的if __name__ == ‘__main__‘的作用是什么?
要搞清楚这个问题,要知道以py作为后缀的Python代码文件,有两种使用方式,第一种方式是直接运行,另一种方式是作为模块被别的py文件导入. 当采用第一种方式直接运行自身时,__name__的值为__ ...
- 【NLP】一行Python代码中自动化文本处理
作者|Satyam Kumar 编译|VK 来源|Towards Data Science 自然语言处理(NLP)是人工智能的一个子领域,涉及计算机与自然语言之间的交互.它围绕着如何训练一个能够理解和 ...
最新文章
- 04 Java面试题之数组
- 关于自动驾驶汽车的7大误解
- PHP菜刀工具WebHandler
- [转]C++结构体|类 内存对齐详解
- native react 折线图_react native中使用echarts
- algorithm -- 选择排序
- VS 2005竟然会突然失踪
- 像QQ一样输入表情图像
- Android NDK开发之旅25 NDK 模仿QQ变声特效
- extentreports报告插件与testng集成(二)
- seaborn 绘图sns.relplot
- 阶段5 3.微服务项目【学成在线】_day04 页面静态化_23-页面预览-页面预览开发
- Unity 游戏资源更新之——AB包
- Django Django文档
- systemverilog中的类型转换$cast
- oracle 菜单不见了,开始菜单不见了怎么办 开始菜单不见了解决方法【详解】
- 即席查询-KylinPresto
- ubuntu 百度云上传文件
- Word中使用正则表达式进行查找和替换(高效进行文字处理)
- Android刮刮卡的实现