函数是Python编程中最重要的构建块之一,它允许你将代码组织成可重用的模块。本文将全面介绍Python函数的定义、调用和各种高级用法。

一、函数基础

1.1 函数定义

Python使用def关键字定义函数,基本语法如下:

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

示例:

def greet(name):
    """向指定的人问好"""
    print(f"Hello, {name}!")

1.2 函数调用

定义函数后,可以通过函数名加括号的方式调用:

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

二、函数参数详解

2.1 位置参数

最常见的参数类型,按位置顺序传递:

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

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

2.2 关键字参数

调用时明确指定参数名,可以不按顺序:

print(power(exponent=3, base=2))  # 8

2.3 默认参数

定义函数时为参数指定默认值:

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

print(power(3))     # 9 (使用默认指数2)
print(power(3, 3))  # 27

注意:默认参数必须放在非默认参数后面

2.4 可变参数

*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, city="New York")

三、返回值

3.1 返回单个值

def square(x):
    return x * x

result = square(4)  # 16

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

def divide_and_remainder(a, b):
    quotient = a // b
    remainder = a % b
    return quotient, remainder

q, r = divide_and_remainder(10, 3)  # q=3, r=1

3.3 无返回值函数

不写return或只写return的函数返回None:

def no_return():
    print("This function returns None")

x = no_return()  # x为None

四、函数高级特性

4.1 函数作为对象

Python中函数是一等对象,可以赋值给变量:

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

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

4.2 函数作为参数

def greet(func):
    greeting = func("Hi, I'm a function passed as an argument")
    print(greeting)

greet(shout)  # 输出: HI, I'M A FUNCTION PASSED AS AN ARGUMENT

4.3 嵌套函数

函数内部可以定义其他函数:

def outer():
    print("Outer function")
    
    def inner():
        print("Inner function")
    
    inner()

outer()

4.4 闭包

内部函数可以记住外部函数的作用域:

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

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

五、作用域规则

5.1 LEGB规则

Python查找变量的顺序:

  1. Local - 局部作用域
  2. Enclosing - 嵌套函数作用域
  3. Global - 模块全局作用域
  4. Built-in - 内置作用域

5.2 global和nonlocal

修改全局变量和嵌套作用域变量:

count = 0  # 全局变量

def increment():
    global count
    count += 1

def outer():
    x = "outer"
    
    def inner():
        nonlocal x
        x = "inner"
    
    inner()
    print(x)  # 输出: inner

六、装饰器

装饰器是修改其他函数行为的函数:

6.1 基本装饰器

def my_decorator(func):
    def wrapper():
        print("Before function call")
        func()
        print("After function call")
    return wrapper

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

say_hello()

6.2 带参数的装饰器

def repeat(num_times):
    def decorator(func):
        def wrapper(*args, **kwargs):
            for _ in range(num_times):
                result = func(*args, **kwargs)
            return result
        return wrapper
    return decorator

@repeat(num_times=3)
def greet(name):
    print(f"Hello {name}")

greet("Alice")

七、Lambda函数

匿名函数,用于简单操作:

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

# 常用于排序等场景
points = [(1, 2), (3, 1), (5, 0)]
points.sort(key=lambda point: point[1])  # 按y坐标排序

八、最佳实践

  1. 函数应短小精悍:一个函数只做一件事
  2. 使用有意义的名称:函数名应明确表达其功能
  3. 限制参数数量:通常不超过3-4个
  4. 添加文档字符串:使用三引号说明函数用途
  5. 避免修改传入的可变参数:除非明确需要
  6. 返回一致的类型:避免有时返回None有时返回值

九、实际应用示例

9.1 文件处理函数

def process_file(filename, operation='read'):
    try:
        with open(filename, 'r' if operation == 'read' else 'w') as f:
            if operation == 'read':
                return f.read()
            elif operation == 'write':
                f.write("Some content")
                return True
    except IOError as e:
        print(f"File error: {e}")
        return None

9.2 数据验证装饰器

def validate_input(func):
    def wrapper(number):
        if not isinstance(number, (int, float)):
            raise ValueError("Input must be a number")
        if number < 0:
            raise ValueError("Input must be positive")
        return func(number)
    return wrapper

@validate_input
def calculate_square_root(x):
    return x ** 0.5

总结

Python函数是代码组织和重用的基本单元,掌握函数的使用对于编写清晰、模块化的代码至关重要。从简单的参数传递到高级的装饰器用法,Python函数提供了强大的抽象能力。通过遵循最佳实践并理解函数的工作原理,你可以编写出更高效、更易维护的Python代码。

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