函数(Function)是 Python 编程的核心基石。它将一段可重复使用的代码封装起来,让程序结构更清晰、维护更方便。掌握函数是从小白迈向进阶的关键一步。一、什么是函数?
函数是一段组织好的、可重复使用的、用来实现单一或相关联功能的代码段。为什么使用函数?
- 代码复用:写一次,多次调用。
- 模块化:将大问题分解为小问题。
- 易于维护:修改逻辑只需改一处。
- 隐藏细节:调用者无需关心内部实现。
二、函数的定义与调用
1. 基本语法
使用 def 关键字定义函数。
def 函数名 (参数): """文档字符串(可选)""" # 函数体 return 返回值 # 可选
2. 示例
def greet(name): """向用户打招呼""" print(f"Hello, {name}!")# 调用函数greet("Alice") # 输出:Hello, Alice!
三、函数的参数详解
Python 的函数参数非常灵活,支持多种传递方式。
1. 位置参数 (Positional Arguments)
按顺序传递参数。
def add(a, b): return a + bprint(add(1, 2)) # 3
2. 关键字参数 (Keyword Arguments)
通过参数名传递,顺序可以打乱。
def introduce(name, age): print(f"{name} is {age} years old.")introduce(age=25, name="Bob") # Bob is 25 years old.
3. 默认参数 (Default Arguments)
调用时如果不传参,则使用默认值。
def power(x, n=2): return x ** nprint(power(3)) # 9 (n 默认为 2)print(power(3, 3)) # 27
⚠️ 避坑指南:默认参数必须是不可变对象(如数字、字符串、元组)。不要使用列表或字典作为默认参数!# ❌ 错误写法def append_list(val, list_param=[]): list_param.append(val) return list_param# ✅ 正确写法def append_list(val, list_param=None): if list_param is None: list_param = [] list_param.append(val) return list_param
4. 可变参数 (*args 和 **kwargs)
*args:接收任意数量的位置参数,打包成元组。**kwargs:接收任意数量的关键字参数,打包成字典。
def demo(*args, **kwargs): print("位置参数:", args) print("关键字参数:", kwargs)demo(1, 2, 3, name="Alice", age=20)# 输出:# 位置参数:(1, 2, 3)# 关键字参数:{'name': 'Alice', 'age': 20}
5. 参数传递顺序
定义函数时,参数顺序必须遵循: **位置参数 -> 默认参数 -> *args -> 关键字参数 -> kwargs
def complex_func(a, b=10, *args, c, **kwargs): pass
四、函数的返回值
- 使用
return 语句返回值。 - 如果没有
return 或 return 后无值,默认返回 None。 - 可以返回多个值(实际上是返回一个元组)。
def get_info(): return "Alice", 25, "Engineer"name, age, job = get_info() # 元组解包print(name, age, job)
五、变量的作用域 (Scope)
Python 遵循 LEGB 规则查找变量:
- Local (局部作用域)
- Enclosing (嵌套作用域)
- Global (全局作用域)
- Built-in (内置作用域)
1. 局部与全局
x = 100 # 全局变量def func(): x = 5 # 局部变量 print(x)func() # 5print(x) # 100
2. global 关键字
在函数内修改全局变量需声明 global。
count = 0def increment(): global count count += 1increment()print(count) # 1
3. nonlocal 关键字
在嵌套函数中修改外层函数的变量。
def outer(): num = 10 def inner(): nonlocal num num = 20 inner() print(num) # 20outer()
六、高级函数特性
1. 匿名函数 (lambda)
适用于简单的单行函数逻辑。
# 普通函数def square(x): return x * x# lambda 函数square_lambda = lambda x: x * xprint(square_lambda(5)) # 25# 常用于排序data = [(1, 'a'), (3, 'c'), (2, 'b')]data.sort(key=lambda x: x[0])
2. 类型注解 (Type Hinting)
Python 3.5+ 支持,帮助 IDE 提示和代码阅读,不强制检查。
def add(a: int, b: int) -> int: return a + b
3. 文档字符串 (Docstring)
使用三引号编写函数说明,可通过 help() 查看。
def multiply(x, y): """返回两个数的乘积""" return x * yhelp(multiply)
七、常见面试/实战考点
参数解包示例
def show(a, b, c): print(a, b, c)args = [1, 2, 3]show(*args) # 相当于 show(1, 2, 3)kwargs = {'a': 1, 'b': 2, 'c': 3}show(**kwargs)
八、实战练习
练习 1:编写一个计算器函数
支持加减乘除,除数为 0 时返回错误提示。
def calculate(a, b, op='+'): if op == '+': return a + b elif op == '-': return a - b elif op == '*': return a * b elif op == '/': if b == 0: return "Error: Division by zero" return a / b else: return "Error: Unknown operator"print(calculate(10, 5, '/')) # 2.0
练习 2:统计函数执行时间(装饰器雏形)
import timedef run_time(func): def wrapper(*args, **kwargs): start = time.time() result = func(*args, **kwargs) end = time.time() print(f"{func.__name__} 运行时间:{end - start:.4f}s") return result return wrapper@run_timedef slow_task(): time.sleep(1)slow_task()
九、总结