写出更简洁、更聪明的 Python 函数!
别再用错误的方式写 Python 函数!改用这些做法!
避开常见错误,学习最佳实践,让你的 Python 函数更高效、更易读。
Python 是一门很棒的语言——简单、优雅、易上手。但人人都会犯错:很多开发者(包括老手)在写函数时不经意会犯一些小错。这些错误眼下也许不会让你的代码崩溃,但随着代码库老化,它们会让代码变得又慢、又笨、甚至烂得让人瞠目结舌。
如果你一直把写 Python 函数当成“能跑就行”,现在该进阶了。是时候了解常见坑,并用最佳实践来修正它们。
1. 绝不要使用可变对象作为默认参数!
错的做法:
Python 在函数定义时只初始化一次默认参数,而不是在每次调用时初始化。因此,多次调用会共享同一个列表,稍有不慎就会出现意料之外的行为。
def add_item(item, items=[]):
items.append(item)
return items
print(add_item('apple')) # ['apple']
print(add_item('banana')) # ['apple', 'banana'] ???
对的做法:
当参数可能是可变对象时,把默认值设为 None,并在函数内部初始化。
def add_item(item, items=None):
if items is None:
items = []
items.append(item)
return items
print(add_item('apple')) # ['apple']
print(add_item('banana')) # ['banana']
2. 不要返回不一致的数据类型
错的做法:
返回不一致的数据类型会让函数更难使用,也容易埋下错误的隐患。
def process(value):
if value > 10:
return "Success"
else:
return 0 # Mixing str and int
对的做法:
返回 None(或保持同一类型)能让函数行为更可预测、更易调试。
from typing import Optional
def process(value: int) -> Optional[str]:
return "Success" if value > 10 else None
3. 别写臃肿的函数——保持小而专一
错的做法:
这个函数做得太多:计算价格、加税、应用折扣、还把运费也算上。
def calculate_price(quantity, price, tax_rate, discount, shipping):
total = (quantity * price) + shipping
total += total * tax_rate
if discount:
total -= total * discount
return total
对的做法(拆分!):
现在每个函数都只做一件事,且做到位——更容易测试、调试和复用。
def calculate_subtotal(quantity, price):
return quantity * price
defapply_tax(subtotal, tax_rate):
return subtotal + (subtotal * tax_rate)
defapply_discount(amount, discount):
return amount - (amount * discount)
defcalculate_total(quantity, price, tax_rate, discount, shipping):
subtotal = calculate_subtotal(quantity, price)
taxed_total = apply_tax(subtotal, tax_rate)
discounted_total = apply_discount(taxed_total, discount)
return discounted_total + shipping
4. 用 f-strings,别再用老式字符串格式化
错的做法:
def greet(name, age):
return "Hello, my name is %s and I am %d years old." % (name, age)
或者
def greet(name, age):
return "Hello, my name is {} and I am {} years old.".format(name, age)
对的做法(更易读,也更高效!)
def greet(name, age):
return f"Hello, my name is {name} and I am {age} years old."
f-strings 更高效、更易读,是 Python 中推荐的字符串格式化方式。
5. 使用 Type Hints 提升清晰度
错的做法:
虽然能运行,但 a 和 b 是什么类型?整数?浮点?字符串?
def add_numbers(a, b):
return a + b
对的做法:
Type Hints 让函数更“自解释”,也能避免副作用。
def add_numbers(a: int, b: int) -> int:
return a + b
6. 用 enumerate(),别手动维护索引
错的做法:
fruits = ["Mango", "Pineapple", "Guava"]
index = 0
for fruit in fruits:
print(f"{index}: {fruit}")
index += 1
对的做法:
enumerate() 免去手动维护索引,让循环更简洁、更 Pythonic。
fruits = ["Mango", "Pineapple", "Guava"]
for index, fruit in enumerate(fruits):
print(f"{index}: {fruit}")
7. 避免用 try-except 做流程控制
错的做法:
def get_price(data):
try:
return data["price"]
except KeyError:
return 0
对的做法:
使用 .get() 更易读,也避免不必要的异常处理。
def get_price(data):
return data.get("price", 0)
最后的想法
写好 Python 函数,不只是“能跑”,还要可读、可维护、也要高效。避开这些常见坑并采用最佳实践,能让你的 Python 代码干净而专业。
既然你已经知道如何改进 Python 函数,回头把你的旧代码重构一遍吧!你会惊讶于它变得多么高效、整洁。


