Python开发实用技巧:10个高效编程建议与常见陷阱

雨后青山
雨后青山
发布时间:2026-10-13| 4人浏览过
原创

本文整理了Python开发中的10个实用技巧与常见错误,涵盖列表推导式、元组解包、字典安全访问、字符串格式化及切片步进等核心概念。通过对比初学者易犯错误与更优雅的Pythonic写法,帮助开发者提升代码简洁性与执行效率,避免浅拷贝陷阱与性能损耗,适用于Python 3环境。

以下是十个在Python开发中极具价值的实用技巧。其中部分技巧针对的是初学者在使用该语言时容易出现的典型误区。

注意:以下示例均基于Python 3环境。

1. 列表推导式

假设你有一个列表:bag = [1, 2, 3, 4, 5]

现在你需要将列表中的所有元素翻倍,期望得到结果:[2, 4, 6, 8, 10]

基于其他编程语言的惯性思维,大多数初学者可能会采用如下方式实现:

bag = [1, 2, 3, 4, 5] 
for i in range(len(bag)): 
 bag[i] = bag[i] * 2

然而,Python提供了更简洁高效的替代方案:

bag = [elem * 2 for elem in bag]

这种写法非常简洁,被称为Python的列表推导式(List Comprehension)。

2. 遍历列表

继续使用上述列表。在可能的情况下,应尽量避免以下做法:

bag = [1, 2, 3, 4, 5] 
for i in range(len(bag)): 
 print(bag[i])

推荐的正确做法如下:

bag = [1, 2, 3, 4, 5] 
for i in bag: 
 print(i)

如果x是一个列表,你可以直接迭代其元素。在大多数场景中,你并不需要元素的索引;但如果确实需要索引,可以使用enumerate函数,示例如下:

bag = [1, 2, 3, 4, 5] 
for index, element in enumerate(bag): 
 print(index, element)

这种方法直观且清晰。

3. 元素互换

如果你是从Java或C语言转向Python,可能习惯于使用临时变量进行交换:

a = 5 
b = 10
# 交换 a 和 b
tmp = a 
a = b 
b = tmp

但Python提供了更自然且优雅的方法:

a = 5 
b = 10 
# 交换a 和 b
a, b = b, a

4. 初始化列表

如果你需要创建一个包含10个整数0的列表,最初的直觉可能是:

bag = [] 
for _ in range(10): 
 bag.append(0)

尝试另一种方式:

bag = [0] * 10

看起来更加优雅。

注意:如果列表中包含子列表,上述方法会产生浅拷贝(Shallow Copy)。

例如:

bag_of_bags = [[0]] * 5 # [[0], [0], [0], [0], [0]] 
bag_of_bags[0][0] = 1 # [[1], [1], [1], [1], [1]]

结果出乎意料:所有子列表都发生了改变,而我们原本只想修改第一个子列表。

修正方法如下:

bag_of_bags = [[0] for _ in range(5)] 
# [[0], [0], [0], [0], [0]]
bag_of_bags[0][0] = 1 
# [[1], [0], [0], [0], [0]]
“过早优化是万恶之源”

此外,还需反思:初始化列表是否真的必要?

5. 构造字符串

在打印字符串时,如果涉及多个变量,应避免以下写法:

name = "Raymond" 
age = 22 
born_in = "Oakland, CA" 
string = "Hello my name is " + name + "and I'm " + str(age) + " years old. I was born in " + born_in + "." 
print(string)

这种写法显得杂乱。可以使用更简洁美观的.format()方法替代:

具体实现如下:

name = "Raymond" 
age = 22 
born_in = "Oakland, CA" 
string = "Hello my name is {0} and I'm {1} years old. I was born in {2}.".format(name, age, born_in) 
print(string)

6. 返回元组(Tuples)

Python允许函数返回多个元素,这简化了代码逻辑。但在解包元组时,常出现以下错误:

def binary(): 
 return 0, 1

result = binary() 
zero = result[0] 
one = result[1]

