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. 常见错误
修改可变默认参数
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
混淆return和print
def add(a, b): print(a + b) # 输出结果但没有返回值 result = add(2, 3) # result是None
作用域错误
x = 10 def func(): print(x) # 在赋值前引用局部变量x x = 20 # 正确做法: 使用global或避免同名变量
总结
Python函数是代码组织和重用的基本单元,具有以下特点:
- 参数灵活:支持位置参数、默认参数、可变参数等
- 一等公民:函数可以作为参数传递和返回
- 装饰器:提供强大的元编程能力
- 闭包:可以捕获和保持状态
- 文档支持:通过docstring提供说明
掌握函数的高级用法可以显著提高代码质量和开发效率。合理使用装饰器、闭包和lambda等特性能让代码更加简洁优雅。