zoukankan      html  css  js  c++  java
  • 理解Python闭包,这应该是最好的例子

    此文转载自:https://blog.csdn.net/xufive/article/details/109269626

    作为一种编程语言特性,闭包得到了很多编程语言的支持,Python也不例外。所谓闭包,在Python中指的是携带一个或多个自由量的函数。闭包函数的自由量不是函数的参数,而是生成这个函数时的环境变量。一旦闭包生成了,自由变量会绑定在函数上,即使离开创造它的环境,自由量依旧有效。总结一下,闭包的概念有以下三个要点。

    • 闭包是一个函数
    • 闭包函数是由其他代码生成的
    • 闭包函数携带了生成环境的信息

    有一个很好的例子可以帮助初学者理解闭包。我们知道,几乎所有的计算模块,比如Python内置的标准数学模块math,提供的对数函数只能计算以2为底、以e为底和以10为底的三种对数。

    >>> import math
    >>> math.log(math.e) # 返回以e为底e的对数
    1.0
    >>> math.log2(4) # 返回以2为底4的对数
    2.0
    >>> math.log10(1000) # 返回以10为底1000的对数
    3.0
    

    如果想要计算以a为底b的对数,则需要使用对数换底公式。

    l o g a b = l o g 10 b l o g 10 a log_ab=frac{log_{10}b}{log_{10}a} logab=log10alog10b

    >>> def glog(b, a): # 返回以a为底b的对数
    		return math.log(b)/math.log(a)
    
    >>> glog(25, 5) #  # 返回以5为底25的对数
    2.0
    

    我们固然可以像上面的代码那样定义一个函数glog(),计算以任意数为底的对数,但每次总要输入两个参数,和math模块的log()、log2()、log10()函数风格不一致。如果使用闭包,就能生成和math风格一致的对数函数。

    >>> def log_factory(n): # 定义一个闭包生成函数
    		def log_n(x): # 生成闭包
    			return math.log(x)/math.log(n) # 闭包中携带了环境参数n
    		return log_n # 返回闭包
    
    >>> log5 = log_factory(5) # 用闭包生成器生成闭包
    >>> log7 = log_factory(7) # 用闭包生成器生成闭包
    >>> log5(25) # 该闭包携带的自由量是5
    2.0
    >>> log7(49) # 该闭包携带的自由量是7
    2.0
    

    以上代码,首先设计了一个对数函数生成器log_factory(),输入一个整数n,就返回一个以n为底的对数函数。继而用这个生成器生成了两个闭包函数,一个名为log5,一个名为log7。最后验证一下,一切都和我们想象的完全一样。


    本文引用的例子,选自我的新书《Python高手修炼之道》,书中类似的例子还有很多。该书今天已在京东和当当网正式上线预售,双十一期间优惠力度空前(优惠活动时间:11月9日~11月11日)。如果觉得这本书还不错,就不要错过时机。想要签名的同学,请关注公众号“Python作业辅导员”,回复“Python高手修炼之道”,即可收到如何购买签名版的说明。

    在这里插入图片描述
    在这里插入图片描述

    渠道一:京东自营图书

    • 优惠活动时间:11月9日~11日

    在这里插入图片描述
    渠道二:当当自营图书

    • 活动时间:11月9日~11日

    在这里插入图片描述
    渠道三:作者签名

    • 关注公众号“Python作业辅导员”
    • 回复“Python高手修炼之道”,即可收到如何购买签名版的说明

    价格和优惠措施以各平台实际发布为准。

       

    更多内容详见微信公众号:Python测试和开发

    Python测试和开发

  • 相关阅读:
    Java 基础
    Java 数据类型
    Spring 拦截器实现事物
    SSH 配置日记
    Hibernate 知识提高
    Jsp、Servlet
    leetcode 97. Interleaving String
    leetcode 750. Number Of Corner Rectangles
    leetcode 748. Shortest Completing Word
    leetcode 746. Min Cost Climbing Stairs
  • 原文地址:https://www.cnblogs.com/phyger/p/14202500.html
Copyright © 2011-2022 走看看