当前位置: 首页 > news >正文

小说网站做封面要钱吗百度服务中心电话

小说网站做封面要钱吗,百度服务中心电话,iis5.1 新建网站,如何在网上销售产品Python 装饰器详解#xff08;下#xff09; 转自#xff1a;https://blog.csdn.net/qq_27825451/article/details/84627016#xff0c;博主仅对其中 demo 实现中不适合python3 版本的语法进行修改#xff0c;并微调了排版#xff0c;本转载博客全部例程博主均已亲测可行…Python 装饰器详解下 转自https://blog.csdn.net/qq_27825451/article/details/84627016博主仅对其中 demo 实现中不适合python3 版本的语法进行修改并微调了排版本转载博客全部例程博主均已亲测可行。 Python 3.8.5 ubuntu 18.04 声明此文章为python装饰器详解——下篇上一篇文章中即详解装饰器——中篇 已经详细讲解了两大类装饰器即函数装饰器、类装饰器的应用实例并且分析了它们在运行的过程中的本质给出了类装饰器的一般模板本文将以实际例子为依托讲解剩下的两个内容闭包和装饰器的嵌套其中闭包是重点包括闭包的诞生背景闭包的定义、作用、与装饰器的关系与区别。该系列文章共分为 上、中、下 三篇。此为第三篇。 一、闭包诞生的背景——closure 1. 一个意想不到的窘境 很多的语言都存在闭包closure我们也常常听起这样的概念但是你真的理解它了吗东它的本质吗在讲闭包之前我打算从一个简单的情况说起。请先看一个例子 func_list [] for i in range(3):def myfunc(a):return iafunc_list.append(myfunc) #定义三个函数将三个函数存放在一个列表中for f in func_list: #调用列表中的三个函数print(f(1))上面的运行结果是1 2 3 吗但是真是的运行结果确实3 3 3。这是为什么粗略的分析第一个函数返回的应该是01第二个返回的应该是11 第三个返回的应该是 21 啊那为什么会出现这样的结果呢从结果上分析应该三个函数都是返回的 21这是为什么呢因为函数定义在循环内部虽然每一次看起来好像 i 分别为 0、1、2实际上因为函数是没有办法去保存这个变化的i 的也就是说i是在函数外面发生变化的函数里面的i会一直随着i的变化而变化直到最终这个i不变化了那函数里面的i是多少就是多少了。总结起来就一句话 循环体内定义的函数是无法保存循环执行过程中的不停变化的外部变量的即普通函数无法保存运行环境还是不理解 再看一个简单的例子 a100def myfunc(b):return abprint(myfunc(200))a200 print(myfunc(200))上面的代码大家都懂运行结果为300 400。我们可以发现因为函数内部有用到外面的a,所以函数运行的结果会随着这个a的变化而变化直到外面的a不变了为止否则光函数传递的参数是确定的还不够还要取决于a。我们用两个比较通俗的层面去理解 函数内部使用到了a,b但是a却不是函数本身具备的财产我虽然可以使用但是我却不能决定它a变化了函数的结果就跟着变化了直到a取最终的值否则函数都是变化的。你不确定我就永远没有办法确定你虽然就在我我身边但是我却不能真正掌控你这种感觉难道不难受吗 用书面语言说函数没有办法保存它的运行环境什么意思在上面的两个例子里面函数的运行环境都是这个模块即py文件也就是说在这个运行环境里面的一切函数都是没有办法做主的函数能够做主只有他自身的局部作用域包括形参。 2. 窘境的解决办法 func_list [] for i in range(3):def decorator(i): #定义一个外层函数这里之所以使用decorator是为了后面与“装饰器进行比较def wrapper(a): #定义一个内层函数定义为wrapper是为了后面的比较return i areturn wrapperfunc_list.append(decorator(i)) for f in func_list:print(f(1))运行结果为 1 2 3 。关于为什么后面再详细讲解这里先提供一种解决思路。 二、闭包的定义及应用 1. 闭包的定义 在一些语言中在函数中可以嵌套定义另一个函数时如果内部的函数引用了外部的函数的变量则可能产生闭包。闭包可以用来在一个函数与一组“私有”变量之间创建关联关系。在给定函数被多次调用的过程中这些私有变量能够保持其持久性。—— 维基百科 2. 闭包的作用 闭包可以用来在一个函数与一组“私有”变量之间创建关联关系。在给定函数被多次调用的过程中这些私有变量能够保持其持久性保存运行环境与变量状态 3. 闭包的特征 上面的描述还是不够精炼有没有几个特别的特征让人一眼就看出来它就是闭包呢 必须要有函数的嵌套。而且外层函数必须返回内层函数但是内层函数可以不返回值也可以返回值外层函数给内层函数提供了一个 “包装起来的运行环境”在这个“包装的”运行环境里面内层函数可以完全自己做主。这也是称之为闭包的原因了。 内层函数一定要用到外层函数中定义的变量。如果只满足了特征1也不算是闭包一定要用到外层“包装函数”的变量这些变量称之为 “自由变量”。 3. 闭包的代码解析 依然以上面的那么例子而言我们提出了解决窘境的办法那我们现在来解释这个解决办法到底做了什么工作。 func_list [] for i in range(3):def decorator(i): #定义一个外层函数这里之所以使用decorator是为了后面与“装饰器进行比较def wrapper(a): #定义一个内层函数定义为wrapper是为了后面的比较return i areturn wrapperfunc_list.append(decorator(i)) for f in func_list:print(f(1))这里列表中存出的就是三个包装函数decorator(1)、decorator(2)、decorator(3)其实相当于三个如下的定义 def decorator(i1):def wrapper(a):return ia因为这里wrapper的运行环境为decorator不再是全局的环境所以在wrapper的环境中i 是固定的不会再变化故而当然能够自己做主了。 三、闭包的细节 首先明确闭包的两个核心特征函数嵌套 和 自由变量 其次明确闭包的两个核心功能保存函数的运行环境状态 和 保存闭包环境内的局部变量 1. 闭包的细节实现 看一个简单的闭包的例子为了与前面的系列文章中篇的装饰器进行比较这里也采用中篇中的案例我要为一个两数相加的运算加密 def decorator(c): #外层函数产生包装环境——即闭包d200 #c d 都是包装环境中的局部变量——即自由变量def wrapper(a,b): #内层函数return (ab)*c/dreturn wrapperwrapperdecorator(150) print(wrapper(100,300))运行结果为300.0 **为什么说它保存了函数的运行环境**这里针对函数是内层函数即wrapper它的运行环境是decorator提供的也就是说decorator的环境是保存的什么意思呢其实就是通过一句话 wrapperdecorator(150)也就是说这里wrapper运行所依赖的 c 就固定是150了d 就固定是200了不会再改变无论我再给wrapper 传递什么参数c 和 d 是不会在变化的。当然如果我重新再执行一次wrapperdecorator(250)相当于是又创建了一个新的包装环境这里的 c 就是250了。 **为什么说它能够保存闭包函数内的局部变量**众所周知函数的局部变量会随着函数的调用结束而销毁那么为什么局部变量能够保存呢这里所说的局部变量指的是闭包函数的局部变量即上面的 c 和 d。也就是说我这里的 c 和 d 是保存着的即使我已经执行wrapper(100,300)执行完毕。 2. 自由变量的查看 我们说闭包函数的局部变量是保存着的那如何查看呢我们可以通过内层函数的一个属性__closure__查看。 print(wrapper.__closure__) print(wrapper.__closure__[0].cell_contents) print(wrapper.__closure__[1].cell_contents)结果如下 (cell at 0x7f2c886802b0: int object at 0x5558ee7e6fe0, cell at 0x7f2c88680370: int object at 0x5558ee7e7620) 150 200可以看到 __closure__ 属性返回一个元组而150和200则分别对应自由变量 c 和 d。 总结内层函数的__closure__属性返回一个元组通过 wrapper.__closure__[i].cell_contents 查看第几个自由变量的值 注意如果闭包函数没有返回wrapper即外层函数没有返回内层函数此时内层函数是没有__closure__属性的。 总结现在可以体会为什么说闭包保存局部变量了吧这里的c d 作为局部变量在函数调用结束后还能够查看到它的值这还不是保存那什么是保存呢 3. 闭包的一般模板 def decorator(*arg,**kargs): #外层函数产生包装环境——即闭包#自由变量区域 # 包含形参都是包装环境中的局部变量——即自由变量def wrapper(a,b): #内层函数return (ab)*c/dreturn wrapperwrapperdecorator(150) #创建唯一的闭包环境 wrapper(100,300) #内层函数的调用四、闭包与装饰器的比较 1. 相同点 都是函数的嵌套分为外层函数和内层函数而且外层函数要返回内层函数 代码的实现逻辑大同小异 二者都可以实现增加额外功能的目的——比如上面的“加法加密运算” 2. 不同点 外层函数不同装饰器的外层函数称之为decorator闭包的外层函数称之为闭包函数closure 外层函数的目的不同装饰器的外层函数主要是提供函数形参function闭包的形参主要目的是提供自由变量。 二者的特征不一样。装饰器的外层函数可以不提供自由变量但是闭包的的外层函数一定要提供自由变量因为如果不提供自由变量必报的存在就毫无意义了即内层函数所依赖的变量却在闭包中根本没有那还要闭包干什么 二者的主要目的不同。装饰器的目的代码重用额外功能。闭包的主要目的保存函数的运行环境保存闭包的局部变量。虽然二者可以有一些交集。 闭包和装饰器本质上还是不一样的但是从形式上来说大致可以认为闭包是装饰器的子集。记住仅仅是从形式上哦 3. 如何理解“闭包”与“装饰器”的本质不一样但是形式类似 关于形式类似这里就不说了参见前面的两篇文章和这篇文章里面的模板即可发现他们长得很像。 为什么说本质不一样 因为对与装饰器而言我必须要给外层函数 decorator 传递一个基本参数 function只有这样我才可以写成functiondecorator(function)或者是 decorator 的形式如果没有这个参数会显示以下错误 decorator() takes 0 positional arguments but 1 was given即 decorator 我必须要定义一个 function 参数否则就会显示定义没有参数但给了它一个参数这种错误因为 functiondecorator(function) 或者是 decorator 这就相当于给了他一个参数。 不仅如此装饰器会改变函数 function 本身的 __name__ 属性参见前文。 但是对于闭包外层函数就没有这些要求也不是一定要定义一个 function 参数甚至我也可以不定义参数。至于两者的本质区别学懂了的小伙伴应该可以自己好好体会了。 五、装饰器的嵌套 关于装饰器的多层嵌套理解起来相对于比较复杂本文先做一个预告将在系列文章的下一篇也就是第四篇进行深入详解有需要的可以关注一下。 传送门https://blog.csdn.net/qq_27825451/article/details/102457152。
http://www.huolong8.cn/news/238978/

