1. 生成器:内存高效迭代
提示:利用生成器对大型数据集进行迭代,而无需将所有内容加载到内存中。
优点:
- 高效处理大型数据集。
- 即时生成项目,节省内存。
缺点:
- 生成器是一次性迭代器;一旦食用,它们就不能重复使用。
例:
# Fibonacci sequence generator
def fibonacci(n):
a, b = 0, 1
for _ in range(n):
yield a
a, b = b, a + b
2. 断言:自信地调试
提示:在开发过程中使用断言来确认有关代码状态的假设。
优点:
- 通过及早发现潜在问题来增强代码可靠性。
- 提供一种确认有关代码的假设的方法。
缺点:
- 在生产代码中过度使用可能会影响性能。
例:
# Assertion for checking if a variable is positive
num = -5
assert num > 0, "Number must be positive"
3. 深拷贝与浅拷贝:明智地复制
提示:了解处理可变对象和 shallow copy 处理可变对象之间的区别 deepcopy 。
优点:
- Shallow copy :创建具有对相同对象的引用的新集合。
- Deepcopy :生成原始对象及其所有内容的独立克隆。
缺点:
- 在需要深拷贝时使用浅拷贝可能会导致对原始数据进行意外修改。
例:
# Duplicating a nested list with both shallow and deep copies
import copy
original = [[1, 2, 3], [4, 5, 6]]
shallow = copy.copy(original)
deep = copy.deepcopy(original)
4. 随机模块:拥抱不可预测性
提示:采用该 random 模块,在代码中引入可变性或随机性。
优点:
- 适用于模拟、游戏或任何需要不可预测性的场景。
- 提供多种随机化函数。
缺点:
- 结果不是真正随机的;它们是伪随机的。
例:
import random
# Generating a random number between 1 and 10
random_number = random.randint(1, 10)
5. Defaultdict:简化字典操作
提示: defaultdict 从 collections 模块中用于简化字典操作。
优点:
- 通过为不存在的键提供默认值来简化代码。
- 消除显式密钥存在检查。
缺点:
- 需要导入 collections 模块。
例:
from collections import defaultdict
word = "pythonic"
letter_count = defaultdict(int)
for letter in word:
letter_count[letter] += 1
6. 海象运算符 (:=):效率的内联分配
提示:使用 walrus 运算符 (Python 3.8+) 进行表达式中的内联赋值。
优点:
- 有效地分配值并在同一表达式中使用它们。
- 在某些情况下减少冗余。
缺点:
- 过度使用它会使不熟悉运算符的人更难阅读代码。
例:
# Reading lines from a file until a blank line is found
with open('file.txt', 'r') as f:
while (line := f.readline().strip()):
print(line)
7. 类型提示:增强代码清晰度
提示:采用类型提示 (Python 3.5+) 以提高代码清晰度,尤其是在大型项目中。
优点:
- 提高了代码的可读性和可维护性。
- 实现更好的 IDE 支持和静态类型检查。
缺点:
- Python 仍然是一种动态类型的语言;类型提示是可选的,不是强制执行的 - 它是针对人眼;)。
例:
# Function with type hints
def greet(name: str) -> str:
return f"Hello, {name}!"
8. 命名元组:自记录数据结构
提示:使用 namedtuples 创建简单的、自记录的数据结构。
优点:
- 提供轻量级、不可变的数据结构。
- 通过为每个字段指定名称来增强代码可读性。
缺点:
- 变;创建后无法修改。
- 对于可变结构,请考虑使用数据类 (Python 3.7+)。
例:
# Creating a namedtuple for a person
from collections import namedtuple
Person = namedtuple('Person', ['name', 'age'])
alice = Person(name="Alice", age=30)
9. 压缩和解压缩列表:合并和解压缩序列
提示:用于 zip() 组合多个可迭代对象,从而更轻松地并行循环访问多个列表。
优点:
- 简化同时迭代多个列表的过程。
- 对于需要一起处理不同列表中的项目的任务很方便。
缺点:
- zip() 停在最短的输入列表中;对于不同大小的可迭代对象,请考虑使用 itertools.zip_longest() 。
例:
# Matching user inputs with corresponding answers in a quiz
names = ["Alice", "Bob"]
scores = [85, 92]
for name, score in zip(names, scores):
print(f"{name}: {score}")
10. 字典 —get()和setdefault():优雅的按键处理
提示:使用 get() 和 setdefault() 方法增强字典操作。
优点:
- get() :检索键的值,如果键不存在,则提供默认值。
- setdefault() :如果密钥不存在,则设置默认值,防止重复密钥检查。
缺点:
- 忽略这些方法可能会导致检查密钥是否存在的冗余代码。
例:
data = {"name": "Alice"}
age = data.get("age", 30)
data.setdefault("country", "USA")
11. 守卫__main__:脚本执行控制
提示:直接运行脚本时, if __name__ == "__main__": 使用 guard 来控制代码执行。
优点:
- 确保某些代码仅在直接执行脚本时运行,而不是在导入脚本时运行。
- 对于既可以为函数导入,也可以直接为任务运行的实用程序脚本很有用。
缺点:
- 在导入模块时,忘记使用此防护可能会导致意外行为。
例:
if __name__ == "__main__":
print("This script is being run directly!")
12. 虚拟环境:隔离项目特定开发的依赖关系
提示:利用虚拟环境来隔离特定于项目的依赖项,防止与系统范围的包发生冲突。
优点:
- 确保每个项目都有一个干净和隔离的环境。
- 促进依赖关系的管理并避免冲突。
缺点:
- 忘记激活虚拟环境可能会导致在全局 Python 环境中意外安装包。
例:
# Creating and activating a virtual environment
python -m venv my_project_env
source my_project_env/bin/activate
13. 星号 (*) 运算符:多才多艺且功能强大
提示:探索星号 ( * ) 运算符在打包和解包、关键字参数解包和重复方面的多功能性。
优点:
- 有效地将集合解压缩到单独的元素中。
- 促进函数中的动态参数处理。
缺点:
- 过度使用会降低代码的可读性,尤其是在连续多次解包时。
例:
# Passing a dynamic list of values to a function expecting separate arguments
def func(a, b, c):
return a + b + c
values = [1, 2, 3]
print(func(*values))
14. Context Managers(with语句):资源管理简单性
提示:将上下文管理器与 with 语句一起使用,以实现高效的资源管理。
优点:
- 确保资源的正确设置和拆卸。
- 提高代码可读性并降低资源泄漏的可能性。
缺点:
- 忘记在有益时使用该 with 语句可能会导致与资源相关的问题。
例:
# Opening and reading a file using a context manager
with open('file.txt', 'r') as f:
content = f.read()
15. Python 的下划线 (_) 用途:命名和循环的多功能性
提示:利用下划线 ( _ ) 作为循环中的一次性变量。
优点:
- 在命名约定中表示“受保护”的变量。
- 在 REPL 环境中重用上一个结果。
- 当不需要循环变量时,充当循环中的一次性变量。
缺点:
- 不同的用途可能会令人困惑,尤其是对于新编码人员而言。
例:
# Iterating a specific number of times without needing the loop counter
for _ in range(5):
print("Hello, World!")
16. 映射、过滤和缩减:Python 中的函数式编程
提示: 合并 map() 、 filter() 和 reduce() 作为处理集合的函数式方法,从而减少对显式循环的需求。
优点:
- map() :将函数应用于集合中的每个项。
- filter() :根据谓词选择项目。
- reduce() :累积应用函数,将序列减少为单个值。
缺点:
- 请注意,在 Python 3.x 中, map() 和 filter() 返回迭代器;如果需要,将它们转换为列表。
例:
# Using map() to convert strings to uppercase
names = ["alice", "bob", "charlie"]
upper_names = list(map(str.upper, names))
17. 合并词典:简化词典操作
提示:使用 update() 方法或 {**dict1, **dict2} 语法来合并词典。
优点:
- 简化了多个词典内容的组合。
- 在选择合并方法时提供灵活性。
缺点:
- 在处理嵌套字典时,过度使用此方法可能会导致意外结果。
例:
# Merging dictionaries using the update() method
dict1 = {'a': 1, 'b': 2}
dict2 = {'b': 3, 'c': 4}
dict1.update(dict2)