Python 中有一些内置函数,平日里看起来平平无奇,但当你真正投入到业务逻辑编写、自动化脚本开发或者数据分析时,它们却能帮你省去大量冗余代码,让思路更清晰。这篇文章不讲大道理,直接分享 6 个我个人在 Python 开发中高频使用且极易上手的函数,希望能帮你提升编码效率。
1. enumerate():告别手动索引,循环更优雅
很多新手在写循环时,习惯这样操作:
names = ["alice", "bob", "tom"]
for i in range(len(names)):
print(i, names[i])
这不算错,但总觉得有些绕。更优雅的写法是直接使用 enumerate():
names = ["alice", "bob", "tom"]
for idx, name in enumerate(names, start=1):
print(f"{idx}: {name}")
start=1 这个参数非常实用,特别是在生成带序号的列表、排行榜或分页结果时,无需再手动 +1。
我在处理日志文件定位问题时,就经常这么写:
with open("app.log", "r", encoding="utf-8") as f:
for line_no, line in enumerate(f, start=1):
if "ERROR" in line:
print(f"第{line_no}行有异常: {line.strip()}")
相比自己维护一个计数器,这种写法要干净利落得多。
2. zip():轻松配对数据,字典构造好帮手
当我们需要同时处理两组一一对应的数据时,比如用户名和其对应的分数:
users = ["u01", "u02", "u03"]
scores = [88, 92, 79]
for user, score in zip(users, scores):
print(user, score)
输出自然就是配好的对。
我个人更常用的场景是快速构造字典,尤其在处理 API 参数或 CSV 数据时:
fields = ["id", "name", "age"]
values = [101, "东哥", 18]
row = dict(zip(fields, values))
print(row)
# {'id': 101, 'name': '东哥', 'age': 18}
另一个高频场景是批量比对新老数据:
old = [10, 20, 30]
new = [10, 25, 28]
for before, after in zip(old, new):
if before != after:
print(f"数据变化: {before} -> {after}")
这样的代码逻辑清晰,一目了然。
3. sorted():排序不修改原数据,生产环境更安心
排序时最担心的两点:一是代码冗长,二是不小心原地修改了原始数据。sorted() 函数的好处就在于它返回一个新列表,不影响原数据:
orders = [
{"id": 1, "amount": 99},
{"id": 2, "amount": 15},
{"id": 3, "amount": 56},
]
result = sorted(orders, key=lambda x: x["amount"], reverse=True)
print(result)
如果你只是想获取一个排序后的结果用于后续处理,sorted() 比 list.sort() 更安全,尤其是在 Web后端 的接口逻辑中。
更实用的技巧是按多字段排序,例如先按任务状态,再按创建时间:
tasks = [
{"name": "job1", "status": 2, "ts": 1701},
{"name": "job2", "status": 1, "ts": 1705},
{"name": "job3", "status": 1, "ts": 1702},
]
tasks = sorted(tasks, key=lambda x: (x["status"], x["ts"]))
这比手写一堆 if-else 判断要简洁高效得多。
4. any():检查“至少一个满足”的场景利器
你以前是否也写过这样的代码?
has_error = False
for line in lines:
if "ERROR" in line:
has_error = True
break
这个逻辑完全可以用 any() 函数一行搞定:
lines = ["INFO start", "WARN timeout", "ERROR db down"]
has_error = any("ERROR" in line for line in lines)
print(has_error) # True
它在数据校验时特别顺手。比如检查密码是否至少包含一个数字:
password = "abcx9yz"
if not any(ch.isdigit() for ch in password):
print("密码至少要包含一个数字")
这类代码简短且语义直接,一看就懂在做什么。
5. all():校验“全部满足”的条件,简化参数检查
all() 函数通常和 any() 一起被记忆。它在接口参数校验时特别好用:
payload = {
"user_id": "1001",
"mobile": "13800001111",
"city": "shanghai"
}
ok = all(payload.get(k) for k in ["user_id", "mobile", "city"])
print(ok)
再比如,检查一批任务是否全部执行成功:
results = [True, True, True, False]
if not all(results):
print("有任务没跑成功")
在我写批处理脚本时,最后常常用它来做一次整体确认:
files = ["a.txt", "b.txt", "c.txt"]
done = all(name.endswith(".txt") for name in files)
print(done)
这种场景下如果不用 all(),往往需要多写好几行样板代码。
6. map():配合现成函数进行批量转换
很多人对 map() 有所犹豫,因为列表推导式同样强大且直观。这没错,但在某些场景下,map() 用起来依然很顺手,尤其是当转换逻辑已经是一个定义好的函数时。
例如,将字符串列表批量转换为整数:
raw = ["10", "20", "30", "40"]
nums = list(map(int, raw))
print(nums)
再比如,批量清洗用户输入的名字:
raw_users = [" alice ", " BOB ", " Tom "]
def normalize(name: str) -> str:
return name.strip().lower()
users = list(map(normalize, raw_users))
print(users)
当转换动作本身是一个独立的、可复用的函数时,使用 map() 会让代码的意图非常清晰。当然,对于需要复杂条件过滤或字段组合的场景,列表推导式往往是更优的选择,可读性会更高。
以上就是我个人在 Python 开发中觉得非常实用的 6 个内置函数。它们不是什么炫技的奇技淫巧,而是在日常编码中能实实在在提升效率和代码可读性的工具。如果你有自己私藏的“宝藏函数”,也欢迎在 云栈社区 分享交流。