开放的编程资料库

当前位置:我爱分享网 > Python教程 > 正文

Python 闭包

Python闭包教程展示了如何在Python中使用闭包函数。

Python函数是一等公民。这意味着函数与Python中的其他对象具有同等地位。函数可以分配给变量、存储在集合中、动态创建和删除,或者作为参数传递。

嵌套函数,也称为内部函数,是在另一个函数中定义的函数。

#!/usr/bin/python

def main():

    def build_message(name):

        msg = f'Hello {name}'
        return msg

    name = input("Enter your name: ")
    msg = build_message(name)

    print(msg)


if __name__ == "__main__":
    main()

build_message是一个嵌套函数。它在其外部main函数中定义和调用。

Python闭包

闭包是一个嵌套函数,它可以从已完成执行的封闭函数访问自由变量。Python闭包的三个特征是:

  • 它是一个嵌套函数
  • 它可以访问外部作用域中的一个自由变量
  • 它是从封闭函数返回的

自由变量是未绑定在本地范围内的变量。为了使闭包能够处理数字和字符串等不可变变量,我们必须使用非本地关键字。

Python闭包有助于避免使用全局值并提供某种形式的数据隐藏。它们用于Python装饰器。

Python简单闭包示例

下面是一个简单的Python闭包示例。

#!/usr/bin/python

def make_printer(msg):

    msg = "hi there"

    def printer():
        print(msg)

    return printer


myprinter = make_printer("Hello there")
myprinter()
myprinter()
myprinter()

在示例中,我们有一个make_printer函数,它创建并返回一个函数。嵌套的printer函数是闭包。

myprinter = make_printer("Hello there")

make_printer函数返回一个printer函数并将其分配给myprinter变量。此时,它已经执行完毕。但是,printer闭包仍然可以访问msg变量。

$ ./simple_closure.py
hi there
hi there
hi there

带有非本地关键字的Python闭包

nonlocal关键字允许我们在外部函数范围内修改具有不可变类型的变量。

#!/usr/bin/python

def make_counter():

    count = 0
    def inner():

        nonlocal count
        count += 1
        return count

    return inner


counter = make_counter()

c = counter()
print(c)

c = counter()
print(c)

c = counter()
print(c)

该示例创建了一个计数器函数。

def make_counter():

    count = 0
    def inner():

        nonlocal count
        count += 1
        return count

    return inner

通过使用nonlocal关键字,count变量成为一个自由变量。现在我们可以修改它了。

$ ./counter.py
1
2
3

Python闭包与类

Python闭包可以作为小类的替代解决方案。

#!/usr/bin/python

class Summer():

    def __init__(self):
        self.data = []

    def __call__(self, val):

        self.data.append(val)
        _sum = sum(self.data)

        return _sum

summer = Summer()

s = summer(1)
print(s)

s = summer(2)
print(s)

s = summer(3)
print(s)

s = summer(4)
print(s)

我们有一个Summer类,它对传递给对象的值求和。

def __init__(self):
    self.data = []

数据保存在对象属性中,并在构造函数中创建。

def __call__(self, val):

    self.data.append(val)
    _sum = sum(self.data)

    return _sum

每次调用实例时,都会附加值并计算并返回总和。

以下是使用Python闭包的替代解决方案。

#!/usr/bin/python

def make_summer():

    data = []

    def summer(val):

        data.append(val)
        _sum = sum(data)

        return _sum

    return summer

summer = make_summer()

s = summer(1)
print(s)

s = summer(2)
print(s)

s = summer(3)
print(s)

s = summer(4)
print(s)

我们与Python闭包具有相同的功能。

def make_summer():

    data = []

    def summer(val):

        data.append(val)
        _sum = sum(data)

        return _sum

    return summer

因为data是一个可变的列表,我们不必使用nonlocal关键字。

在本教程中,我们使用了Python闭包。

列出所有Python教程。

未经允许不得转载:我爱分享网 » Python 闭包

感觉很棒!可以赞赏支持我哟~

赞(0) 打赏