Python 常用技巧指南
Python 的可读性和简单性是其广受欢迎的两大原因。本文整理了 20 个常用的 Python 技巧,旨在提高代码的可读性,帮助开发者节省大量时间。这些技巧涵盖字符串处理、列表操作、字典合并、异常处理及性能分析等场景,将在你的日常编码练习中非常实用。
1. 字符串反转
使用 Python 切片功能可以简洁地反转字符串,无需调用额外函数。
Python 语言以其简洁性著称。本文整理了 20 个实用技巧,涵盖字符串处理、列表操作、字典合并、异常处理及性能分析等场景。通过切片反转、集合去重、Counter 统计、枚举遍历等方法,帮助开发者优化代码结构,提高执行效率与可读性。这些技巧适用于日常编码练习,能有效节省时间并减少常见错误。内容包含原理说明与注意事项,适合各级别 Python 开发者参考学习。

Python 的可读性和简单性是其广受欢迎的两大原因。本文整理了 20 个常用的 Python 技巧,旨在提高代码的可读性,帮助开发者节省大量时间。这些技巧涵盖字符串处理、列表操作、字典合并、异常处理及性能分析等场景,将在你的日常编码练习中非常实用。
使用 Python 切片功能可以简洁地反转字符串,无需调用额外函数。
# 使用切片反转字符串
my_string = "ABCDE"
reversed_string = my_string[::-1]
print(reversed_string)
# 输出:EDCBA
注意: 切片步长为 -1 表示从后向前遍历,这是最 Pythonic 的写法。
利用字符串内置的 title() 方法可以快速将每个单词的首字母转换为大写。
my_string = "my name is chaitanya baweja"
# 使用 title() 函数
new_string = my_string.title()
print(new_string)
# 输出:My Name Is Chaitanya Baweja
注意: 该方法会将所有单词的首字母大写,适用于标题格式化。
利用集合(Set)无序且不重复的特性,可以快速去除字符串中的重复字符。
my_string = "aavvccccddddeee"
# 将字符串转换为集合
temp_set = set(my_string)
# 使用 join 将集合拼接回字符串
new_string = ''.join(temp_set)
print(new_string)
# 输出顺序可能不同,例如:cdvae
注意: 集合是无序的,因此结果字符串的顺序不固定。如果需要保持原顺序去重,需结合字典或列表遍历。
使用乘法运算符(*)可以直接复制字符串或列表,语法简洁高效。
n = 3 # 重复次数
my_string = "abcd"
my_list = [1, 2, 3]
print(my_string * n)
# 输出:abcdabcdabcd
print(my_list * n)
# 输出:[1, 2, 3, 1, 2, 3, 1, 2, 3]
注意: 此操作会创建新的对象副本,不会修改原对象。
列表推导式是 Python 中创建新列表的强力工具,比传统循环更简洁。
# 将列表中每个元素乘以 2
original_list = [1, 2, 3, 4]
new_list = [2 * x for x in original_list]
print(new_list)
# 输出:[2, 4, 6, 8]
注意: 列表推导式在内存效率和代码可读性上通常优于显式的 for 循环。
Python 支持多变量赋值,无需临时变量即可交换两个变量的值。
a = 1
b = 2
a, b = b, a
print(a) # 2
print(b) # 1
注意: 这是元组解包机制的应用,底层会自动处理值的传递。
使用 split() 函数可以根据指定的分隔符将字符串分割成列表。
string_1 = "My name is Chaitanya Baweja"
string_2 = "sample/ string 2"
# 默认分隔符为空格
print(string_1.split())
# 输出:['My', 'name', 'is', 'Chaitanya', 'Baweja']
# 定义分隔符为 '/'
print(string_2.split('/'))
# 输出:['sample', ' string 2']
注意: 如果未指定分隔符,split() 会自动按空白字符分割并去除多余空格。
使用 join() 方法可以将列表中的字符串连接成一个长字符串,效率高于使用 + 号累加。
list_of_strings = ['My', 'name', 'is', 'Chaitanya', 'Baweja']
# 使用逗号作为分隔符连接
print(','.join(list_of_strings))
# 输出:My,name,is,Chaitanya,Baweja
注意: join() 是字符串对象的方法,参数必须是可迭代的字符串序列。
通过比较字符串与其反转后的版本,可以判断其是否为回文结构。
my_string = "abcba"
if my_string == my_string[::-1]:
print("palindrome")
else:
print("not palindrome")
# 输出:palindrome
注意: 实际应用中通常需要先去除空格和统一大小写。
使用 collections.Counter 类可以方便地统计元素频率。
from collections import Counter
# 查找列表中每个元素的频率
my_list = ['a', 'a', 'b', 'b', 'b', 'c', 'd', 'd', 'd', 'd', 'd']
count = Counter(my_list) # 定义计数器对象
print(count) # 所有元素
# 输出:Counter({'d': 5, 'b': 3, 'a': 2, 'c': 1})
print(count['b']) # 单个元素
# 输出:3
print(count.most_common(1)) # 出现最多的元素
# 输出:[('d', 5)]
注意: Counter 继承自字典,支持大部分字典操作。
Anagrams 指两个单词包含相同的字符且频率相同。使用 Counter 比较是最直接的方法。
from collections import Counter
str_1, str_2, str_3 = "acbde", "abced", "abcda"
cnt_1, cnt_2, cnt_3 = Counter(str_1), Counter(str_2), Counter(str_3)
if cnt_1 == cnt_2:
print('1 and 2 anagram')
if cnt_1 == cnt_3:
print('1 and 3 anagram')
# 输出:1 and 2 anagram
注意: 此方法对大小写敏感,如需忽略大小写,请先统一转换。
结构化异常处理能确保程序在出错时优雅降级,并在最后执行清理工作。
a, b = 1, 0
try:
print(a / b)
# 当 b 为 0 时会抛出异常
except ZeroDivisionError:
print("division by zero")
else:
print("no exceptions raised")
finally:
print("Run this always")
# 输出:
# division by zero
# Run this always
注意: else 块仅在无异常时执行,finally 块无论是否发生异常都会执行。
enumerate() 允许在遍历列表时同时获取索引和值。
my_list = ['a', 'b', 'c', 'd', 'e']
for index, value in enumerate(my_list):
print('{0}: {1}'.format(index, value))
# 输出:
# 0: a
# 1: b
# 2: c
# 3: d
# 4: e
注意: 默认索引从 0 开始,可通过 start 参数自定义起始值。
使用 sys.getsizeof() 可以查看对象占用的字节数,有助于内存优化。
import sys
num = 21
print(sys.getsizeof(num))
# Python 2 中通常为 24
# Python 3 中通常为 28
注意: 该函数仅返回对象本身的大小,不包含引用计数或其他开销。
Python 3.5+ 支持使用解包操作符 ** 快速合并字典。
dict_1 = {'apple': 9, 'banana': 6}
dict_2 = {'banana': 4, 'orange': 8}
combined_dict = {**dict_1, **dict_2}
print(combined_dict)
# 输出:{'apple': 9, 'banana': 4, 'orange': 8}
注意: 后合并的字典键值会覆盖先合并的字典同名键的值。
使用 time 模块记录起止时间,可评估代码段的运行耗时。
import time
start_time = time.time()
# 待测代码
for i in range(10**5):
a, b = 1, 2
c = a + b
# 待测代码结束
end_time = time.time()
time_taken_in_micro = (end_time - start_time) * (10**6)
print(time_taken_in_micro)
# 输出示例:18770.217895507812
注意: 对于极短的代码段,建议使用 timeit 模块以获得更精确的结果。
处理嵌套列表时,可以使用递归或迭代方式将其展平为一维列表。
from iteration_utilities import deepflatten
# 如果只有一层嵌套,可使用列表推导式
def flatten(l):
return [item for sublist in l for item in sublist]
l = [[1, 2, 3], [3]]
print(flatten(l))
# 输出:[1, 2, 3, 3]
# 如果不知道嵌套深度,可使用第三方库
l = [[1, 2, 3], [4, [5], [6, 7]], [8, [9, [10]]]]
print(list(deepflatten(l, depth=3)))
# 输出:[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
注意: 标准库中没有内置的深度展开函数,复杂场景建议引入 more-itertools 等库。
使用 random.sample() 可以从列表中随机抽取指定数量的不重复元素。
import random
my_list = ['a', 'b', 'c', 'd', 'e']
num_samples = 2
samples = random.sample(my_list, num_samples)
print(samples)
# 输出:['a', 'e'] # 每次运行结果可能不同
注意: 样本数量不能超过列表总长度,否则会抛出 ValueError。
将整数转换为数字列表,常用于处理数值位运算或加密算法。
num = 123456
# 使用 map 函数
list_of_digits = list(map(int, str(num)))
print(list_of_digits)
# 输出:[1, 2, 3, 4, 5, 6]
# 使用列表推导式
list_of_digits = [int(x) for x in str(num)]
print(list_of_digits)
# 输出:[1, 2, 3, 4, 5, 6]
注意: 两种方法性能差异微乎其微,列表推导式更符合 Python 风格。
通过比较列表长度与集合长度,可快速判断是否存在重复元素。
def unique(l):
if len(l) == len(set(l)):
print("All elements are unique")
else:
print("List has duplicates")
unique([1, 2, 3, 4])
# 输出:All elements are unique
unique([1, 1, 2, 3])
# 输出:List has duplicates
注意: 集合去重操作的时间复杂度为 O(n),适合大数据量初步筛查。
以上 20 个技巧涵盖了 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