引言
上一篇写了一些很常用的pythonic场景,接下来继续为大家介绍更多pythonic场景,助力大家写出更优雅的Python代码
正文咯
常用数据结构选型
list、dict、set、tuple 在python中都可以存放多个元素,但他们也有各自的使用场景:
- list :有序、可变集合,适合存放元素顺序重要、需频繁增删查改的场景。
- 如:存储一组用户对象,顺序有意义,需遍历和插入。
- tuple :有序、不可变集合。用于数据不可更改、可作为字典键的场景。
- 如:返回多值;用作字典的复合键。
- set :无序、唯一元素集合。适合去重、集合运算(交并差等)。
- 如:快速判断元素是否存在,或对列表去重。
- 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,债见!