在 Python 3 中,函数是组织代码、实现代码复用和模块化的核心工具。下面我将从基础语法到高级特性,为你系统地梳理 Python 3 函数的核心知识点,并附带清晰的代码示例。
1. 基础定义与调用
使用 def 关键字定义函数,使用 return 返回结果(如果不写 return,默认返回 None)。
def greet(name: str) -> str:
"""这是一个文档字符串 (Docstring),用于说明函数的作用"""
return f"Hello, {name}!"
# 调用函数
message = greet("Alice")
print(message) # 输出: Hello, Alice!注:: str 和 -> str 是 Python 3 的类型提示 (Type Hints),不影响运行,但能提高代码可读性和 IDE 的智能提示。
2. 参数的传递方式 (核心重点)
Python 函数的参数非常灵活,主要有以下几种:
① 位置参数与关键字参数
def describe_person(name, age, city):
print(f"{name} is {age} years old and lives in {city}.")
# 位置参数 (按顺序)
describe_person("Bob", 25, "Beijing")
# 关键字参数 (按名称,顺序可打乱)
describe_person(city="Shanghai", name="Alice", age=30)② 默认参数
默认参数必须放在非默认参数的后面。
def make_coffee(size="Medium", type="Latte"):
print(f"Making a {size} {type}.")
make_coffee() # 使用默认值: Making a Medium Latte.
make_coffee("Large") # 覆盖第一个参数: Making a Large Latte.
make_coffee(type="Espresso") # 关键字覆盖: Making a Medium Espresso.⚠️ 陷阱警告:默认参数如果是可变对象(如列表 [] 或字典 {}),会导致多次调用共享同一个对象。应使用 None 替代:
# 错误写法
def add_item(item, my_list=[]):
my_list.append(item)
return my_list
# 正确写法
def add_item(item, my_list=None):
if my_list is None:
my_list = []
my_list.append(item)
return my_list③ 可变参数 (*args 和 **kwargs)
用于接收不确定数量的参数。
*args:接收任意数量的位置参数,打包成一个元组 (tuple)。**kwargs:接收任意数量的关键字参数,打包成一个字典 (dict)。
def flexible_function(*args, **kwargs):
print("args (元组):", args)
print("kwargs (字典):", kwargs)
flexible_function(1, 2, 3, name="Tom", age=20)
# 输出:
# args (元组): (1, 2, 3)
# kwargs (字典): {'name': 'Tom', 'age': 20}3. 变量作用域 (Scope)
Python 遵循 LEGB 规则查找变量:Local (局部) -> Enclosing (嵌套) -> Global (全局) -> Built-in (内置)。
count = 0 # 全局变量
def update_count():
global count # 声明使用全局变量
count += 1
update_count()
print(count) # 输出: 1如果在嵌套函数中需要修改外层(非全局)函数的变量,使用 nonlocal 关键字。
4. 高级函数特性
① 匿名函数 (lambda)
用于创建小型的、一次性使用的函数,通常配合高阶函数使用。
# 语法: lambda 参数: 表达式
square = lambda x: x ** 2
print(square(5)) # 输出: 25
# 配合 sorted 使用
pairs = [(1, 'one'), (3, 'three'), (2, 'two')]
pairs.sort(key=lambda pair: pair[1]) # 按字符串排序
print(pairs) # 输出: [(1, 'one'), (3, 'three'), (2, 'two')]② 装饰器 (Decorators)
在不修改原函数代码的前提下,动态地为函数增加功能(如日志、计时、权限校验)。使用 @ 语法糖。
import time
from functools import wraps
def timer_decorator(func):
@wraps(func) # 保留原函数的元信息(如函数名和文档)
def wrapper(*args, **kwargs):
start_time = time.time()
result = func(*args, **kwargs)
end_time = time.time()
print(f"函数 {func.__name__} 运行耗时: {end_time - start_time:.4f} 秒")
return result
return wrapper
@timer_decorator
def heavy_computation():
time.sleep(1)
print("计算完成")
heavy_computation()③ 生成器函数 (yield)
使用 yield 代替 return。函数不会一次性返回所有结果,而是每次返回一个值并暂停执行,节省大量内存,适合处理海量数据。
def fibonacci(n):
a, b = 0, 1
for _ in range(n):
yield a
a, b = b, a + b
# 返回的是一个生成器对象,可以用 for 循环遍历
for num in fibonacci(5):
print(num, end=" ") # 输出: 0 1 1 2 3 ④ 高阶函数
函数可以作为参数传递给另一个函数,或作为返回值。Python 内置了几个常用的高阶函数:
map(func, iterable): 对可迭代对象的每个元素应用函数。filter(func, iterable): 过滤出使函数返回True的元素。
nums = [1, 2, 3, 4, 5]
# map: 所有数字平方
squared = list(map(lambda x: x**2, nums)) # [1, 4, 9, 16, 25]
# filter: 筛选偶数
evens = list(filter(lambda x: x % 2 == 0, nums)) # [2, 4]5. Python 3 函数最佳实践
- 单一职责原则:一个函数只做一件事,保持简短(建议不超过 50 行)。
- 始终编写 Docstring:使用三引号
"""..."""说明函数的作用、参数类型和返回值(可遵循 Google 或 Sphinx 风格)。 - 善用类型提示 (Type Hints):在 Python 3.5+ 中,强烈建议使用
typing模块(如List,Dict,Optional)让代码更健壮。 - 避免深层嵌套:如果
if/for嵌套超过 3 层,考虑提取为独立函数或使用“提前返回 (Early Return)”模式。
你想深入了解以上哪个具体知识点?(例如:装饰器的进阶用法、类型提示的详细规则,或者如何用函数解决某个具体的业务问题?)可以随时告诉我!