什么是“Pythonic”?——写出更优雅的Python代码(下)

引言

上一篇写了一些很常用的pythonic场景,接下来继续为大家介绍更多pythonic场景,助力大家写出更优雅的Python代码

正文咯

常用数据结构选型

list、dict、set、tuple 在python中都可以存放多个元素,但他们也有各自的使用场景:

  1. list :有序、可变集合,适合存放元素顺序重要、需频繁增删查改的场景。
    • 如:存储一组用户对象,顺序有意义,需遍历和插入。
  2. tuple :有序、不可变集合。用于数据不可更改、可作为字典键的场景。
    • 如:返回多值;用作字典的复合键。
  3. set :无序、唯一元素集合。适合去重、集合运算(交并差等)。
    • 如:快速判断元素是否存在,或对列表去重。
  4. dict :键值映射。适合根据唯一键高效查找、插入和删除。
    • 如:统计元素出现次数、配置参数、缓存等。

对于计数等场景,python还提供了十分好用的defaultdict、Counter

Python 复制代码
from collections import defaultdict
counts = defaultdict(int)
for ch in 'hello world':
    counts[ch] += 1
    
from collections import Counter
c = Counter('abracadabra')
print(c.most_common(2))  # [('a', 5), ('b', 2)]

(不过笔者写了挺长时间的python代码,好像也还没机会用)

解包

我们经常可以看到python函数里的形参是这个样子的

Python 复制代码
def example(*args, **kwargs):
    for arg in args:
        print(arg)
    for key, value in kwargs.items():
        print(f"{key} = {value}")

*args 将多个参数 打包成一个列表,比如 example(1, "a", "如果让你重新来过")

**kwargs 将多个参数 打包成一个字典,比如 example(a=1, b="a", c="如果让你重新来过")

注意:如果是kwargs 就一定要指定参数的名字,因为kwargs必须传入字典

*的解包功能,和函数中打包的逻辑正相反,他将列表转换为多个值,将字段通过**也转换成多个值

with语句

当我们管理资源的时候,比如文件或者网络连接,不得不考虑在任何情况下都需要给连接关闭,java中喜欢用try-catch-finally, golang中喜欢用defer, 而python可以使用with 十分的方便,比如:

csharp 复制代码
with open('data.txt') as f:
    data = f.read()
# 文件自动关闭

EAFP vs. LBYL

EAFP全名叫it's easier to ask for forgiveness than permission,请求原谅比请求许可更容易。

什么是请求许可的代码呢?就是我写代码的时候,已经预估到了风险,针对风险写出一些if判断逻辑,规避掉风险,比如:

Python 复制代码
if 'key' in d:
    value = d['key']
else:
    value = default

我猜到了 key可能不存在,所以给他提供一个默认值。或者让一些逻辑只在满足if条件时运行。

什么是请求原谅呢?就是我完全不管,直接操作,出错再处理

Python 复制代码
try:
    value = d['key']
except KeyError:
    value = default

通常来说,在工程代码上,请求原谅的写法比请求许可是更好的:

  • 请求许可中,需要先进行读取两次对象来确认是否存在问题,请求原谅则只需要读取一次。
  • 可读性更强,可以让别人迅速知道代码在规避什么问题

结语

在Python中,优雅的代码更易维护、更高效。掌握技巧的同时切记可读性始终是第一要义,切勿为简洁而牺牲清晰。

最后推荐阅读PEP 8,The Zen of Python,债见!

相关推荐
aini_lovee3 小时前
python在容器内克隆拉取git私有仓库
git·python·elasticsearch
编程乐学(Arfan开发工程师)4 小时前
56、原生组件注入-原生注解与Spring方式注入
java·前端·后端·spring·tensorflow·bug·lua
安全系统学习5 小时前
网络安全之RCE简单分析
开发语言·python·算法·安全·web安全
Elcker6 小时前
Springboot+idea热更新
spring boot·后端·intellij-idea
蹦蹦跳跳真可爱5896 小时前
Python----神经网络发(神经网络发展历程)
人工智能·python·深度学习·神经网络·计算机视觉
chao_7896 小时前
标注工具核心代码解析——class AnnotationVie【canvas.py]
开发语言·python·qt5
struggle20257 小时前
tvm开源程序是适用于 CPU、GPU 和专用加速器的开放式深度学习编译器堆栈
人工智能·python·深度学习
仟濹7 小时前
「pandas 与 numpy」数据分析与处理全流程【数据分析全栈攻略:爬虫+处理+可视化+报告】
大数据·python·数据分析·numpy·pandas
南玖yy8 小时前
深入理解 x86 汇编中的符号扩展指令:从 CBW 到 CDQ 的全解析
开发语言·汇编·arm开发·后端·架构·策略模式