【Python 高频 API 速学 ②】
一、为什么它们能打包讲?
• 都是「可迭代对象」的通用工具,不挑列表、元组、生成器。
• 组合使用,90 % 的「遍历 → 统计 → 排序」流水线可以直接写在一行。
二、六件套速览
API | 一句话定位 | 返回类型 | 额外武器 |
---|---|---|---|
len(obj) | 一口气数完元素 | int | O(1) 长度 |
sum(iter) | 元素相加 | 数值 | start 参数 |
sorted(iter, key=, reverse=) | 不破坏原序列排序 | 新列表 | key 函数 |
enumerate(iter, start=0) | 边循环边带索引 | 枚举对象 | start 偏移 |
zip(*iters) | 并行迭代多个序列 | 元组迭代器 | 自动最短截断 |
any(iter) | 只要有一个真就 True | bool | 短路求值 |
三、6 个一行代码场景
- 统计文件行数
line_cnt = sum(1 for _ in open('data.txt', encoding='utf-8'))
- 找出最高分学员
top = max(scores, key=lambda kv: kv[1]) # scores=[('Alice', 92), ...]
- 同时拿到值和索引(倒序)
for idx, val in enumerate(reversed(nums), 1):print(f'第 {idx} 名:{val}')
- 并行处理两份数据
result = [a + b for a, b in zip(list_a, list_b)]
- 快速判断「至少存在一个空字符串」
if any(not s.strip() for s in lines):raise ValueError("发现空行")
- 一行排序 + 去重(利用 dict 保序)
unique_sorted = sorted(dict.fromkeys(raw_list))
四、mini 实战:一行日志分析器
需求:统计 nginx access.log 中状态码 ≥ 400 且出现次数最多的 3 个。
from collections import Counter
top3 = Counter(line.split()[8] # 取状态码字段for line in open('access.log')if line.split()[8].isdigit() and int(line.split()[8]) >= 400
).most_common(3)
print(top3)
一行不够?其实用括号折叠后真的只有一行。
五、组合口诀
“len 数一数,sum 加一加,sorted 排一排; enumerate 给编号,zip 拉伙伴,any 找真相。”