目录
在 Python 编程世界里,函数是构建强大程序的基石。它不仅能提高代码的复用性、增强可读性,还能让开发者更高效地组织和管理代码逻辑。本文将深入剖析 Python 函数的各个方面,无论是初学者还是有一定经验的开发者,都能从中获得有价值的知识。
一、函数基础:定义、参数与返回值
(一)函数定义
Python 中定义函数使用def
关键字,语法格式为def 函数名称(参数列表):
,函数体紧跟其后,通过缩进来区分。例如:
def greet(name):
print(f"Hello, {name}!")
函数名需遵循标识符命名规则,它是函数的标识,方便后续调用。参数列表可包含零个或多个参数,用于接收调用时传入的数据。
(二)函数参数
- 形参与实参:形参是函数定义时小括号内的参数,仅在函数内部有效,用于指定函数接收的数据类型和数量;实参是函数调用时传入小括号内的值。例如:
def add(a, b):
return a + b
result = add(3, 5)
这里a
、b
是形参,3
、5
是实参。
2. 位置参数与关键字参数:位置参数按顺序一一对应传入;关键字参数通过参数名指定传入的值,可打破顺序限制。如:
def user_info(id, name, address):
print(f"ID: {id}, Name: {name}, Address: {address}")
user_info(1, "Alice", "Wonderland") # 位置参数
user_info(name="Bob", id=2, address="Nowhere") # 关键字参数
- 默认值参数:为参数提供默认值,调用时若不传入该参数,就使用默认值。像这样:
def greet(name, greeting="Hello"):
print(f"{greeting}, {name}!")
greet("Charlie") # 使用默认问候语
greet("David", "Hi") # 传入自定义问候语
- 动态传参:当参数个数不确定时,可使用动态参数。
*args
以元组形式收集多余的位置参数,**kwargs
以字典形式收集多余的关键字参数。例如:
def print_args(*args, **kwargs):
print("Positional arguments:", args)
print("Keyword arguments:", kwargs)
print_args(1, 2, "three", key1="value1", key2="value2")
(三)函数返回值
return
语句用于结束函数并返回值。函数可以不写return
,此时默认返回None
;也可返回单个值或多个值(多个值会以元组形式返回)。比如:
def calculate(a, b):
sum_result = a + b
diff_result = a - b
return sum_result, diff_result
result = calculate(5, 3)
sum_val, diff_val = calculate(5, 3) # 解包返回的元组
二、函数进阶:命名空间、作用域与嵌套
(一)命名空间
- 内置命名空间:Python 解释器运行时自带的空间,包含如
print()
、len()
等内置函数和类型。 - 全局命名空间:在 Python 文件顶层定义的变量和函数所在空间,文件内各处基本都能访问。
- 局部命名空间:函数内部定义的变量和函数所在空间,仅在函数内部有效。
(二)作用域
- 局部变量:在函数内部定义,函数执行结束后就被删除。例如:
def local_demo():
local_var = 10
print(local_var)
local_demo()
# print(local_var) # 此处会报错,local_var超出作用域
- 全局变量:在函数外部定义,可被函数内外使用。若在函数内部修改全局变量,需用
global
关键字声明。如:
global_var = 20
def modify_global():
global global_var
global_var += 10
print(global_var)
modify_global()
nonlocal
关键字:用于在内嵌函数中引用外层(非全局)变量,类似global
,但作用于嵌套函数场景。
(三)函数嵌套
函数内部可定义另一个函数,外层函数返回内层函数名时,形成闭包。闭包能让局部变量常驻内存,保护数据。比如:
def outer(x):
def inner():
return x * x
return inner
square = outer(5)
print(square())
三、函数的高级应用:装饰器、迭代器与生成器
(一)装饰器
装饰器本质是函数,能在不修改原函数代码的情况下添加额外功能。它以函数作为参数,返回一个新的替换函数。
- 简单装饰器:
def decorator(fn):
def inner():
print("Before function execution")
fn()
print("After function execution")
return inner
@decorator
def say_hello():
print("Hello!")
say_hello()
- 带参数的装饰器:由多层函数嵌套实现,最外层函数接收装饰器参数。
def repeat(n):
def decorator(fn):
def inner():
for _ in range(n):
fn()
return inner
return decorator
@repeat(3)
def greet():
print("Welcome!")
greet()
(二)迭代器
可迭代对象(如str
、list
、tuple
、set
、dict
)能使用for
循环遍历。判断对象是否可迭代可借助collections.abc
模块中的Iterable
。迭代器是实现了__iter__()
和__next__()
方法的对象,用于逐个获取数据。例如:
from collections.abc import Iterable, Iterator
my_list = [1, 2, 3]
print(isinstance(my_list, Iterable)) # True
my_iter = iter(my_list)
print(isinstance(my_iter, Iterator)) # True
print(next(my_iter)) # 1
(三)生成器
函数中若包含yield
关键字,就是生成器函数。生成器是一种特殊的迭代器,按需生成数据,节省内存。
- 生成器函数:
def number_generator():
for i in range(1, 4):
yield i
gen = number_generator()
print(next(gen)) # 1
print(next(gen)) # 2
- 生成器推导式:类似列表推导式,但用圆括号。
even_gen = (i for i in range(1, 10) if i % 2 == 0)
print(next(even_gen)) # 2
四、其他函数类型:匿名函数与偏函数
(一)匿名函数
使用lambda
表达式创建,无函数名,适用于临时简单函数。语法为lambda 参数列表: 表达式
,只有一个返回值和一句代码。例如:
add = lambda x, y: x + y
print(add(3, 5)) # 8
匿名函数还可作为参数传递给其他函数,在排序、映射等操作中广泛应用。
(二)偏函数
用于固定已有函数的部分参数,简化函数调用。通过functools.partial
实现,也可自定义。比如:
from functools import partial
def add(a, b, c):
return a + b + c
add_five = partial(add, c=5)
print(add_five(1, 2)) # 8
五、内建函数:Python 的强大工具集
Python 提供众多内建函数,如eval()
、exec()
、compile()
、map()
、filter()
、zip()
等,能高效处理各种任务。
eval()
函数:将字符串当作表达式求值。例如:
num = 2
result = eval("num * 3 + num ** 2")
print(result) # 10
map()
函数:对迭代对象每个元素应用指定函数,返回结果迭代器。
my_list = [1, 2, 3]
new_list = list(map(lambda x: x * 2, my_list))
print(new_list) # [2, 4, 6]
zip()
函数:将多个可迭代对象元素打包成元组。
list1 = [1, 2, 3]
list2 = ["a", "b", "c"]
zipped = list(zip(list1, list2))
print(zipped) # [(1, 'a'), (2, 'b'), (3, 'c')]
Python 函数功能丰富、应用广泛。从基础的定义和参数传递,到进阶的装饰器和生成器,再到各种内建函数,掌握这些知识能显著提升编程能力,编写出更高效、优雅的代码。