Python 因其简洁的语法和强大的生态系统,在数据科学、机器学习、Web 开发、脚本编写及自动化等领域得到了广泛应用。掌握一些高级或鲜为人知的语言特性,可以显著提升代码的可读性和执行效率。
以下总结了 10 条非常实用的 Python 编程技巧,并附带了详细的原理解析与最佳实践建议。
1. for 循环中的 else 条件
除了常规的循环结构外,Python 允许在 循环后紧跟一个 块。这是一个相对较少被使用的特性,但在处理搜索或验证逻辑时非常有用。
本文介绍了 10 个实用的 Python 编程技巧,包括 for 循环的 else 子句、序列解包、heapq 高效查找、参数展开、列表切片、多变量赋值、列表推导式、Enum 枚举、字符串乘法及链式比较。内容涵盖各技巧的原理说明、代码示例及性能分析,旨在帮助开发者写出更简洁高效的 Python 代码。

Python 因其简洁的语法和强大的生态系统,在数据科学、机器学习、Web 开发、脚本编写及自动化等领域得到了广泛应用。掌握一些高级或鲜为人知的语言特性,可以显著提升代码的可读性和执行效率。
以下总结了 10 条非常实用的 Python 编程技巧,并附带了详细的原理解析与最佳实践建议。
除了常规的循环结构外,Python 允许在 循环后紧跟一个 块。这是一个相对较少被使用的特性,但在处理搜索或验证逻辑时非常有用。
forelse原理:
当循环正常结束(即没有遇到 break)时,else 块才会执行。如果循环中途通过 break 退出,则跳过 else 块。
示例:
numbers = [2, 4, 6, 8, 1]
for number in numbers:
if number % 2 == 1:
print(f"Found odd number: {number}")
break
else:
print("No odd numbers found")
解析:
在上述代码中,列表包含奇数 1,循环遇到它时会打印并执行 break,因此 else 分支不会被执行。如果列表中全是偶数,循环会完整遍历完毕,此时 else 块将执行,提示未找到奇数。这种写法常用于替代标志位变量,使逻辑更清晰。
Python 支持序列解包(Unpacking),可以直接将列表或元组中的元素赋值给多个变量,无需通过索引访问。
示例:
my_list = [1, 2, 3, 4, 5]
one, two, three, four, five = my_list
print(one, two) # 输出:1 2
进阶用法:
结合星号操作符 * 可以处理长度不确定的情况,剩余元素会被收集到一个新列表中。
head, *middle, tail = [1, 2, 3, 4, 5]
# head=1, middle=[2, 3, 4], tail=5
当需要从列表中获取前 N 个最大或最小元素时,直接使用 heapq 模块比先排序再切片更高效。
示例:
import heapq
scores = [51, 33, 64, 87, 91, 75, 15, 49, 33, 82]
# 获取最大的 3 个元素
print(heapq.nlargest(3, scores)) # 输出:[91, 87, 82]
# 获取最小的 5 个元素
print(heapq.nsmallest(5, scores)) # 输出:[15, 33, 33, 49, 51]
性能优势:
对于大型数据集,nlargest 和 nsmallest 的时间复杂度为 O(N log K),其中 N 是列表长度,K 是要获取的元素个数。而先排序 (sorted()) 再切片的时间复杂度为 O(N log N)。当 K 远小于 N 时,heapq 的性能优势明显。
使用星号操作符 * 可以将可迭代对象(如列表、元组)展开,作为独立的参数传递给函数。
示例:
my_list = [1, 2, 3, 4]
# 直接打印列表
print(my_list) # 输出:[1, 2, 3, 4]
# 展开列表作为独立参数
print(*my_list) # 输出:1 2 3 4
# 作为函数参数传递
def sum_of_elements(*args):
return sum(args)
result = sum_of_elements(*[1, 2, 3, 4])
print(result) # 输出:10
应用场景:
这在调用接受可变数量参数的函数(*args)或需要解构字典参数(**kwargs)时非常常见,能避免手动构建参数列表的繁琐过程。
获取列表中间部分的元素通常使用切片(Slicing)操作,而非尝试解包。原文中的解包方式存在错误,因为左侧变量数量必须与右侧元素数量严格匹配。
正确示例:
lst = [1, 2, 3, 4, 5, 6, 7, 8]
# 获取除首尾之外的所有元素
elements_in_the_middle = lst[1:-1]
print(elements_in_the_middle) # 输出:[2, 3, 4, 5, 6, 7]
注意:
切片操作 [start:end] 不包含 end 索引处的元素。-1 表示最后一个元素之前。此方法适用于任何长度的列表,且不会抛出异常。
Python 允许在同一行内对多个变量进行初始化,这基于元组解包的机制。
示例:
one, two, three, four = 1, 2, 3, 4
交换变量值: 这一特性最著名的应用是交换两个变量的值,无需临时变量。
a, b = 10, 20
a, b = b, a
print(a, b) # 输出:20 10
列表推导式(List Comprehension)提供了一种简洁的方式来创建列表,相比传统的 for 循环更加紧凑且通常运行更快。
基础用法:
numbers = [1, 2, 3, 4, 5]
squared_numbers = [num * num for num in numbers]
print(squared_numbers) # 输出:[1, 4, 9, 16, 25]
扩展用法: 推导式不仅限于列表,还可以用于字典、集合和生成器表达式。
字典推导:
dictionary = {'a': 4, 'b': 5}
squared_dictionary = {key: num * num for key, num in dictionary.items()}
print(squared_dictionary) # 输出:{'a': 16, 'b': 25}
生成器表达式: 如果需要节省内存,可以使用圆括号代替方括号,这会创建一个生成器对象,按需计算值。
gen = (num * num for num in numbers)
print(next(gen)) # 输出:1
Enum 类提供了类型安全的符号常量,类似于全局变量,但具有更好的可读性、分组能力和类型检查支持。
示例:
from enum import Enum
class Status(Enum):
NO_STATUS = -1
NOT_STARTED = 0
IN_PROGRESS = 1
COMPLETED = 2
print(Status.IN_PROGRESS.name) # 输出:IN_PROGRESS
print(Status.COMPLETED.value) # 输出:2
优势:
相比于使用整数或字符串常量,使用 Enum 可以避免魔术数字(Magic Numbers),并在 IDE 中获得更好的自动补全支持。同时,它防止了无效值的传入(例如传入 Status(99) 会报错,除非定义了该成员)。
Python 支持使用乘法运算符 * 直接复制字符串,无需编写循环。
示例:
name = "Banana"
print(name * 4) # 输出:BananaBananaBananaBanana
适用场景: 这在生成占位符、分隔符或简单的文本格式化时非常高效。需要注意的是,对于极长的字符串重复,需考虑内存占用。
Python 允许像数学公式一样进行链式比较,这比使用 and 连接多个比较表达式更直观。
示例:
x = 5
if 1 < x < 10:
print("x is between 1 and 10")
对比传统写法:
在其他许多语言中,你需要写成 1 < x and x < 10。Python 的链式比较不仅减少了代码量,还避免了重复读取变量 x,提高了代码的可读性。此外,链式比较还会按顺序求值,如果第一个比较失败,后续的比较将不再执行。
以上 10 个技巧涵盖了 Python 的基础语法优化、数据结构操作以及标准库的高效使用。熟练掌握这些特性,不仅能减少代码行数,还能提升程序的性能和可维护性。建议在开发过程中有意识地应用这些模式,逐步构建自己的 Python 编码风格指南。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online