python 闭包、偏函数、数据锁定

发布时间 2023-05-04 16:50:14作者: 云淡#风清
闭包(Closure)是指在一个函数内部定义另外一个函数,并且这个内部函数可以访问外部函数中的变量。通常情况下,当外部函数执行完毕后,局部变量会被销毁,但是闭包可以使得外部函数执行完毕后,其内部函数仍然可以访问外部函数的局部变量。比如下面这个例子:
def outer(x):
    def inner(y):
        return x + y
    return inner

closure = outer(10)
print(closure(5))  # 输出 15

在这个例子中,outer 函数返回了 inner 函数。当我们调用 outer(10) 时,相当于创建了一个新的函数对象 closure,它可以接收一个参数并返回该参数与 outer 函数参数 x 的和。因为 closure 函数是由 inner 函数定义而来,所以它可以访问 outer 函数的局部变量 x

生活中的例子:厨师在炒菜的时候,需要用到各种调料,这些调料就像外部函数的局部变量一样。如果每次都重新去取调料,效率会非常低下。所以,他们通常会把调料放在锅边或者切菜板上,方便下一次使用。

偏函数(Partial Function)是指将一个函数的某些参数固定下来,返回一个新的函数。这个新的函数可以接收剩余的参数,并使用原始函数与固定参数一起计算结果。比如下面这个例子:

from functools import partial

def power(base, exponent):
    return base ** exponent

square = partial(power, exponent=2)
cube = partial(power, exponent=3)

print(square(4))  # 输出 16
print(cube(4))  # 输出 64

在这个例子中,power 函数将一个数的指定次幂作为其返回值。通过 functools.partial 函数,我们分别创建了新的函数 squarecube,它们都是由 power 函数定义而来。square 函数固定了参数 exponent=2,所以当我们调用 square(4) 时,相当于调用 power(4, 2)cube 函数固定了参数 exponent=3,所以当我们调用 cube(4) 时,相当于调用 power(4, 3)

生活中的例子:类似于批萨店上菜前加工制作好的半成品,如预先烤好的饼皮,提前切好的配料等等。因为这些共同的部分已经被处理好了,只需要根据不同的需求进行组合即可。

数据锁定(Data Encapsulation)是指将数据和方法封装在一个类中,并对外部程序隐藏数据和方法的实现细节,只提供接口供外部程序使用。这种保护数据不被随意访问的机制被称为“封装”。在 Python 中,我们可以使用属性(Property)来实现数据锁定。比如下面这个例子:

class BankAccount:
    def __init__(self, balance):
        self.__balance = balance

    @property
    def balance(self):
        return self.__balance

    def deposit(self, amount):
        self.__balance += amount

    def withdraw(self, amount):
        if amount > self.__balance:
            raise ValueError("Insufficient funds")
        self.__balance -= amount

在这个例子中,我们创建了一个 BankAccount 类,其中有一个私有变量 __balance 表示账户余额,以及三个公有方法 depositwithdrawbalancedeposit 方法用于存款,withdraw 方法用于取

钱,balance 方法用于查询余额。注意到 __balance 变量前面有两个下划线,这是 Python 中一种特殊的命名方式,它会将变量名改为 _类名__变量名,从而避免变量被外部程序直接访问。然后我们使用 @property 装饰器将 balance 方法转换为属性,这样当程序调用 account.balance 时,实际上是在调用 balance 方法。

生活中的例子:类似于银行账户或者保险箱等机构,需要提供安全的存储和访问方式。只有持有正确密钥或者密码才能够进行相关操作。

总结:

  • 闭包(Closure):内部函数可以访问外部函数中的变量,可以用来实现类似于“记忆化”或者“延迟计算”的功能,也可以用来进行装饰器的编写。
  • 偏函数(Partial Function):将一个函数的某些参数固定下来,返回一个新的函数,可以在需要多次调用一个函数时,避免反复输入相同的参数,提高了代码的可读性和效率。
  • 数据锁定(Data Encapsulation):封装数据和方法,并对外部程序隐藏实现细节,只提供接口供外部程序使用,可以保护数据不被随意访问,提高程序的安全性和可扩展性。

生活中的例子

  • 闭包:类似于厨师在烹饪过程中,需要不断取用各种调料的场景,每次都重新去取调料会浪费时间和精力,而将调料放在锅边或者切菜板上,方便下一次使用,则可以提高效率和体验。
  • 偏函数:类似于批萨店制作半成品的场景,如预先烤好的饼皮,提前切好的配料等等。这些共同的部分已经被处理好了,只需要根据不同的需求进行组合即可,可以提高工作效率和质量。
  • 数据锁定:类似于银行账户或者保险箱等机构,需要提供安全的存储和访问方式。只有持有正确密钥或者密码才能够进行相关操作,可以保障数据的安全性和私密性