这并非必要,你可以直接替换为:

def binary(): 
 return 0, 1
zero, one = binary()

如果只需要部分返回值,可以使用下划线_忽略不需要的元素:

zero, _ = binary()

这种方式更加高效。

7. 访问字典(Dicts)

你经常需要向字典中写入键值对(Key-Value)。

如果尝试访问不存在的键,为了避免KeyError异常,你可能会倾向于这样做:

countr = {} 
bag = [2, 3, 1, 2, 5, 6, 7, 9, 2, 7] 
for i in bag: 
 if i in countr:
 countr[i] += 1
 else:
 countr[i] = 1

for i in range(10): 
 if i in countr:
 print("Count of {}: {}".format(i, countr[i]))
 else:
 print("Count of {}: {}".format(i, 0))

但使用get()方法是更好的选择。

countr = {} 
bag = [2, 3, 1, 2, 5, 6, 7, 9, 2, 7] 
for i in bag: 
 countr[i] = countr.get(i, 0) + 1
for i in range(10): 
 print("Count of {}: {}".format(i, countr.get(i, 0)))

你也可以使用setdefault()作为替代方案。

此外,还有一种更简单但开销较大的方法:

bag = [2, 3, 1, 2, 5, 6, 7, 9, 2, 7] 
countr = dict([(num, bag.count(num)) for num in bag])
for i in range(10): 
 print("Count of {}: {}".format(i, countr.get(i, 0)))

你也可以使用字典推导式。

countr = {num: bag.count(num) for num in bag}

这两种方法开销较大,因为每次调用count时都会遍历整个列表。

8. 使用库

现有的库只需导入即可实现你的核心需求。

以之前的例子为例,我们构建一个函数来统计数字在列表中出现的次数。实际上,已有现成的库可以完成此类任务:

from collections import Counter 
bag = [2, 3, 1, 2, 5, 6, 7, 9, 2, 7] 
countr = Counter(bag)
for i in range(10): 
 print("Count of {}: {}".format(i, countr[i]))

使用库的理由包括:

代码经过测试,确保正确性。 其算法可能经过优化,运行速度更快。 抽象化:库接口明确且文档友好,让你能专注于尚未实现的业务逻辑。 最后,功能已现成存在,无需重复造轮子。

9. 列表切片与步进

你可以指定起始点(start)和结束点(stop),语法为list[start:stop:step]。例如,提取列表的前5个元素:

bag = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 
for elem in bag[:5]: 
 print(elem)

这就是切片操作。我们指定stop为5,在到达该索引前会提取5个元素。

如果需要提取最后5个元素,该怎么做?

bag = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 
for elem in bag[-5:]: 
 print(elem)

如果不理解,-5表示从列表末尾向前提取5个元素。

如果你想对列表元素进行间隔操作,可能会这样做:

bag = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 
for index, elem in enumerate(bag): 
 if index % 2 == 0: 
 print(elem)

但你应该采用以下方式:

bag = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 
for elem in bag[::2]: 
 print(elem)
# 或者用 ranges
bag = list(range(0,10,2)) 
print(bag)

这就是列表的步进操作。list[::2]表示遍历时每隔一个元素取出一个。

你可以使用list[::-1]来翻转列表,效果非常酷。

10. Tab键还是空格键

长期混合使用Tab和空格会导致不必要的麻烦,例如出现IndentationError: unexpected indent错误。无论选择Tab还是空格,都应在文件和项目中保持一致。

推荐使用空格而非Tab的原因之一是,Tab在不同编辑器中的表现不一致。根据所用编辑器,Tab可能被解释为2到8个空格不等。

你也可以在代码中使用空格来定义缩进,从而自定义Tab的空格数。大多数Python用户选择使用4个空格作为缩进单位。

总结

以上介绍了Python开发的十个实用技巧与常见错误,希望能对大家有所帮助。如有任何疑问,欢迎留言,小编会及时回复。感谢大家对本站的支持!

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。