相关文章:

  • 网站 网络营销价值wordpress源码买卖
  • 国外优秀网站设计银川网站建设哪家好
  • wordpress内页收录天津百度seo
  • 龙岩市住房和城乡建设局网站网站开发课程百度云
  • 网站建设与管理淘宝移动商城个人中心手机卡进度查询
  • 做企业网站的流程青岛高端网站设计
  • 建网站建设网站响应式网站微博视频教程
  • 学网站建设要学什么图片wordpress主题
  • 深圳网络营销推广案例海外网站seo
  • 广东住房与城乡建设厅网站怎么查询网站开发时间
  • 医院网站cms淮南正规建设网站品牌
  • 关于教育网站的策划书在遵义找工作去哪里找好找
  • 济南网站地址好制作网站公司
  • 福建网站制作python用于网站开发
  • 奇网企业网站管理系统上海市建设工程交易管理中心网站
  • 国外做SEO网站无限免费视频在线看
  • 营销型网站建设目的和意义国外免费空间
  • c access做网站登录页面哈尔滨网站建设网站制作
  • 文字域名可以做网站做网站设计工资多少钱
  • 网站建设的 关键词用jsp源码做网站
  • 黑河北京网站建设网站网页翻页设计
  • 个人建设网站维护费是多少八零云自助建站免费建站平台
  • 企业网站建设方案精英joomla 网站建设
  • 网站免费的正能量漫画东莞整合网站建设公司
  • 58网站建设多少钱wordpress导入网页
  • 自己做的网站如何让别人看到Wordpress页面手机不适配
  • 自己做外贸网站能接到单吗怎样制作微信小程序卖东西
  • wordpress 游戏插件下载游戏seo推广
  • 网站开发毕业设计任务书范文营销专业网站
  • 甘肃建设银行网站域名转移影响网站访问吗