Python中的函数
文章目录
Python 函数完全指南
本文档系统讲解 Python 函数的核心知识,从零基础入门到高级应用,适合初学者学习和开发者复习。
一、函数基础概念
1.1 什么是函数
函数(Function) 是一段可重复使用的代码块,用于完成特定任务。通过将代码封装成函数,我们可以:
- 避免重复代码:写一次,多次调用
- 提高代码可读性:用有意义的函数名代替复杂逻辑
- 便于维护:修改一处,全局生效
- 模块化编程:将大问题分解为小问题
1.2 函数的分类
| 类型 | 说明 | 示例 |
|---|---|---|
| 内置函数 | Python 自带的函数 | print(), len(), range() |
| 自定义函数 | 用户自己定义的函数 | def my_func(): ... |
| 匿名函数 | 没有名字的简单函数 | lambda x: x + 1 |
| 高阶函数 | 接收或返回函数的函数 | map(), filter(), sorted() |
1.3 函数的核心要素
一个完整的函数包含:
- 函数名:标识函数的名称
- 参数:函数接收的输入数据(可选)
- 函数体:实现功能的代码块
- 返回值:函数执行后的输出结果(可选)
# 函数名: greet
# 参数: name
# 函数体: 打印问候语
# 返回值: 无(默认返回 None)
def greet(name):
print(f"Hello, {name}!")
二、定义函数的语法
2.1 基本语法
使用 def 关键字定义函数:
def 函数名(参数1, 参数2, ...):
"""文档字符串(可选):说明函数的功能"""
# 函数体
# 执行语句
return 返回值 # 可选
2.2 最简单的函数
# 无参数,无返回值
def say_hello():
print("Hello, World!")
# 调用函数
say_hello() # 输出: Hello, World!
2.3 带参数的函数
# 一个参数
def greet(name):
print(f"Hello, {name}!")
greet("Alice") # 输出: Hello, Alice!
greet("Bob") # 输出: Hello, Bob!
2.4 带返回值的函数
def add(a, b):
"""计算两个数的和"""
result = a + b
return result
# 调用并接收返回值
sum_result = add(3, 5)
print(sum_result) # 输出: 8
# 也可以直接打印
print(add(10, 20)) # 输出: 30
2.5 文档字符串(Docstring)
良好的函数应该包含文档说明,使用三引号 ''' 或 """:
def calculate_area(length, width):
"""
计算矩形的面积。
参数:
length (float): 矩形的长度
width (float): 矩形的宽度
返回:
float: 矩形的面积
示例:
>>> calculate_area(5, 3)
15
"""
return length * width
# 查看文档
help(calculate_area)
print(calculate_area.__doc__)
三、函数参数详解
Python 函数的参数非常灵活,支持多种形式。
3.1 位置参数(Positional Arguments)
按照定义的顺序传递参数,是最常见的参数形式。
def introduce(name, age, city):
print(f"我叫{name},今年{age}岁,来自{city}")
# 按位置传递
introduce("张三", 25, "北京")
# 输出: 我叫张三,今年25岁,来自北京
注意:位置参数必须按顺序传递,顺序错了结果就错了。
3.2 关键字参数(Keyword Arguments)
通过 参数名=值 的形式传递,可以不按顺序。
def introduce(name, age, city):
print(f"我叫{name},今年{age}岁,来自{city}")
# 使用关键字参数,顺序可以任意
introduce(age=25, city="北京", name="张三")
# 输出: 我叫张三,今年25岁,来自北京
# 混合使用:位置参数在前,关键字参数在后
introduce("张三", city="北京", age=25)
规则:位置参数必须在关键字参数之前!
# ❌ 错误:关键字参数不能在位置参数前面
introduce(name="张三", 25, "北京") # SyntaxError
3.3 默认参数(Default Arguments)
为参数设置默认值,调用时可以不传。
def greet(name, greeting="Hello"):
print(f"{greeting}, {name}!")
# 使用默认值
greet("Alice") # 输出: Hello, Alice!
# 覆盖默认值
greet("Bob", "Hi") # 输出: Hi, Bob!
greet("Carol", greeting="Good morning") # 输出: Good morning, Carol!
重要警告:默认参数不要使用可变对象(列表、字典等)!
# ❌ 错误示例
def add_item(item, items=[]):
items.append(item)
return items
print(add_item(1)) # [1]
print(add_item(2)) # [1, 2] 不是 [2]!
# ✅ 正确做法
def add_item(item, items=None):
if items is None:
items = []
items.append(item)
return items
print(add_item(1)) # [1]
print(add_item(2)) # [2]
3.4 可变参数 *args
接收任意数量的位置参数,在函数内部以元组形式存在。
def sum_all(*numbers):
"""计算所有参数的和"""
result = 0
for num in numbers:
result += num
return result
# 调用时可以传任意个数
print(sum_all()) # 0
print(sum_all(1)) # 1
print(sum_all(1, 2, 3)) # 6
print(sum_all(1, 2, 3, 4, 5)) # 15
*args 的本质:
def demo(*args):
print(type(args)) # <class 'tuple'>
print(args) # (1, 2, 3)
demo(1, 2, 3)
命名习惯:叫 args 是约定,可以改。
3.5 可变关键字参数 **kwargs
接收任意数量的关键字参数,在函数内部以字典形式存在。
def print_info(**kwargs):
"""打印所有关键字参数"""
for key, value in kwargs.items():
print(f"{key}: {value}")
print_info(name="张三", age=25, city="北京")
# 输出:
# name: 张三
# age: 25
# city: 北京
**kwargs 的本质:
def demo(**kwargs):
print(type(kwargs)) # <class 'dict'>
print(kwargs) # {'a': 1, 'b': 2}
demo(a=1, b=2)
3.6 参数组合顺序
定义函数时,参数必须按以下顺序:
def func(位置参数, *args, 默认参数, **kwargs):
pass
# 或者
def func(位置参数, 默认参数, *args, **kwargs):
pass
完整示例:
def complex_func(a, b, *args, c=10, **kwargs):
print(f"a={a}, b={b}")
print(f"args={args}")
print(f"c={c}")
print(f"kwargs={kwargs}")
complex_func(1, 2, 3, 4, 5, c=20, x=100, y=200)
# 输出:
# a=1, b=2
# args=(3, 4, 5)
# c=20
# kwargs={'x': 100, 'y': 200}
3.7 解包参数
调用函数时,可以用 * 和 ** 解包序列和字典。
def add(a, b, c):
return a + b + c
# 列表解包
nums = [1, 2, 3]
print(add(*nums)) # 等价于 add(1, 2, 3),输出: 6
# 字典解包
data = {'a': 1, 'b': 2, 'c': 3}
print(add(**data)) # 等价于 add(a=1, b=2, c=3),输出: 6
四、函数返回值
4.1 单个返回值
使用 return 语句返回一个值。
def square(x):
return x ** 2
result = square(5)
print(result) # 25
4.2 多个返回值
Python 函数可以返回多个值,实际上是返回一个元组。
def get_min_max(numbers):
"""返回列表中的最小值和最大值"""
return min(numbers), max(numbers)
# 接收多个返回值
min_val, max_val = get_min_max([3, 1, 4, 1, 5, 9])
print(min_val, max_val) # 1 9
# 实际上返回的是元组
result = get_min_max([3, 1, 4])
print(result) # (1, 4)
print(type(result)) # <class 'tuple'>
4.3 没有返回值
如果函数没有 return 语句,或者只有 return 没有值,默认返回 None。
def say_hello():
print("Hello!")
# 没有 return
result = say_hello()
print(result) # None
def check_positive(num):
if num > 0:
return "正数"
# 负数时没有返回值
print(check_positive(5)) # 正数
print(check_positive(-5)) # None
4.4 提前返回
使用 return 可以提前结束函数执行。
def divide(a, b):
"""安全除法"""
if b == 0:
return "错误:除数不能为0" # 提前返回
return a / b
print(divide(10, 2)) # 5.0
print(divide(10, 0)) # 错误:除数不能为0
五、变量作用域
5.1 局部变量与全局变量
# 全局变量
global_var = "我是全局变量"
def my_func():
# 局部变量
local_var = "我是局部变量"
print(local_var) # 可以访问局部变量
print(global_var) # 可以访问全局变量
my_func()
print(global_var) # 可以访问
# print(local_var) # ❌ 错误!局部变量在函数外不可访问
5.2 global 关键字
在函数内部修改全局变量,需要使用 global 声明。
count = 0
def increment():
global count # 声明使用全局变量
count += 1
print(count)
increment() # 1
increment() # 2
print(count) # 2
不加 global 会报错:
count = 0
def wrong_increment():
count += 1 # ❌ UnboundLocalError
5.3 nonlocal 关键字
在嵌套函数中,修改外层(非全局)的变量使用 nonlocal。
def outer():
x = 10 # 外层函数的变量
def inner():
nonlocal x # 声明使用外层函数的变量
x += 1
print(f"inner: x = {x}")
inner()
print(f"outer: x = {x}")
outer()
# 输出:
# inner: x = 11
# outer: x = 11
5.4 作用域规则(LEGB)
Python 查找变量的顺序:
| 层级 | 说明 | 范围 |
|---|---|---|
| Local | 局部作用域 | 函数内部 |
| Enclosing | 嵌套作用域 | 外层函数 |
| Global | 全局作用域 | 模块级别 |
| Built-in | 内置作用域 | Python 内置 |
# 示例
x = "global" # G
def outer():
x = "enclosing" # E
def inner():
x = "local" # L
print(x) # 输出: local
inner()
print(x) # 输出: enclosing
outer()
print(x) # 输出: global
六、匿名函数(Lambda)
6.1 什么是 Lambda
Lambda 是一种匿名函数,用于创建简单的、一次性使用的小函数。
语法:
lambda 参数: 表达式
6.2 基本用法
# 普通函数
def add(x, y):
return x + y
# 等价的 lambda
add_lambda = lambda x, y: x + y
print(add(2, 3)) # 5
print(add_lambda(2, 3)) # 5
6.3 常见使用场景
Lambda 通常作为参数传递给高阶函数。
# 排序时指定 key
students = [
{'name': '张三', 'score': 85},
{'name': '李四', 'score': 92},
{'name': '王五', 'score': 78}
]
# 按分数排序
students.sort(key=lambda x: x['score'], reverse=True)
print(students)
# [{'name': '李四', 'score': 92}, {'name': '张三', 'score': 85}, ...]
6.4 Lambda 的限制
- 只能包含一个表达式
- 不能包含语句(如赋值、循环、条件判断)
- 不能写文档字符串
# ❌ 错误:lambda 不能包含语句
f = lambda x: if x > 0: return x # SyntaxError
# ✅ 正确:使用条件表达式
f = lambda x: x if x > 0 else 0
七、高阶函数
高阶函数是指接收函数作为参数,或返回函数作为结果的函数。
7.1 map() 函数
对可迭代对象的每个元素应用函数,返回迭代器。
# 将列表中的每个数平方
numbers = [1, 2, 3, 4, 5]
squared = map(lambda x: x ** 2, numbers)
print(list(squared)) # [1, 4, 9, 16, 25]
# 等价的普通写法
result = []
for x in numbers:
result.append(x ** 2)
7.2 filter() 函数
根据条件过滤可迭代对象,返回满足条件的元素。
# 筛选偶数
numbers = [1, 2, 3, 4, 5, 6]
evens = filter(lambda x: x % 2 == 0, numbers)
print(list(evens)) # [2, 4, 6]
# 筛选成年人
people = [{'name': '张三', 'age': 17}, {'name': '李四', 'age': 25}]
adults = filter(lambda p: p['age'] >= 18, people)
print(list(adults)) # [{'name': '李四', 'age': 25}]
7.3 reduce() 函数
对序列进行累积计算(需要 from functools import reduce)。
from functools import reduce
# 求积
numbers = [1, 2, 3, 4, 5]
product = reduce(lambda x, y: x * y, numbers)
print(product) # 120 (1*2*3*4*5)
# 找最大值
max_val = reduce(lambda x, y: x if x > y else y, numbers)
print(max_val) # 5
7.4 sorted() 函数
返回排序后的新列表,不改变原列表。
numbers = [3, 1, 4, 1, 5, 9]
# 默认升序
print(sorted(numbers)) # [1, 1, 3, 4, 5, 9]
# 降序
print(sorted(numbers, reverse=True)) # [9, 5, 4, 3, 1, 1]
# 按绝对值排序
print(sorted([-5, 2, -8, 1], key=abs)) # [1, 2, -5, -8]
7.5 自定义高阶函数
def apply_operation(numbers, operation):
"""对列表中的每个数应用指定操作"""
return [operation(n) for n in numbers]
# 使用
nums = [1, 2, 3, 4]
print(apply_operation(nums, lambda x: x * 2)) # [2, 4, 6, 8]
print(apply_operation(nums, lambda x: x ** 2)) # [1, 4, 9, 16]
八、函数装饰器
8.1 什么是装饰器
装饰器是一种用于修改或增强函数功能的特殊语法,本质上是一个接收函数作为参数并返回函数的高阶函数。
8.2 基本语法
@装饰器函数名
def 被装饰函数():
pass
# 等价于
def 被装饰函数():
pass
被装饰函数 = 装饰器函数名(被装饰函数)
8.3 简单装饰器示例
import time
def timer(func):
"""计算函数执行时间的装饰器"""
def wrapper(*args, **kwargs):
start = time.time()
result = func(*args, **kwargs)
elapsed = time.time() - start
print(f"{func.__name__} 执行时间: {elapsed:.4f}秒")
return result
return wrapper
@timer
def slow_function():
time.sleep(1)
return "Done"
slow_function()
# 输出: slow_function 执行时间: 1.0012秒
8.4 带参数的装饰器
def repeat(n):
"""重复执行 n 次的装饰器"""
def decorator(func):
def wrapper(*args, **kwargs):
for i in range(n):
print(f"第{i+1}次执行:")
result = func(*args, **kwargs)
return result
return wrapper
return decorator
@repeat(3)
def greet(name):
print(f"Hello, {name}!")
greet("Alice")
# 输出:
# 第1次执行:
# Hello, Alice!
# 第2次执行:
# Hello, Alice!
# 第3次执行:
# Hello, Alice!
8.5 常用内置装饰器
| 装饰器 | 作用 | 示例 |
|---|---|---|
@staticmethod |
定义静态方法 | 不需要 self 参数 |
@classmethod |
定义类方法 | 第一个参数是 cls |
@property |
将方法转为属性 | 像访问属性一样访问方法 |
class Circle:
def __init__(self, radius):
self._radius = radius
@property
def radius(self):
"""获取半径"""
return self._radius
@radius.setter
def radius(self, value):
"""设置半径"""
if value < 0:
raise ValueError("半径不能为负数")
self._radius = value
@property
def area(self):
"""计算面积(只读属性)"""
return 3.14159 * self._radius ** 2
c = Circle(5)
print(c.radius) # 5
print(c.area) # 78.53975
c.radius = 10 # 设置新半径
# c.area = 100 # ❌ 错误:不能设置只读属性
九、闭包
9.1 什么是闭包
闭包(Closure) 是指一个函数记住了其外部作用域的变量,即使外部函数已经执行完毕。
9.2 闭包示例
def make_multiplier(n):
"""创建一个乘以 n 的函数"""
def multiplier(x):
return x * n # multiplier 记住了外部的 n
return multiplier
# 创建两个闭包
times3 = make_multiplier(3)
times5 = make_multiplier(5)
print(times3(10)) # 30
print(times5(10)) # 50
9.3 闭包的应用:计数器
def make_counter():
"""创建一个计数器"""
count = 0
def counter():
nonlocal count
count += 1
return count
return counter
counter1 = make_counter()
counter2 = make_counter()
print(counter1()) # 1
print(counter1()) # 2
print(counter1()) # 3
print(counter2()) # 1(独立的计数器)
print(counter2()) # 2
9.4 闭包 vs 类
闭包可以实现类似类的功能,但更轻量:
# 使用闭包
def make_person(name, age):
def person():
return f"{name}, {age}岁"
return person
# 使用类
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def __call__(self):
return f"{self.name}, {self.age}岁"
十、递归函数
10.1 什么是递归
递归是指函数调用自身来解决问题。递归需要两个要素:
- 基准条件(Base Case):停止递归的条件
- 递归条件(Recursive Case):函数调用自身的条件
10.2 经典示例:阶乘
def factorial(n):
"""计算 n 的阶乘:n! = n * (n-1) * ... * 1"""
# 基准条件
if n <= 1:
return 1
# 递归条件
return n * factorial(n - 1)
print(factorial(5)) # 120 (5*4*3*2*1)
执行过程:
factorial(5)
= 5 * factorial(4)
= 5 * (4 * factorial(3))
= 5 * (4 * (3 * factorial(2)))
= 5 * (4 * (3 * (2 * factorial(1))))
= 5 * (4 * (3 * (2 * 1)))
= 120
10.3 经典示例:斐波那契数列
def fibonacci(n):
"""计算第 n 个斐波那契数:0, 1, 1, 2, 3, 5, 8..."""
if n <= 0:
return 0
if n == 1:
return 1
return fibonacci(n - 1) + fibonacci(n - 2)
print(fibonacci(10)) # 55
10.4 尾递归优化
普通递归有大量重复计算,可以使用记忆化优化:
from functools import lru_cache
@lru_cache(maxsize=None)
def fibonacci_fast(n):
"""带缓存的斐波那契"""
if n <= 0:
return 0
if n == 1:
return 1
return fibonacci_fast(n - 1) + fibonacci_fast(n - 2)
print(fibonacci_fast(100)) # 瞬间算出,不会栈溢出
10.5 递归的注意事项
| 问题 | 说明 |
|---|---|
| 栈溢出 | Python 默认递归深度限制为 1000,超过会报错 |
| 效率问题 | 递归通常比循环慢,有大量重复计算 |
| 可读性 | 递归代码简洁,但理解难度较大 |
修改递归深度限制(谨慎使用):
import sys
sys.setrecursionlimit(2000) # 设置为 2000
十一、生成器函数
11.1 什么是生成器
生成器(Generator) 是一种特殊的迭代器,使用 yield 关键字定义。它可以惰性生成数据,节省内存。
11.2 基本语法
def simple_generator():
yield 1
yield 2
yield 3
# 创建生成器对象
gen = simple_generator()
# 逐个获取值
print(next(gen)) # 1
print(next(gen)) # 2
print(next(gen)) # 3
# print(next(gen)) # StopIteration 异常
# 也可以用 for 循环
for value in simple_generator():
print(value) # 1, 2, 3
11.3 生成器 vs 列表
# 列表:一次性生成所有数据,占用大量内存
def get_numbers_list(n):
return [i for i in range(n)]
# 生成器:惰性生成,节省内存
def get_numbers_gen(n):
for i in range(n):
yield i
# 使用
numbers = get_numbers_gen(1000000) # 几乎不占内存
for num in numbers:
if num > 100:
break # 只生成前 101 个数就停止
11.4 生成器表达式
类似列表推导式,但使用圆括号:
# 列表推导式(立即计算)
squares_list = [x**2 for x in range(1000)] # 占用内存
# 生成器表达式(惰性计算)
squares_gen = (x**2 for x in range(1000)) # 几乎不占内存
# 使用
for square in squares_gen:
print(square)
if square > 100:
break
11.5 实用示例:斐波那契生成器
def fibonacci_gen(n):
"""生成前 n 个斐波那契数"""
a, b = 0, 1
count = 0
while count < n:
yield a
a, b = b, a + b
count += 1
# 使用
for num in fibonacci_gen(10):
print(num, end=' ') # 0 1 1 2 3 5 8 13 21 34
11.6 生成器的方法
def interactive_gen():
print("生成器启动")
while True:
received = yield "等待输入..."
print(f"收到: {received}")
# 创建生成器
gen = interactive_gen()
# 启动生成器
print(next(gen)) # 输出: 生成器启动
# 等待输入...
# 发送数据
print(gen.send("Hello")) # 输出: 收到: Hello
# 等待输入...
print(gen.send("World")) # 输出: 收到: World
# 等待输入...
十二、函数注解与类型提示
12.1 什么是类型提示
Python 3.5+ 支持类型提示(Type Hints),用于标注函数的参数类型和返回类型,提高代码可读性,便于 IDE 检查。
注意:类型提示不会在运行时强制执行,只是给开发者和工具看的。
12.2 基本语法
def greet(name: str) -> str:
"""参数 name 是字符串,返回值也是字符串"""
return f"Hello, {name}"
def add(a: int, b: int) -> int:
"""参数和返回值都是整数"""
return a + b
12.3 复杂类型
from typing import List, Dict, Optional, Union, Tuple
# 列表
def sum_list(numbers: List[int]) -> int:
return sum(numbers)
# 字典
def get_user(users: Dict[str, int], name: str) -> Optional[int]:
"""返回值可能是 int 或 None"""
return users.get(name)
# 联合类型
def parse_value(value: Union[str, int]) -> str:
"""参数可以是字符串或整数"""
return str(value)
# 元组
def get_point() -> Tuple[float, float]:
return (1.0, 2.0)
12.4 实际示例
from typing import List, Dict, Optional
from dataclasses import dataclass
@dataclass
class User:
name: str
age: int
email: Optional[str] = None
def filter_adults(users: List[User]) -> List[User]:
"""筛选成年人"""
return [u for u in users if u.age >= 18]
def get_user_emails(users: List[User]) -> Dict[str, str]:
"""获取用户邮箱字典"""
return {u.name: u.email for u in users if u.email}
# 使用
users = [
User("张三", 25, "zhangsan@example.com"),
User("李四", 17),
User("王五", 30, "wangwu@example.com")
]
adults = filter_adults(users)
print(adults) # [User(name='张三', ...), User(name='王五', ...)]
十三、函数最佳实践
13.1 函数设计原则
| 原则 | 说明 | 示例 |
|---|---|---|
| 单一职责 | 一个函数只做一件事 | calculate_area() 只计算面积 |
| 函数名有意义 | 见名知意 | get_user_by_id() 比 foo() 好 |
| 参数不宜过多 | 超过 3-4 个考虑用对象 | create_user(name, age, email) |
| 避免副作用 | 纯函数更容易测试 | 不修改全局状态 |
| 适当长度 | 函数不要太长 | 20-30 行为宜 |
13.2 命名规范
# 函数名:小写 + 下划线(snake_case)
def calculate_total_price(): pass
def get_user_by_id(): pass
# 私有函数:以下划线开头
def _internal_helper(): pass
# 常量:全大写
MAX_RETRY_COUNT = 3
# 类名:大驼峰(CamelCase)
class UserManager: pass
13.3 文档字符串规范
def process_data(data: list, threshold: float = 0.5) -> dict:
"""
处理数据并返回统计结果。
该函数接收原始数据列表,根据阈值进行过滤,
并返回包含各项统计指标的字典。
Args:
data (list): 原始数据列表,每个元素应为数值类型
threshold (float, optional): 过滤阈值,默认为 0.5
Returns:
dict: 包含以下键的字典:
- count: 数据条数
- mean: 平均值
- filtered: 过滤后的数据列表
Raises:
ValueError: 当 data 为空列表时抛出
TypeError: 当 data 中包含非数值类型时抛出
Examples:
>>> data = [1.0, 2.0, 3.0, 0.1]
>>> result = process_data(data, threshold=0.5)
>>> result['count']
3
"""
if not data:
raise ValueError("数据不能为空")
filtered = [x for x in data if x >= threshold]
return {
'count': len(filtered),
'mean': sum(filtered) / len(filtered) if filtered else 0,
'filtered': filtered
}
13.4 错误处理
def divide_safely(a: float, b: float) -> float:
"""安全除法"""
try:
if b == 0:
raise ValueError("除数不能为零")
return a / b
except TypeError:
raise TypeError("参数必须是数值类型")
except Exception as e:
print(f"未知错误: {e}")
raise
# 使用
try:
result = divide_safely(10, 0)
except ValueError as e:
print(f"错误: {e}") # 错误: 除数不能为零
十四、常见错误与调试技巧
14.1 常见错误
| 错误 | 原因 | 解决方法 |
|---|---|---|
NameError |
变量未定义 | 检查变量名拼写 |
TypeError |
类型不匹配 | 检查参数类型 |
ValueError |
值不合适 | 检查参数值 |
RecursionError |
递归深度超限 | 添加基准条件或使用循环 |
UnboundLocalError |
局部变量未赋值就使用 | 使用 global 或 nonlocal |
14.2 调试技巧
# 1. 使用 print 调试
def debug_func(x):
print(f"输入: {x}")
result = x * 2
print(f"结果: {result}")
return result
# 2. 使用 assert 断言
def divide(a, b):
assert b != 0, "除数不能为零"
return a / b
# 3. 使用 logging 模块
import logging
logging.basicConfig(level=logging.DEBUG)
def logged_func(x):
logging.debug(f"处理: {x}")
return x ** 2
# 4. 使用 IDE 调试器
# PyCharm/VS Code 都支持断点调试
十五、总结与速查表
函数定义速查
# 基本函数
def func(): pass
# 带参数
def func(a, b): pass
# 默认参数
def func(a, b=10): pass
# 可变参数
def func(*args): pass # 位置参数元组
def func(**kwargs): pass # 关键字参数字典
def func(*args, **kwargs): pass # 两者都有
# 返回值
def func():
return 1 # 单个返回值
def func():
return 1, 2, 3 # 多个返回值(元组)
参数传递速查
| 调用方式 | 示例 |
|---|---|
| 位置参数 | func(1, 2) |
| 关键字参数 | func(a=1, b=2) |
| 混合调用 | func(1, b=2) |
| 解包列表 | func(*[1, 2]) |
| 解包字典 | func(**{'a': 1, 'b': 2}) |
高级特性速查
| 特性 | 语法 | 用途 |
|---|---|---|
| Lambda | lambda x: x + 1 |
简单匿名函数 |
| 装饰器 | @decorator |
增强函数功能 |
| 生成器 | yield value |
惰性生成数据 |
| 递归 | 函数调用自身 | 解决分治问题 |
| 闭包 | 嵌套函数 | 记住外部变量 |
更多推荐

所有评论(0)