写出漂亮 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, or
if 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 = 0
for 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 = 10000000
print("I earn", money, "dollars by writing on medium.")
money = 10_000_000
print(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 np
a = 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 np
a = 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 —
评论