函数定义、调用、闭包

发布时间 2023-07-08 18:09:50作者: Allen_Hao

函数的语法及调用步骤

函数是直接在模块/py文件中定义的,与类方法、实例方法有区别。

 1 '''
 2 一、 函数的语法:
 3 def function_name(parameter1, parameter2, ...):
 4     """函数文档字符串"""
 5     # 函数体代码块
 6     # ...
 7     return value  # 可选的返回值
 8 
 9 1. 使用def关键字定义函数,并给函数指定一个名称。
10 2. 在函数名称后面跟着一对小括号,括号内可以包含零个或多个参数(也称为形式参数)。
11 3. 冒号:表示函数定义的结束,接下来是函数体的代码块,缩进表示属于函数的代码部分。
12 4. 函数体中的代码可以执行任意操作,包括条件语句、循环、变量赋值等。
13 5. 可以使用return语句来指定函数的返回值。如果没有return语句,函数将默认返回None
14 
15 二、 函数的使用步骤:
16     1. 定义函数
17     2. 调用函数
18 '''
19 
20 # 1. 定义函数:有返回值
21 def add_numbers(x, y=0):
22     """返回两个数的和"""
23     return x + y
24 # 2. 调用函数
25 result = add_numbers(3, 4)  # 调用函数,传递两个参数,输出: 7
26 print(result)
27 
28 # 定义函数:无返回值
29 def greet(name):
30     """打印问候语"""
31     print(f"Hello, {name}!")
32 
33 greet("Alice")  # 调用函数,输出: Hello, Alice!

 

函数的嵌套及闭包

闭包的定义:闭包是一个函数对象,它包含了在定义它的环境中捕获的自由变量(外部函数中定义的变量)。

在Python中,当一个内部函数引用了外部函数的变量,并且这个内部函数在外部函数之外被调用时,就创建了一个闭包。其特点:

  1. 内部函数引用了外部函数的变量。
  2. 外部函数返回内部函数。
  3. 内部函数在外部函数之外被调用。
'''
函数的嵌套:
最佳实践:
    1. 保持函数简洁和可读性: 函数应该尽量保持简短和专注,执行单一的任务。避免在一个函数中嵌套过多的函数,以免降低代码的可读性。
    2. 提高代码的模块化性: 使用函数嵌套将代码分解为更小的、可重用的部分,提高代码的模块化性。这样可以使代码更易于理解、测试和维护。
    3. 合理使用闭包: 当需要在内部函数中访问外部函数的变量并保持对其的引用时,可以使用闭包。但要注意闭包可能导致变量的生命周期延长,可能会占用更多的内存空间。因此,仅在需要时才使用闭包,并确保不会出现意外的副作用。
    4. 使用函数参数传递数据: 如果内部函数需要外部函数的数据,应该通过函数参数进行传递,而不是直接访问外部函数的变量。这样可以更清晰地表示数据流动和依赖关系,并提高函数的可测试性和可维护性。

def outer_function():
    """外部函数"""
    print("执行外部函数")

    def inner_function():
        """内部函数"""
        print("执行内部函数")

    inner_function()  # 在外部函数中调用内部函数

outer_function()  # 调用外部函数,输出: 执行外部函数\n执行内部函数

闭包:
def outer_function(x):
    """外部函数"""
    def inner_function(y):
        """内部函数"""
        return x + y  # 访问外部函数的变量

    return inner_function  # 返回内部函数作为闭包

closure = outer_function(5)  # 调用外部函数,返回闭包
result = closure(3)  # 调用闭包,输出: 8

'''

# 需要注意的是,内部函数只能在外部函数内部访问,无法从外部函数之外直接调用。
# 这种封装可以防止内部函数与外部代码发生命名冲突,并隐藏内部实现的细节。
def outer_function():
    """外部函数"""
    print("执行外部函数")

    def inner_function():
        """内部函数"""
        print("执行内部函数")

    inner_function()  # 在外部函数中调用内部函数

outer_function()  # 调用外部函数,输出: 执行外部函数\n执行内部函数

# 2, 闭包
'''
outer_function接受一个参数x并返回一个闭包。
闭包inner_function访问了外部函数的变量x,并使用它来计算传入的参数y与x的和。我们可以将外部函数调用后返回的闭包赋值给一个变量closure,然后通过调用closure来执行闭包。
'''
def outer_function(x):
    """外部函数"""
    def inner_function(y):
        """内部函数"""
        return x + y  # 访问外部函数的变量,闭包特点1

    return inner_function  # 返回内部函数作为闭包,闭包特点2

closure = outer_function(5)  # 调用外部函数,返回闭包,x=5
result = closure(3)  # 调用闭包,y=3, x+y = 5 + 3输出: 8  闭包特点3