首页 > 编程语言 >python 闭包、偏函数、数据锁定

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

时间:2023-05-04 16:55:21浏览次数:73  
标签:闭包 balance outer 函数 power python self 锁定 def

闭包(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):封装数据和方法,并对外部程序隐藏实现细节,只提供接口供外部程序使用,可以保护数据不被随意访问,提高程序的安全性和可扩展性。

生活中的例子

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

标签:闭包,balance,outer,函数,power,python,self,锁定,def
From: https://www.cnblogs.com/yund/p/17371751.html

相关文章

  • python 多态
    在Python3中,多态是指同一个方法或者操作可以在不同的对象上产生不同的行为或结果。这意味着一个函数可以接受不同类型的参数,并且可以表现出不同的行为。生活中的例子如下:假设你想要买一台新电视机,你可能会去电器店看看有哪些电视可供选择。当你开始比较价格和功能时,你可能会发......
  • SDN Python编程创建多数据中心网络
    首先开启OpenDaylightcd/home/ubuntu/karaf-0.7.1/bin/./karaf新开一个终端执行以下操作在/home/ubuntu/mininet/examples目录下新建一个sdn4.py文件输入以下代码frommininet.topoimportTopoclassMyTopo(Topo):def__init__(self):Topo.__init......
  • python 迭代器和推导式的不同处
    迭代器和推导式都是在Python中用于处理可迭代对象的机制,但它们之间有一些关键区别。返回值类型不同:推导式返回一个新的数据结构(列表、集合、字典等),而迭代器返回一个迭代器对象。推导式生成的是一个新的序列或集合,而迭代器则是逐个生成元素。实现方式不同:推导式是一种高级语......
  • Python时间模块time
    时间模块-time#time()获取本地时间戳#ctime()获取本地时间字符串(参数是时间戳,默认当前)#localtime()获取本地时间元组(参数是时间戳,默认当前)#mktime()通过时间元组获取时间戳(参数是时间元组)#asctime()通过时间元组获取时......
  • python 推导式
    在Python中,列表推导式、字典推导式和集合推导式都是常见的推导式。它们可以让我们使用一种简洁而强大的语法来快速创建新的序列或映射数据类型。列表推导式列表推导式是最常见的一种推导式,用于通过对一个序列中的每个元素应用一个表达式来快速生成一个新的列表。列表推导式的......
  • python-Gradio 机器学习演示库
    python-GradioGradio是一个开源的Python库,用于构建机器学习和数据科学演示应用。有了Gradio,你可以围绕你的机器学习模型或数据科学工作流程快速创建一个简单漂亮的用户界面。Gradio适用于以下情况:为客户/合作者/用户/学生演示你的机器学习模型。通过自动共享链接快速部署你的......
  • python 列表拼接拓展
    #-*-coding:utf-8-*-#列表例存放字节类型数据bytes_list=[b'1',b'2',b'3']#列表里存放字符串类型数据str_list=['1','2','3']#列表里存放混合类型数据(字符串,字节,int)mix_list=[b'1','2','3&#......
  • Python网页应用开发神器fac 0.2.6版本重要新功能一览
    fac项目地址:https://github.com/CNFeffery/feffery-antd-components,欢迎star支持大家好我是费老师,距离我的开源Python网页应用通用组件库fac的0.2.0版本发布已过去半个多月的时间,在国内外众多fac用户的反馈建议下,经过高强度的优化和功能更新,目前fac已经更新到0.2.6版本,且......
  • 闭包
    闭包是一种保护私有变量的机制,在函数执行时形成私有的作用域,保护里面的私有变量不受外界干扰,直观的说就是形成一个不不销毁的栈环境。//闭包varadd=(){varcount=0;return(){return++count;};}();print(add());print(add());......
  • Python报错:Can't connect to HTTPS URL because the SSL module is not available
    参考文章:(32条消息)Can‘tconnecttoHTTPSURLbecausetheSSLmoduleisnotavailable-关于anaconda中的SSL模块错误_anacondahttps报错_Sky_Tree_Delivery的博客-CSDN博客具体操作:将以下文件移动位置D:\Anaconda\Library\bin->D:\Anaconda\DLLs(此处D盘为我自己的安......