愚形,是围棋的专业术语,凡是效率低下且不美观的棋形,统称为愚形。比如空三角和团子,就是典型的愚形。低水平棋手经常会在无意中走出愚形,而那些高手平棋手,尽管在生死存亡的危机时刻也会用愚形求生或者逃命,但在正常局面下他们是不会走出愚形的。在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代码中的三大常见“愚形”,你中招了吗?相关推荐

  1. Python代码中的数学之美:从自由落体到爬虫悖论,十分钟开启数学思维

    数学思维,就是用数学的方式去解决问题,就象吃饭用筷子.喝水用杯子一样,自然而然又理所当然.数学思维并非知识的积累,而是一种由特定思维习惯蕴育而成的能力--这种特定习惯的养成,往往是从解决看似简单的问题 ...

  2. mpython 直接访问_如何从python代码中直接访问Android的Service

    在Kivy中,通过pyjnius扩展可以间接调用Java代码,而pyjnius利用的是Java的反射机制.但是在Python对象和Java对象中转来转去总让人感觉到十分别扭.好在android提供了b ...

  3. python代码中添加环境变量

    比如命令行需要: export MASTER_PORT=5678 在python代码中就是: import osos.environ['MASTER_PORT'] = '5678'

  4. python另存为excel_为什么不能从python代码中“另存为”Excel文件?

    我有一条蟒蛇 ExcelDocument 类,它为读取/写入/格式化Excel文件提供了基本的方便方法,而我在看似简单的Python代码中遇到了一个奇怪的错误.我有一个储蓄和 saveAs 方法: d ...

  5. 在python代码中调用vba宏的四种方法

    在python代码中调用vba宏 工作以python为主体,但是遇到了一些word操作的需求(详见上一篇),这个需求用word自带的功能会很容易实现,于是就想着能不能用python调用宏来处理. 网上 ...

  6. python代码中疯狂print影响python性能吗?print是io吗?结论是做代码性能测试千万不要疯狂print,否则结果严重不准确,性能大幅下降。...

    很多人做性能测试,吧print打开,吧log调到debug级别并使用了streamhandler,那就会疯狂打印到控制台. 打印控制台会影响代码性能吗?这是毫无疑问的,python print会严重影 ...

  7. python强制用什么作为语句缩进符号_python从入门到放弃 第二天 谈谈python代码中的冒号和缩进...

    如同格子衬衫一样规整的源代码书写层次,是一个优秀的码农必备的编程习惯.python的作者无意就是这样一个人. python是用冒号(:)和强制缩进作为代码层次来划分代码组的.这是一个很小的知识点,但是 ...

  8. Python代码中的if __name__ == ‘__main__‘的作用是什么?

    要搞清楚这个问题,要知道以py作为后缀的Python代码文件,有两种使用方式,第一种方式是直接运行,另一种方式是作为模块被别的py文件导入. 当采用第一种方式直接运行自身时,__name__的值为__ ...

  9. 【NLP】一行Python代码中自动化文本处理

    作者|Satyam Kumar 编译|VK 来源|Towards Data Science 自然语言处理(NLP)是人工智能的一个子领域,涉及计算机与自然语言之间的交互.它围绕着如何训练一个能够理解和 ...

最新文章

  1. 04 Java面试题之数组
  2. 关于自动驾驶汽车的7大误解
  3. PHP菜刀工具WebHandler
  4. [转]C++结构体|类 内存对齐详解
  5. native react 折线图_react native中使用echarts
  6. algorithm -- 选择排序
  7. VS 2005竟然会突然失踪
  8. 像QQ一样输入表情图像
  9. Android NDK开发之旅25 NDK 模仿QQ变声特效
  10. extentreports报告插件与testng集成(二)
  11. seaborn 绘图sns.relplot
  12. 阶段5 3.微服务项目【学成在线】_day04 页面静态化_23-页面预览-页面预览开发
  13. Unity 游戏资源更新之——AB包
  14. Django Django文档
  15. systemverilog中的类型转换$cast
  16. oracle 菜单不见了,开始菜单不见了怎么办 开始菜单不见了解决方法【详解】
  17. 即席查询-KylinPresto
  18. ubuntu 百度云上传文件
  19. Word中使用正则表达式进行查找和替换(高效进行文字处理)
  20. Android刮刮卡的实现

热门文章

  1. Python自定义豆瓣电影种类,排行,点评的爬取与存储(高阶上)
  2. python—networkx:画随机几何图,找出中心节点并按路径长度染色
  3. 再高贵的打工人都得在体检报告前低下高贵的头颅
  4. Numa,我的CS学习之路
  5. 你必须知道的89个操作系统核心概念
  6. 专用集成电路 -- 反相器
  7. 二台电脑之间数据库文件进行备份
  8. 朱晔的互联网架构实践心得S2E2:写业务代码最容易掉的8种坑
  9. 升级safari 12版本,easyconnectplugin插件等不能使用解决办法
  10. 统计各个部门对应员工涨幅的次数总和,给出部门编码dept_no、部门名称dept_name以及次数sum