写出漂亮 Python 代码的 20条准则
日期:2021年11月18日
正文共:4029字5图
预计阅读时间:11分钟
来源:架构头条

1 Python 之禅?
import this,会出现由 Tim Peters 撰写的 19 条指导原则:优美胜于丑陋; 明了胜于晦涩; 简单胜于复杂; 复杂胜于晦涩; 扁平胜于嵌套; 间隔胜于紧凑; 可读性很重要; 特例不足以特殊到违背这些原则; 实用性胜过纯粹; 永远不要默默地忽视错误; 除非明确需要这样做; 面对模棱两可,拒绝猜测; 解决问题最直接的方法应该有一种,最好只有一种; 当然这是没法一蹴而就的,除非你是荷兰人; 做也许好过不做; 但不想就做还不如不做; 如果方案难以描述明白,那么一定是个糟糕的方案; 如果实现容易描述,那可能是个好方案; 命名空间是一种绝妙的理念,多加利用! 
2 优美胜于丑陋
or and和|| &&构建语义相同的表达式:# &&, ||if a == 0 && b == 1 || c == True:# and, orif a == 0 and b == 1 or c == True:# 这两个逻辑表达式在 Python 中是相同的# 从语义的角度来看,可以使用选择操作符来构造完全相同的表达式。
如何参照 PEP 8 编写漂亮的 Python 代码 https://realpython.com/python-pep8/ 优雅的 Python 与 PEP8 https://medium.com/@mariasurmenok/stylish-python-with-pep8-c3ca93531418 PEP-8 的陷阱 https://medium.com/@ian.reinert/the-pitfalls-of-pep-8-b6108b006ed9 
3 明了胜于晦涩
一般来说,避免使用以下名称: 太宽泛,如 my_list;太冗长,如 list_of_machine_learning_data_set;太模糊,如“1”、“I”、“o”、“O”。 包 / 模块名应该全部小写: 首选使用一个单词命名; 当需要使用多个单词时,使用下划线分割它们。 类名应遵循 UpperCaseCamelCase 规范 变量方法函数应该采用小写(如果需要,用下划线分割) 常量名必须全大写(如果需要,用下划线分割) 
4 简单胜于复杂
简单比复杂更难:你必须付出巨大艰辛,化繁为简。但这一切到最后都是值得的,因为一旦你做到了,你便能创造奇迹。——乔布斯 
enumerate()的内置函数简化这一任务。以下是一种不成熟的方法,然后是推荐方法:words = [ Hannibal , Hanny , Steeve ]# 不成熟的方法index = 0for word in words:print(index, word)index += 1# 推荐方法for index, word in enumerate(words):print(index, word)
zip()函数,该函数创建一个迭代器,对来自两个或多个迭代器的元素进行配对。你可以使用它来快速有效地解决常见的编程问题,比如创建字典。subjects = [ math , chemistry , biology , pyhsics ]grades = [ 100 , 83 , 90 , 92 ]grades_dict = dict(zip(subjects, grades))print(grades_dict)
5 复杂胜于晦涩
6 扁平胜于嵌套
module.class.subclass.function这样的东西——可读性不好。虽然在另一个子模块中构建子模块可能会减少代码行数,但我们不希望用户被不直观的语法所困扰。7 间隔胜于紧凑

8 可读性很重要
money = 10000000print("I earn", money, "dollars by writing on medium.")money = 10_000_000print(f"I earn {money} dollars by writing on medium.")
一个作家的风格不应该在他的思想和读者的思想间设置障碍。 
9 特例不足以特殊到违背这些原则
10 实用性胜过纯粹
11 永远不要默默地忽视错误
try:x = int(input("Please enter an Integer: "))except ValueError:print("Oops! This is not an Integer.")except Exception as err:print(err)else:print( You did it! Great job! )finally:print( ヽ(✿゚▽゚)ノ )# 1. 这段代码可能中断。# 2. 如果出现值错误就会触发。# 3. 处理值错误之外的错误。# 4. 如果没有触发错误就执行。# 5. 不管是否触发错误都执行。
12 除非明确需要这样做
13 面对模棱两可,拒绝猜测
重要的是要不断学习,享受挑战,容忍歧义。我们都不知道最终会怎样。——玛蒂娜·霍纳 
numpy模块时的一个简单错误:import numpy as npa = np.arange(5)print(a < 3)if a < 3:print( smaller than 3 )
ValueError: 具有多个元素的数组的真值不明确,请使用 a.any() 或 a.all() 
if语句不可能确定状态。消息中显示的内置函数.all() 和.any()用于代替 And/Or。import numpy as npa = np.array([True, True, True])b = np.array([False, True, True])c = np.array([False, False, False])print(a.all())print(a.any())print(b.all())print(b.any())print(c.all())print(c.any())
.all()仅在所有项都为True时才返回True,而.any()在有一项为True时就返回True。

你可以拖延,但时间不会,失去的时间一去不复返。——本杰明·富兰克林 
18 如果解决方案难以解释清楚,那一定很糟糕
19 如果实现容易描述,那可能是个好方案
20 命名空间是一种绝妙的理念,多加利用!
内置命名空间:可以在不创建自定义函数或导入模块(如 print()函数)的情况下调用。全局命名空间:当用户创建一个类或函数时,将创建一个全局命名空间。 局部命名空间:局部作用域中的命名空间。 

— THE END —

评论
