什么是“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,债见!

相关推荐
历程里程碑1 天前
普通数组----合并区间
java·数据结构·python·算法·leetcode·职场和发展·tornado
weixin_395448911 天前
mult_yolov5_post_copy.c_cursor_0205
c语言·python·yolo
执风挽^1 天前
Python基础编程题2
开发语言·python·算法·visual studio code
程序员泠零澪回家种桔子1 天前
Spring AI框架全方位详解
java·人工智能·后端·spring·ai·架构
纤纡.1 天前
PyTorch 入门精讲:从框架选择到 MNIST 手写数字识别实战
人工智能·pytorch·python
kjkdd1 天前
6.1 核心组件(Agent)
python·ai·语言模型·langchain·ai编程
小镇敲码人1 天前
剖析CANN框架中Samples仓库:从示例到实战的AI开发指南
c++·人工智能·python·华为·acl·cann
萧鼎1 天前
Python 包管理的“超音速”革命:全面上手 uv 工具链
开发语言·python·uv
源代码•宸1 天前
大厂技术岗面试之谈薪资
经验分享·后端·面试·职场和发展·golang·大厂·职级水平的薪资
alvin_20051 天前
python之OpenGL应用(二)Hello Triangle
python·opengl