Python3 函数

在 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 函数最佳实践

  1. 单一职责原则:一个函数只做一件事,保持简短(建议不超过 50 行)。
  2. 始终编写 Docstring:使用三引号 """...""" 说明函数的作用、参数类型和返回值(可遵循 Google 或 Sphinx 风格)。
  3. 善用类型提示 (Type Hints):在 Python 3.5+ 中,强烈建议使用 typing 模块(如 List, Dict, Optional)让代码更健壮。
  4. 避免深层嵌套:如果 if/for 嵌套超过 3 层,考虑提取为独立函数或使用“提前返回 (Early Return)”模式。

你想深入了解以上哪个具体知识点?(例如:装饰器的进阶用法类型提示的详细规则,或者如何用函数解决某个具体的业务问题?)可以随时告诉我!