一、函数的基本概念
函数是组织好的、可重复使用的、用来实现单一或相关联功能的代码段。使用函数可以提高代码的复用性和可读性。
在Python中,函数具有以下特点:
函数是第一类对象,可以赋值给变量、作为参数传递给其他函数、作为函数的返回值
函数定义使用def关键字
函数可以有参数和返回值
函数可以嵌套定义
二、函数的定义与调用
2.1 函数的定义
Python中函数定义的基本语法:
def 函数名(参数列表): """函数文档字符串(docstring)""" 函数体 [return 返回值]
示例:
def greet(name): """向指定的人打招呼""" return f"Hello, {name}!"
2.2 函数的调用
调用函数的语法:函数名(参数列表)
示例:
message = greet("Alice") print(message) # 输出: Hello, Alice!
2.3 文档字符串(docstring)
文档字符串是函数定义中的第一个字符串,用于描述函数功能,可以通过help()函数或__doc__属性查看。
print(greet.__doc__) # 输出: 向指定的人打招呼 help(greet) # 显示更详细的帮助信息
三、函数参数
3.1 位置参数
位置参数是最常见的参数类型,调用时必须按照定义的顺序传递参数。
def add(a, b): return a + b result = add(3, 5) # a=3, b=5 print(result) # 输出: 8
3.2 关键字参数
关键字参数允许调用时指定参数名,不需要严格按照顺序传递。
result = add(b=5, a=3) # 关键字参数,顺序可以调换 print(result) # 输出: 8
3.3 默认参数
默认参数在定义时指定默认值,调用时可以不传递该参数,使用默认值。
def greet(name, greeting="Hello"): return f"{greeting}, {name}!" print(greet("Bob")) # 使用默认的greeting,输出: Hello, Bob! print(greet("Bob", "Hi")) # 提供greeting参数,输出: Hi, Bob!
注意:默认参数必须放在位置参数之后。
3.4 可变参数
可变参数允许传递任意数量的参数,分为两种:
3.4.1 *args - 接收可变数量的位置参数
*args会将传递的多个位置参数打包成一个元组。
def sum_numbers(*args): total = 0 for num in args: total += num return total print(sum_numbers(1, 2, 3)) # 输出: 6 print(sum_numbers(10, 20, 30, 40)) # 输出: 100
3.4.2 **kwargs - 接收可变数量的关键字参数
**kwargs会将传递的多个关键字参数打包成一个字典。
def print_info(** kwargs): for key, value in kwargs.items(): print(f"{key}: {value}") print_info(name="Alice", age=30, city="New York") # 输出: # name: Alice # age: 30 # city: New York
3.5 参数组合使用
参数可以组合使用,但顺序必须是:位置参数 → *args → 关键字参数 → **kwargs
def func(a, b, *args, c=0, **kwargs): print(f"a: {a}, b: {b}") print(f"args: {args}") print(f"c: {c}") print(f"kwargs: {kwargs}") func(1, 2, 3, 4, c=5, d=6, e=7) # 输出: # a: 1, b: 2 # args: (3, 4) # c: 5 # kwargs: {'d': 6, 'e': 7}
四、函数返回值
4.1 return语句
return语句用于从函数中返回值,结束函数执行。
def square(x): return x * x result = square(5) print(result) # 输出: 25
4.2 多返回值
Python函数可以返回多个值,实际上是返回一个元组,然后自动解包。
def divide(a, b): quotient = a // b remainder = a % b return quotient, remainder # 实际返回的是一个元组 q, r = divide(10, 3) print(q, r) # 输出: 3 1
4.3 无return语句的函数
如果函数没有return语句,或者return后没有值,函数将返回None。
def say_hello(): print("Hello") result = say_hello() print(result) # 输出: None
五、函数的高级特性
5.1 嵌套函数
在函数内部可以定义另一个函数,称为嵌套函数或内部函数。
def outer_function(x): def inner_function(y): return y * 2 return inner_function(x) + 3 print(outer_function(5)) # 输出: 13 (5*2 + 3)
5.2 闭包
闭包是指内部函数引用了外部函数的变量,并且外部函数返回了内部函数。
def make_multiplier(n): def multiplier(x): return x * n # 引用了外部函数的变量n return multiplier # 返回内部函数 double = make_multiplier(2) triple = make_multiplier(3) print(double(5)) # 输出: 10 print(triple(5)) # 输出: 15
5.3 装饰器
装饰器是一种特殊的函数,用于修改其他函数的功能,在不改变原函数代码的情况下为函数添加新功能。
def log_decorator(func): def wrapper(*args, **kwargs): print(f"调用函数: {func.__name__}") result = func(*args, **kwargs) print(f"函数 {func.__name__} 调用结束") return result return wrapper @log_decorator def add(a, b): return a + b print(add(3, 5)) # 输出: # 调用函数: add # 函数 add 调用结束 # 8
5.4 匿名函数(lambda)
lambda函数是一种简洁的、单行的匿名函数,使用lambda关键字定义。
# 语法: lambda 参数: 表达式 square = lambda x: x * x print(square(5)) # 输出: 25 # 常用于函数式编程中,如作为sorted函数的key参数 numbers = [(1, 3), (4, 1), (2, 5)] sorted_numbers = sorted(numbers, key=lambda x: x[1]) print(sorted_numbers) # 输出: [(4, 1), (1, 3), (2, 5)]
5.5 递归函数
递归函数是指在函数内部调用自身的函数,通常用于解决可以分解为相似子问题的问题。
def factorial(n): if n == 1: # 基线条件(终止条件) return 1 else: return n * factorial(n - 1) # 递归调用 print(factorial(5)) # 输出: 120 (5*4*3*2*1)
注意:递归函数必须有明确的基线条件(终止条件),否则会导致无限递归。