Python中函数和异常详解
目录
一、函数(Function)
1.1 函数的定义与调用
函数是一段可重复使用的代码块,通过def关键字定义。基本语法如下:
def function_name(parameters):
函数体
return result
例如,定义一个计算两数之和的函数:
python
def add(a, b):
"""返回两个数的和"""
return a + b
# 调用函数
result = add(3, 5)
print(result) # 输出 8
1.2 参数类型
Python函数的参数非常灵活,支持多种形式:
1. 位置参数
调用时按照位置顺序传递参数。
python
def greet(name, greeting):
return f"{greeting}, {name}!"
print(greet("Alice", "Hello")) # Hello, Alice!
2. 默认参数
为参数提供默认值,调用时可省略。
python
def greet(name, greeting="Hello"):
return f"{greeting}, {name}!"
print(greet("Bob")) # Hello, Bob!
print(greet("Bob", "Hi")) # Hi, Bob!
注意:默认参数必须是不可变对象(如None、数字、字符串、元组)。
3. 关键字参数
调用时明确指定参数名,顺序可以打乱。
python
print(greet(greeting="Hey", name="Charlie")) # Hey, Charlie!
4. 可变参数
*args:接收任意多个位置参数,打包成元组。
**kwargs:接收任意多个关键字参数,打包成字典。
python
def print_args(*args, **kwargs):
print("位置参数:", args)
print("关键字参数:", kwargs)
print_args(1, 2, 3, name="Alice", age=25)
# 位置参数: (1, 2, 3)
# 关键字参数: {'name': 'Alice', 'age': 25}
5. 参数组合顺序
在定义函数时,参数的顺序应为:位置参数 ->默认参数 ->*args ->关键字参数 ->**kwargs**。
1.3 返回值
函数使用return返回结果。若没有return,默认返回None。return可以返回多个值(实际上是一个元组)。
python
def min_max(numbers):
return min(numbers), max(numbers)
min_val, max_val = min_max([4, 2, 9, 1])
print(min_val, max_val) # 1 9
1.4 作用域
Python函数有自己的作用域。在函数内部定义的变量是局部变量,外部无法访问;但可以访问外部(全局)变量。
python
x = 10 # 全局变量
def func():
y = 5 # 局部变量
print(x) # 可以访问全局变量
func()
print(y) # 报错:NameError: name 'y' is not defined
若要在函数内修改全局变量,需使用global关键字:
python
count = 0
def increment():
global count
count += 1
increment()
print(count) # 1
1.5 嵌套函数与闭包
函数内部可以定义函数,称为嵌套函数。内部函数可以访问外部函数的变量,这种特性在闭包中非常有用。
python
def outer(x):
def inner(y):
return x + y
return inner
add_five = outer(5)
print(add_five(3)) # 8
1.6 匿名函数(lambda)
lambda表达式用于创建简单的单行函数,语法为lambda 参数: 表达式。
python
square = lambda x: x ** 2
print(square(4)) # 16
# 常用于高阶函数
nums = [1, 2, 3, 4]
squared = list(map(lambda x: x**2, nums))
print(squared) # [1, 4, 9, 16]
1.7 装饰器(Decorator)
装饰器是一种高级用法,它可以在不修改原函数代码的情况下,为函数添加额外功能。本质上是一个返回函数的函数。
python
def timer(func):
import time
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(duration):
time.sleep(duration)
二、异常处理(Exception Handling)
程序运行过程中难免遇到错误,异常处理机制让我们可以捕获并处理这些错误,防止程序崩溃。
2.1 异常的基本结构
Python使用try...except...else...finally来捕获和处理异常。
python
try:
# 可能引发异常的代码
result = 10 / 0
except ZeroDivisionError:
# 处理特定异常
print("除数不能为零!")
except Exception as e:
# 处理其他所有异常
print(f"发生异常: {e}")
else:
# 没有发生异常时执行
print("计算成功,结果是:", result)
finally:
# 无论是否发生异常都会执行
print("执行结束")
输出:
除数不能为零!
执行结束
2.2 常见内置异常
ZeroDivisionError:除零错误
IndexError:索引越界
KeyError:字典键不存在
ValueError:值错误
TypeError:类型错误
FileNotFoundError:文件不存在
AttributeError:属性错误
ImportError:导入错误
2.3 抛出异常(raise)
我们可以使用raise主动抛出异常,通常用于检查条件不满足时。
python
def divide(a, b):
if b == 0:
raise ValueError("除数不能为零")
return a / b
try:
divide(10, 0)
except ValueError as e:
print(e) # 除数不能为零
2.4 自定义异常
通过继承Exception类,可以定义自己的异常类型,使代码更具可读性。
python
class InsufficientFundsError(Exception):
"""账户余额不足异常"""
pass
def withdraw(balance, amount):
if amount > balance:
raise InsufficientFundsError(f"余额不足,当前余额: {balance}")
return balance - amount
try:
new_balance = withdraw(100, 200)
except InsufficientFundsError as e:
print(e)
2.5 else与finally的使用场景
**else**:当try块没有抛出异常时执行,通常用于放置依赖try成功执行的代码。
**finally**:无论是否异常都会执行,常用于释放资源(如关闭文件、数据库连接)。
python
try:
f = open("data.txt", "r")
data = f.read()
except FileNotFoundError:
print("文件不存在")
else:
print("文件读取成功,内容长度:", len(data))
finally:
f.close() # 确保文件被关闭
2.6 异常链与raise ... from
Python 3引入了异常链,允许在捕获一个异常时抛出另一个异常,并保留原始异常信息。
python
try:
int("abc")
except ValueError as e:
raise RuntimeError("转换失败") from e
输出会显示原始异常和当前异常的关系。
三、函数与异常的综合应用
3.1 在函数内部处理异常
函数可以封装异常处理逻辑,对外提供更清晰的接口。
python
def safe_divide(a, b):
try:
return a / b
except ZeroDivisionError:
return None
result = safe_divide(10, 0)
if result is None:
print("除零错误")
else:
print("结果:", result)
3.2 异常传递
如果函数内部不处理异常,异常会向调用者传递。
python
def read_file(filename):
with open(filename, 'r') as f:
return f.read()
try:
content = read_file("missing.txt")
except FileNotFoundError:
print("文件不存在,请检查路径")
3.3 断言(assert)与异常
assert用于调试时检查条件,条件为False时抛出AssertionError。
python
def set_age(age):
assert age > 0, "年龄必须为正数"
print(f"年龄设置为 {age}")
set_age(-5) # AssertionError: 年龄必须为正数
四、总结
本文详细介绍了Python中函数和异常处理的核心概念。希望这篇文章对你有所帮助,欢迎在评论区交流讨论!
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)