介绍
本文收集了更多地道 Python 代码的最佳实践,尤其是当您不熟悉 Python 时。
贡献
随意为 这个列表做出贡献,我会通过在代码段中包含指向您的个人资料的链接来感谢您!
1. 捕捉异常
这是让您的代码陷入困境的可靠方法
<span style="color:#444444"><span style="background-color:#f6f6f6"><span style="color:#888888"># 非常糟糕的做法</span>
<span style="color:#333333"><strong>试试</strong></span>:
做一点事()
<span style="color:#333333"><strong>除了</strong></span>:
<span style="color:#333333"><strong>通过</strong></span>
<span style="color:#888888"># 稍微好一点的方法(包括日志记录),但仍然是一个不好的做法:</span>
<span style="color:#333333"><strong>尝试</strong></span>:
做一点事()
<span style="color:#333333"><strong>除了</strong></span>例外:
logging.exception() <span style="color:#888888"># 虽然,日志记录是一个好习惯</span>
<span style="color:#888888"># 当我们不使用 `Exception` 时,我们也会捕获诸如系统退出之类的事件。</span>
<span style="color:#888888"># 所以,使用异常意味着我们只捕获异常。</span>
<span style="color:#888888"># 更好的方法:</span>
<span style="color:#333333"><strong>尝试</strong></span>:
做一点事()
<span style="color:#333333"><strong>除了值错误</strong></span>:
日志记录.异常()
<span style="color:#888888"># 如果需要,一些代码可以优雅地处理您的异常</span>
</span></span>
这里我们使用了一种特定类型的异常,即 ValueError
。
2. 名称大小写
<span style="color:#444444"><span style="background-color:#f6f6f6"><span style="color:#888888"># 在 python </span>
<span style="color:#333333"><strong>def </strong></span><span style="color:#880000"><strong>isEmpty </strong></span>(sampleArr) 中<span style="color:#888888">使用camelCase不是约定</span>:
...
<span style="color:#888888"># 而是在 python </span>
<span style="color:#333333"><strong>def </strong></span> <span style="color:#880000"><strong>is_empty </strong></span>(sample_arr) 中<span style="color:#888888">使用snake_case </span>:
...</span></span>
在 python 中, snake_case
优先用于变量、函数和方法名称。但是,对于类, PascalCase
则使用。
3. 链式比较运算符
Python中有多种比较方式:
<span style="color:#444444"><span style="background-color:#f6f6f6"><span style="color:#888888"># 不要这样做:</span>
<span style="color:#333333"><strong>如果</strong></span> <span style="color:#880000">0</span> < x<span style="color:#333333"><strong>并且</strong></span>x < <span style="color:#880000">10</span> :
打印(“x是<span style="color:#333333"><strong>大于</strong></span>大于<span style="color:#880000">0</span>但<span style="color:#333333"><strong>小于</strong></span>比<span style="color:#880000">10</span> ”)
<span style="color:#888888"># 相反,这样做:</span>
<span style="color:#333333"><strong>如果</strong></span> <span style="color:#880000">0</span> < x < <span style="color:#880000">10</span> :
打印(“x是<span style="color:#333333"><strong>大于</strong></span>大于<span style="color:#880000">0</span>但<span style="color:#333333"><strong>小于</strong></span>比<span style="color:#880000">10</span> ”)</span></span>
4. 可变的默认参数
<span style="color:#444444"><span style="background-color:#f6f6f6"><span style="color:#888888"># 错误道!</span>
<span style="color:#888888"># 在你的代码中获得一些意外错误的可靠方法</span>
<span style="color:#333333"><strong>def </strong></span> <span style="color:#880000"><strong>add_fruit </strong></span>(fruit, box=[]) :
box.append(水果)
<span style="color:#333333"><strong>退货</strong></span>箱
<span style="color:#888888">#正确的方法!</span>
<span style="color:#888888"># 处理可变默认参数的推荐方法:</span>
<span style="color:#333333"><strong>def </strong></span> <span style="color:#880000"><strong>add_fruit </strong></span>(fruit, box=None) :
<span style="color:#333333"><strong>if</strong></span> box <span style="color:#333333"><strong>is </strong></span> <span style="color:#333333"><strong>None</strong></span> :
框 = []
box.append(水果)
<span style="color:#333333"><strong>退货</strong></span>箱</span></span>
在此处阅读有关可变默认参数的更多信息
5. 字符串格式化
<span style="color:#444444"><span style="background-color:#f6f6f6"><span style="color:#888888"># 避免使用它</span>
<span style="color:#888888"># %-formatting</span>
name = <span style="color:#880000">"James Bond"</span>
professional = <span style="color:#880000">"Secret Agent" </span>
<span style="color:#333333"><strong>print</strong></span> ( <span style="color:#880000">"Hello, %s. You are a %s."</span> % (name,professional))
<span style="color:#888888"># 稍微好一点</span>
<span style="color:#888888"># str.format() </span>
<span style="color:#333333"><strong>print</strong></span> ( <span style="color:#880000">"Hello, {}. You are a {}."</span> .format(name, professional))
<span style="color:#888888"># 短、脆、快!</span>
<span style="color:#888888"># f-strings </span>
<span style="color:#333333"><strong>print</strong></span> (f <span style="color:#880000">"Hello, {name}. You are a {profession}."</span> )</span></span>
f-strings 中的 f 也可以代表“快速”。f-strings 比 %-formatting 和 str.format() 都快。 (来源)
6. 顶级脚本环境
仅当它作为脚本而不是作为模块运行时才执行
<span style="color:#444444"><span style="background-color:#f6f6f6"><span style="color:#888888"># 文件名:run.py</span>
<span style="color:#333333"><strong>if</strong></span> __name__ == <span style="color:#880000">'__main__'</span> :
<span style="color:#397300">print</span> ( <span style="color:#880000">'Hello from script!'</span> )</span></span>
<span style="color:#444444"><span style="background-color:#f6f6f6">$蟒蛇<span style="color:#333333"><strong>运行</strong></span>。py
$ 你好<span style="color:#333333"><strong>来自</strong></span>脚本!</span></span>
Hello from script!
如果模块导入到任何其他模块中, 则 不会打印。
7. 条件表达式
<span style="color:#444444"><span style="background-color:#f6f6f6"><span style="color:#333333"><strong>如果</strong></span>x < <span style="color:#880000">10</span>:
<span style="color:#333333"><strong>返回</strong></span> <span style="color:#880000">1</span>
<span style="color:#333333"><strong>否则</strong></span>:
<span style="color:#333333"><strong>返回</strong></span> <span style="color:#880000">2</span></span></span>
可以简化为这个:
<span style="color:#444444"><span style="background-color:#f6f6f6"> <span style="color:#333333"><strong>如果</strong></span>x < <span style="color:#880000">10</span><span style="color:#333333"><strong>则</strong></span><span style="color:#333333"><strong>返回</strong></span><span style="color:#880000">1</span> <span style="color:#333333"><strong>否则</strong></span><span style="color:#880000">2</span> </span></span>
8. 迭代迭代器
如果不需要,则不一定需要迭代迭代器中元素的索引。您可以直接遍历元素。
这使您的代码更加 Pythonic。
<span style="color:#444444"><span style="background-color:#f6f6f6">list_of_fruits = [ <span style="color:#880000">"apple"</span> , <span style="color:#880000">"pear"</span> , <span style="color:#880000">"orange"</span> ]
<span style="color:#1f7199">#不好的做法,</span>
<span style="color:#333333"><strong>为</strong></span>我<span style="color:#333333"><strong>在</strong></span> <span style="color:#880000"><strong>范围</strong></span>(LEN(list_of_fruits)):
水果= list_of_fruits[i]
process_fruit(水果)
<span style="color:#1f7199">#好习惯</span>
<span style="color:#333333"><strong>的</strong></span>水果<span style="color:#333333"><strong>在</strong></span>list_of_fruits:
process_fruit(水果)</span></span>
9. 迭代期间的索引/计数
<span style="color:#444444"><span style="background-color:#f6f6f6"><span style="color:#888888"># 不要这样做:</span>
<span style="color:#333333"><strong>index</strong></span> = <span style="color:#880000">0 </span>
<span style="color:#333333"><strong>for</strong></span> value in collection:
<span style="color:#333333"><strong>print</strong></span> ( <span style="color:#333333"><strong>index</strong></span> , value)
<span style="color:#333333"><strong>index</strong></span> += <span style="color:#880000">1</span>
<span style="color:#888888"># 也不是这样:</span>
<span style="color:#333333"><strong>for </strong></span> <span style="color:#333333"><strong>index</strong></span> in range(len(collection)):
值=集合[<span style="color:#333333"><strong>索引</strong></span>]
<span style="color:#333333"><strong>打印</strong></span>(<span style="color:#333333"><strong>索引</strong></span>,值)
<span style="color:#888888"># 绝对不要这样做:</span>
<span style="color:#333333"><strong>index</strong></span> = <span style="color:#880000">0 </span>
<span style="color:#333333"><strong>while </strong></span> <span style="color:#333333"><strong>index</strong></span> < len(collection):
值=集合[<span style="color:#333333"><strong>索引</strong></span>]
<span style="color:#333333"><strong>打印</strong></span>(<span style="color:#333333"><strong>索引</strong></span>,值)
<span style="color:#333333"><strong>索引</strong></span>+= <span style="color:#880000">1</span>
<span style="color:#888888"># 相反,使用 `enumerate()`</span>
<span style="color:#333333"><strong>作为</strong></span> <span style="color:#333333"><strong>index</strong></span>, enumerate(collection) 中的值:
<span style="color:#333333"><strong>print</strong></span> ( <span style="color:#333333"><strong>index</strong></span> , value)</span></span>
10. 使用上下文管理器
Python 提供了上下文管理器来管理初始化和清理资源的开销,并让
你专注于实施。例如在读取文件的情况下,您无需担心
手动关闭文件。
<span style="color:#444444"><span style="background-color:#f6f6f6">d = { <span style="color:#880000">“富”</span>:<span style="color:#880000">1</span> }
#<span style="color:#333333"><strong>不好的</strong></span>做法
<span style="color:#333333"><strong>f</strong></span> = <span style="color:#333333"><strong>open</strong></span> ( <span style="color:#880000">"./data.csv"</span> , <span style="color:#880000">"wb"</span> )
<span style="color:#333333"><strong>f</strong></span> . <span style="color:#333333"><strong>写</strong></span>(<span style="color:#880000">“一些数据”</span>)
v = d[ <span style="color:#880000">"bar"</span> ] # KeyError
# <span style="color:#333333"><strong>f</strong></span>。<span style="color:#333333"><strong>接近</strong></span>()永远不会执行,这导致<span style="color:#333333"><strong>到</strong></span>内存问题
<span style="color:#333333"><strong>f</strong></span> . <span style="color:#333333"><strong>关闭</strong></span>()
# 好习惯
使用<span style="color:#333333"><strong>open</strong></span> ( <span style="color:#880000">"./data.csv"</span> , <span style="color:#880000">"wb"</span> )<span style="color:#333333"><strong>作为</strong></span> <span style="color:#333333"><strong>f</strong></span> :
<span style="color:#333333"><strong>f</strong></span>。<span style="color:#333333"><strong>写</strong></span>(<span style="color:#880000">“一些数据”</span>)
v = d[ <span style="color:#880000">“条”</span> ]
# <span style="color:#333333"><strong>python</strong></span>仍然执行<span style="color:#333333"><strong>f</strong></span>。<span style="color:#333333"><strong>接近</strong></span>甚至()<span style="color:#333333"><strong>如果</strong></span>出现异常KeyError异常
</span></span>
11. 使用集合代替列表进行搜索
<span style="color:#444444"><span style="background-color:#f6f6f6">s = set([ <span style="color:#880000">'s'</span> , <span style="color:#880000">'p'</span> , <span style="color:#880000">'a'</span> , <span style="color:#880000">'m'</span> ])
l = [ <span style="color:#880000">'s'</span> , <span style="color:#880000">'p'</span> , <span style="color:#880000">'a'</span> , <span style="color:#880000">'m'</span> ]
<span style="color:#888888"># 小号没问题。元素</span>
<span style="color:#333333"><strong>def </strong></span> <span style="color:#880000"><strong>lookup_list </strong></span>(l) :
<span style="color:#333333"><strong>return </strong></span> <span style="color:#880000">'s' </span> <span style="color:#333333"><strong>in</strong></span> l <span style="color:#888888"># O(1)</span>
<span style="color:#888888"># 更适合大号。元素</span>
<span style="color:#333333"><strong>def </strong></span> <span style="color:#880000"><strong>lookup_set </strong></span>(s) :
<span style="color:#333333"><strong>return </strong></span> <span style="color:#880000">'s' </span> <span style="color:#333333"><strong>in</strong></span> s <span style="color:#888888"># O(n)</span>
</span></span>
集合是在 python 中使用散列实现的,与在 a
列表(O(n))。
12. 导入模块时使用 *
进口应始终是具体的。从模块导入 * 是一种非常糟糕的做法,会污染命名空间。
<span style="color:#444444"><span style="background-color:#f6f6f6"><span style="color:#888888">#</span>
<span style="color:#333333"><strong>来自</strong></span>数学<span style="color:#333333"><strong>导入的</strong></span><span style="color:#888888">坏习惯</span>*
x = 细胞(x)
<span style="color:#888888">#</span>
<span style="color:#333333"><strong>来自</strong></span>数学<span style="color:#333333"><strong>导入</strong></span>ceil 的 <span style="color:#888888">良好实践</span>
x = ceil(x) <span style="color:#888888"># 我们知道 ceil 来自哪里</span>
</span></span>
13. 使用 items() 迭代字典
<span style="color:#444444"><span style="background-color:#f6f6f6">d = {
<span style="color:#880000">“姓名”</span>:<span style="color:#880000">“Aarya”</span>,
<span style="color:#880000">“年龄”</span>:<span style="color:#880000">13</span>
}
#不要<span style="color:#333333"><strong>做</strong></span> <span style="color:#333333"><strong>这样</strong></span>
<span style="color:#333333"><strong>的</strong></span>关键<span style="color:#333333"><strong>在</strong></span>d:
打印(f <span style="color:#880000">“{key} = {d[key]}”</span>)
#而是<span style="color:#333333"><strong>做</strong></span> <span style="color:#333333"><strong>这个</strong></span>
<span style="color:#333333"><strong>的</strong></span>关键,<span style="color:#333333"><strong>VAL</strong></span> <span style="color:#333333"><strong>在</strong></span>d.items():
打印(f <span style="color:#880000">“{key} = {val}”</span>)</span></span>