Python 代码实践

介绍

本文收集了更多地道 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>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值