On this page

Python 函数

Python 函数全面指南

函数是Python编程中的基本构建块,用于组织可重用的代码逻辑。以下是Python函数的详细说明:

1. 函数定义

基本语法

def 函数名(参数1, 参数2, ...):
    """文档字符串(可选)"""
    函数体
    return 返回值  # 可选

简单示例

def greet(name):
    """打招呼的函数"""
    return f"Hello, {name}!"

print(greet("Alice"))  # 输出: Hello, Alice!

2. 函数参数

位置参数

def power(base, exponent):
    return base ** exponent

print(power(2, 3))  # 8 (2的3次方)

默认参数

def power(base, exponent=2):  # exponent默认为2
    return base ** exponent

print(power(3))      # 9 (3的2次方)
print(power(3, 3))   # 27 (3的3次方)

关键字参数

def describe_pet(pet_name, animal_type="dog"):
    print(f"I have a {animal_type} named {pet_name}.")

describe_pet(pet_name="Willie")  # 使用默认animal_type
describe_pet(animal_type="hamster", pet_name="Harry")  # 明确指定

可变参数

# *args 接收任意数量的位置参数(元组)
def sum_numbers(*args):
    return sum(args)

print(sum_numbers(1, 2, 3))  # 6

# **kwargs 接收任意数量的关键字参数(字典)
def print_info(**kwargs):
    for key, value in kwargs.items():
        print(f"{key}: {value}")

print_info(name="Alice", age=25))

3. 返回值

返回单个值

def square(x):
    return x * x

result = square(4)  # 16

返回多个值(实际上是返回元组)

def min_max(numbers):
    return min(numbers), max(numbers)

smallest, largest = min_max([5, 2, 8, 1])  # 1, 8

无返回值(返回None)

def greet(name):
    print(f"Hello, {name}!")

result = greet("Bob")  # 输出问候语,result为None

4. 变量作用域

局部变量与全局变量

x = 10  # 全局变量

def func():
    y = 5  # 局部变量
    global x  # 声明使用全局变量x
    x = 20   # 修改全局变量

func()
print(x)  # 20
print(y)  # NameError: y未定义

nonlocal关键字(嵌套函数)

def outer():
    x = 10
    
    def inner():
        nonlocal x  # 使用外层函数的x
        x = 20
    
    inner()
    print(x)  # 20

outer()

5. 函数高级特性

函数作为对象

def shout(text):
    return text.upper()

# 函数赋值给变量
yell = shout
print(yell("hello"))  # HELLO

# 函数作为参数
def greet(func):
    greeting = func("Hi there")
    print(greeting)

greet(shout)  # HI THERE

嵌套函数

def outer():
    print("外部函数")
    
    def inner():
        print("内部函数")
    
    inner()  # 在外部函数内调用

outer()

闭包

def make_multiplier(factor):
    def multiplier(x):
        return x * factor
    return multiplier

times3 = make_multiplier(3)
print(times3(5))  # 15

装饰器

def my_decorator(func):
    def wrapper():
        print("装饰器: 调用函数前")
        func()
        print("装饰器: 调用函数后")
    return wrapper

@my_decorator
def say_hello():
    print("Hello!")

say_hello()
"""
输出:
装饰器: 调用函数前
Hello!
装饰器: 调用函数后
"""

6. Lambda函数

匿名函数

square = lambda x: x * x
print(square(5))  # 25

# 常用于排序等场景
pairs = [(1, 'one'), (2, 'two'), (3, 'three')]
pairs.sort(key=lambda pair: pair[1])  # 按第二个元素排序

7. 内置高阶函数

map()

numbers = [1, 2, 3, 4]
squared = list(map(lambda x: x**2, numbers))  # [1, 4, 9, 16]

filter()

evens = list(filter(lambda x: x % 2 == 0, numbers))  # [2, 4]

reduce() (需从functools导入)

from functools import reduce
product = reduce(lambda x, y: x * y, numbers)  # 24 (1*2*3*4)

8. 类型提示(Python 3.5+)

def greet(name: str, age: int = 30) -> str:
    return f"{name} is {age} years old"

# 类型提示不会强制类型检查,但IDE和工具可以利用

9. 函数文档

文档字符串(Docstring)

def add(a, b):
    """
    返回两个数字的和
    
    参数:
        a (int/float): 第一个数字
        b (int/float): 第二个数字
    
    返回:
        int/float: a和b的和
    """
    return a + b

# 查看文档
print(add.__doc__)
help(add)

10. 实际应用示例

缓存装饰器

from functools import wraps

def cache(func):
    memo = {}
    
    @wraps(func)
    def wrapper(*args):
        if args not in memo:
            memo[args] = func(*args)
        return memo[args]
    
    return wrapper

@cache
def fibonacci(n):
    if n < 2:
        return n
    return fibonacci(n-1) + fibonacci(n-2)

计时装饰器

import time

def timer(func):
    def wrapper(*args, **kwargs):
        start = time.time()
        result = func(*args, **kwargs)
        end = time.time()
        print(f"{func.__name__}执行时间: {end-start:.4f}秒")
        return result
    return wrapper

@timer
def slow_function():
    time.sleep(2)

slow_function()  # 输出执行时间

11. 常见错误

  1. 修改可变默认参数

    def append_to(element, lst=[]):  # 默认参数在定义时计算
        lst.append(element)
        return lst
       
    print(append_to(1))  # [1]
    print(append_to(2))  # [1, 2] (不是预期的[2])
       
    # 正确做法
    def append_to(element, lst=None):
        if lst is None:
            lst = []
        lst.append(element)
        return lst
    
  2. 混淆return和print

    def add(a, b):
        print(a + b)  # 输出结果但没有返回值
       
    result = add(2, 3)  # result是None
    
  3. 作用域错误

    x = 10
       
    def func():
        print(x)  # 在赋值前引用局部变量x
        x = 20
       
    # 正确做法: 使用global或避免同名变量
    

总结

Python函数是代码组织和重用的基本单元,具有以下特点:

  • 参数灵活:支持位置参数、默认参数、可变参数等
  • 一等公民:函数可以作为参数传递和返回
  • 装饰器:提供强大的元编程能力
  • 闭包:可以捕获和保持状态
  • 文档支持:通过docstring提供说明

掌握函数的高级用法可以显著提高代码质量和开发效率。合理使用装饰器、闭包和lambda等特性能让代码更加简洁优雅。