一、函数的基本概念
函数是组织好的、可重复使用的、用来实现单一或相关联功能的代码段。使用函数可以提高代码的复用性和可读性。
在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)
注意:递归函数必须有明确的基线条件(终止条件),否则会导致无限递归。
3997

被折叠的 条评论
为什么被折叠?



