闭包(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
函数,我们分别创建了新的函数 square
和 cube
,它们都是由 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
表示账户余额,以及三个公有方法 deposit
、withdraw
和 balance
。deposit
方法用于存款,withdraw
方法用于取
钱,balance
方法用于查询余额。注意到 __balance
变量前面有两个下划线,这是 Python 中一种特殊的命名方式,它会将变量名改为 _类名__变量名
,从而避免变量被外部程序直接访问。然后我们使用 @property
装饰器将 balance
方法转换为属性,这样当程序调用 account.balance
时,实际上是在调用 balance
方法。
生活中的例子:类似于银行账户或者保险箱等机构,需要提供安全的存储和访问方式。只有持有正确密钥或者密码才能够进行相关操作。
总结:
- 闭包(Closure):内部函数可以访问外部函数中的变量,可以用来实现类似于“记忆化”或者“延迟计算”的功能,也可以用来进行装饰器的编写。
- 偏函数(Partial Function):将一个函数的某些参数固定下来,返回一个新的函数,可以在需要多次调用一个函数时,避免反复输入相同的参数,提高了代码的可读性和效率。
- 数据锁定(Data Encapsulation):封装数据和方法,并对外部程序隐藏实现细节,只提供接口供外部程序使用,可以保护数据不被随意访问,提高程序的安全性和可扩展性。
生活中的例子
- 闭包:类似于厨师在烹饪过程中,需要不断取用各种调料的场景,每次都重新去取调料会浪费时间和精力,而将调料放在锅边或者切菜板上,方便下一次使用,则可以提高效率和体验。
- 偏函数:类似于批萨店制作半成品的场景,如预先烤好的饼皮,提前切好的配料等等。这些共同的部分已经被处理好了,只需要根据不同的需求进行组合即可,可以提高工作效率和质量。
- 数据锁定:类似于银行账户或者保险箱等机构,需要提供安全的存储和访问方式。只有持有正确密钥或者密码才能够进行相关操作,可以保障数据的安全性和私密性