目录

一、函数(Function)

1.1 函数的定义与调用

1.2 参数类型

1.3 返回值

1.4 作用域

1.5 嵌套函数与闭包

1.6 匿名函数(lambda)

1.7 装饰器(Decorator)

二、异常处理(Exception Handling)

2.1 异常的基本结构

2.2 常见内置异常

2.3 抛出异常(raise)

2.4 自定义异常

2.5 else与finally的使用场景

2.6 异常链与raise ... from

三、函数与异常的综合应用

3.1 在函数内部处理异常

3.2 异常传递

3.3 断言(assert)与异常

 四、总结


一、函数(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中函数和异常处理的核心概念。希望这篇文章对你有所帮助,欢迎在评论区交流讨论!

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