Pythonic 优雅编程

理解 Pythonic 概念

逻辑运算

变量值交换:a, b = b, a

运算符优先级:先括号 P,再指数 E,然后乘除 MD,最后加减 AS

链式比较:5 < 10 < 5*10 < 100 -> True

三目运算:text = '男' if gender == 'male' else '女'

列表与字典

列表反转:a_list[::-1]

字典取值:a_dict.get("name", "default")

字典合并:x.update(y){**x,**y}x|y

字典推导式:d = {key: value for (key, value) in iterable}

字典排序:sorted(a_dict.items(), key=lambda x: x[1], reverse=True)

迭代字典时节省内存:

d = {i: i * 2 for i in xrange(10000000)}
for key, value in d.iteritem():
    print("{0} = {1}".format(key, value))
# 构建迭代器,避免完整数据一次性都加载到内存

字符串处理

移除多行字符串每一行的前导空格:from textwrap import dedent;dedent(text)

字符串转日期:import datetime; datetime.datetime.strptime("2024-01-01 23:59:59", "%Y-%m-%d %H:%M:%S")

ASCII 码转换

ord("a"), chr(97) 
# 97, a

字符串统计字符出现的次数

"abc33aef".count("a") # 单个字符的次数统计
from collections import Counter
Counter("abc33aef") # 所有字符的次数统计(返回结果为dict格式)
# Counter({'a': 2, '3': 2, 'b': 1, 'c': 1, 'e': 1, 'f': 1})

F 字符串中浮点数的格式化与输出

f"小数点后保留2位有效数字: {1 / 3:.2f}"
# '小数点后保留2位有效数字: 0.33'
f"计算面积,保留5位有效数字 = {math.pi * 10.203**2:,.5g}"
# '计算面积,保留5位有效数字 = 327.04'
f"百分比格式: {0.1256:.1%}"
# 百分比格式: 12.6%"
f"科学计数法: {0.00012345:.3e}"
# 科学计数法: '1.234e-04'

循环结构

为循环语句添加进度条:

from tqdm import tqdm
from tqdm._tqdm_notebook import tqdm_notebook

[i**2 for i in tqdm(range(10))] # 普通循环添加进度条

[i**2 for i in tqdm_notebook(range(10))] # notebook 内循环添加进度条

tqdm.pandas() # 调用pandas的apply函数时,添加进度条
df['new_column'] = df['target_column'].progress_apply(func)

在循环中获取 index 索引

for index, c in enumerate([a,b,c], start=1):
    print(index, c)
# 1 a
# 2 b
# 3 c

遍历目录(包括子目录)下的所有文件

f_path = "/opt/"
files = [f for f in os.listdir(f_path) \
    	 if os.path.isfile(os.path.join(f_path, f))]

函数、类与实例

函数映射:map(lambda x: x * x, [1, 2, 3, 4]))

错误处理与重试:

from retry import retry

@retry(delay=1, tries=4) # 尝试重复4次,每次间隔1s
def demo():
    print('错误') # 函数内容略
    raise

往年同期文章