范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

Python嵌套函数和闭包

  在Python语言中,可以在函数中定义函数。 这种在函数中嵌套定义的函数也叫内部函数。我们来看下面的代码: def greet(name):     def inner_func():         print("Hello, {}!".format(name))     inner_func()  greet("Mr Zhang")
  上述代码中,定义了函数greet,在函数greet内部又定义了一个函数inner_func, 并调用该函数打印了一串字符。
  我们可以看到,内部函数inner_func的定义和使用与普通函数基本相同。需要注意的是变量的作用域,在上述代码中,函数参数name对于全局函数greet是局部变量,对内部函数inner_func来说则是非局部变量。内部函数对于非局部变量的访问规则类似于标准的外部函数访问全局变量。
  从这个例子我们还可以看到内部函数的一个作用,就是通过定义内部函数的方式将一些功能隐藏起来,防止外部直接调用。常见的场景是,在一个复杂逻辑的函数中,将一些小的任务定义成内部函数,然后由这个外层函数使用,这样可以使代码更为清晰,易于维护。这些内部函数只会在这个外层函数中使用,不能被其他函数或模块使用。
  在Python语言中, 函数也是对象,它可以被创建、赋值给变量,或者作为函数的返回值。我们来看下面这个例子。def gen_greet(greet_words):     def inner_func(name):         print("{}, {}!".format(greet_words,name))     return inner_func  #调用gen_greet创建一个函数对象 say_hello = gen_greet("Hello") say_hello("Mr. Zhang") say_hello("Mr. Li")  #调用gen_greet创建另一个函数对象 say_hi = gen_greet("Hi") say_hi("Tony")
  在上述代码中,在函数gen_greet内部定义了inner_func函数,并返回了一个inner_func函数对象。外部函数gen_greet返回了一个函数对象,所以像gen_greet这样的函数也叫工厂函数。
  在内部函数inner_func中,使用了外部函数的传参greet_words(非局部变量),以及函数的参数name(局部变量),来打印一个字符串。
  接下来,调用gen_greet("Hello")创建一个函数对象say_hello,紧接着调用say_hello("Mr. Zhang"),输出的结果为:Hello, Mr. Zhang!
  同样的,调用gen_greet("Hi")创建一个函数对象say_hi,调用say_hello("Mr. Zhang"),输出的结果为:Hi,Tony!
  我们可以发现,gen_greet返回的函数对象具有记忆功能,它能够把所需使用的非局部变量保存下来,用于后续被调用的时候使用。这种保存了非局部变量的函数对象被称作闭包(closure)。
  那么闭包是如何实现的呢?其实并不复杂,函数对象中有一个属性__closure__,它就是在创建函数对象时用来保存这些非局部变量的。
  __closure__属性是一个元组或者None类型。在上述代码中,我们可以通过下面方式查看:for cell in say_hello.__closure__:     print(cell.cell_contents) # 输出结果:Hello
  对于非局部变量,可以使用关键字nonlocal对其声明,这样就可以对其进行修改。 def generate_counter():     count = 0     def inner_counter(num):         nonlocal count         count+=num         return count     return inner_counter      counter = generate_counter() print("Current totals:",counter(3))#0Current totals: 3 print("Current totals:",counter(5))#Current totals: 8 print("Current totals:",counter(2))#Current totals: 10
  上述代码实现了累加计数的功能。generate_counter内部定义了局部变量count, 在内部函数inner_counter中使用nonlocal关键字对非局部变量count进行了声明,从而可以对count进行修改或赋值操作。
  函数的嵌套所实现的功能大都可以通过定义类的方式来实现,而且类是更加面向对象的代码编写方式。
  嵌套函数的一个主要用途是实现函数的装饰器。我们看下面的代码:from functools import wraps   def logger(func):     @wraps(func)     def with_logging(*args, **kwargs):         print("{} was called, args={},kwargs={}".format(func.__name__,args,kwargs))         return func(*args, **kwargs)     return with_logging   @logger def power_func(x,n):    """Do some math."""    return x ** n     result = power_func(4,3) print("result=",result) #输出结果:result=64 print(power_func.__name__) #输出结果:power_func
  在上述代码中,logger函数返回函数with_logging,with_logging则是打印了函数func的名称及传入的参数,然后调用func, 并将参数传递给func。其中的@wraps(func)语句用于复制函数func的名称、注释文档、参数列表等等,使得with_logging函数具有被装饰的函数func相同的属性。
  代码中接下来用@logger对函数power_func进行修饰,它的作用等同于下面的代码:def power_func(x,n):    #计算x的n次方    return x ** n  power_func = logger(power_func) print(power_func.__name__)
  可见,装饰器@符其实就是上述代码的精简写法。
  通过了解了嵌套函数和闭包的工作原理,我们在使用过程中就能够更加得心应手了。

普及一下手机CPUGPU知识聊聊手机当中不可或缺的组件之一芯片(SOC)。芯片跟手机的关系,就好像大脑跟人体的关系一样,一切行为,都是由大脑发出指令来执行的,所以手机芯片的强弱,会直接影响手机操作的响应速度和特斯拉单踏板模式或是事故频发的重要原因特斯拉刚回应了追尾货车致司机身亡事故,称最终结论还要等待结果。在无数关于特斯拉的负面新闻中,有一个特别的驾驶模式经常被提及,那就是单踏板模式。美国家公路交通安全管理局去年共通报24华为被爆入局光刻机?荷兰ASML表态,台积电突然做出决定芯片短缺一直是阻碍中国科学技术发展的难题,很多核心技术所需要的芯片都依赖于海外供货。然而,国与国之间除合作共赢之外,还有竞争,加上美国的各种从中阻拦,国企想要真正从海外购取所需芯片闲鱼上大疆口袋相机OsmoPocket,有的很新,基本没用过就转让了,为什么?为什么转让OsmoPocket?这是因为灵眸Osmo口袋云台相机(OSMOPocket),只是个入门的玩具而已。1就是太轻,太轻是便于携带,但太轻就飘了,造成什么情况?抖,手抖就会手机越贵,打车费越贵,滴滴真的把用户当成了韭菜?用户是所有企业最珍贵的一部分资产,如何对待这部分资产就成了企业能够做大做强的决定性因素!有的企业将用户当成朋友,希望通过宠粉行为圈住一批客户,做他们一辈子的生意有的企业将用户当成了黑客是靠什么来维持生活的?谢邀!自从网络普遍后,神秘的黑客也为人所知,人们对他们又畏惧又敬佩。同时也感到好奇,黑客到底是靠什么活着的呢?黑客圈是一个很大的江湖,分为有惩恶扬善的大侠白帽,也有亦正亦邪灰帽,以30多岁不想打工,有什么比较好的创业项目?分享一个项目,打开VX公众号,关注面包多,搜索少林寺还招僧否,里面有完整教程,我以前赚了一些,现改行做实体了,虽然大红利时期已经过了,但现在每天几百块还是有的给你推荐50个月收入轻南极电商董事长张玉祥没有造假,很快会通过法律途径维权每经记者舒冬妮每经编辑张海妮5月7日,南极电商(002127,SZ)2020年度股东大会结束后,在公司位于上海市杨浦区尚浦中心10楼的办公室,董事长张玉祥接受了每日经济新闻记者的独滴滴回应网约车抽成质疑虚心接受批评,持续推进公开透明!网友打车付40司机实际收28,抽成太多5月8日,滴滴回应网约车抽成质疑登上微博热搜。日前,滴滴在其官微发布声明,回应近期公众对于其抽成过高抽成规则不透明等问题的质疑。滴滴表示,虚心接受公众批评,将持续推进公开透明。滴滴特斯拉Model3涨价千元!刚发生一起事故,驾驶员当场死亡特斯拉的涨价之风从美国刮到了国内。今日上午,特斯拉宣布,即日起Model3标准续航升级版车型将上涨1000元人民币,并称这一调整反映了成本波动的实际情况。这是国产Model3第一次小鹏汽车遭遇车主维权,车主拉横幅称刹车故障险丧命!蔚来汽车也有刹车失灵事故发生来源凤凰网科技5月8日消息,有知名互联网大V在微博上晒出一张小鹏汽车车主维权的照片,照片显示车主称自己遭遇刹车故障,险些丧命,车主将自己的小鹏汽车开至小鹏汽车店面拉横幅维权。对此,
小米这只狗到底安的什么芯8月10日晚,小米发布会的召开,给人留下印象最深的不是手机如何,而是在发布会最后雷军公布的小米仿生四足机器人CyberDog,中文名铁蛋。CyberDog(铁蛋)是一款工程探索版的最值得买的二手手机(二),是你心动的那一款吗最值得买的二手手机(二),是你心动的那一款吗第一款真我realmeQ2Pro真我Q2Pro整机重量轻至175克,搭载了6。43英寸的三星SuperAMOLED屏,最高亮度达600n年中盘点10002000什么手机值得买?这六款绝对是性价比神机首先一定要强调两点。第一,价格可能和你当时的价格有些不同,有些波动。这很正常。我们只需要关注推荐的型号。第二,本期所有推荐型号都是根据我们之前的经验评估数据库等数据获得的。如果你在防沉迷!多亲学生手机F21Pro体验这才是学生应该有的一台手机防沉迷!自从互联网问世以后,已经成为了一个常态的社会现象,这个词语频繁出现于学生家长校园和游戏等之间,尤其是游戏方面,如今为了防沉迷,也是使出了各种手段。但对于家长而言,还是多多陪MIUI12。5增强版好评一片,雷军终于放心了可能谁也没有想到以MIUI成名的小米,却在2021年小河里翻船,MIUI却成了小米拖后腿似的存在。面对这个问题小米没有逃避而是积极地与用户进行沟通,面对面地解决存在的问题。于是就有如何免费激活windows10如何免费激活windows10不激活windows10虽然可以正常使用,但是功能受到限制。在桌面右下方会出现转到设置以激活windows的水印,无法进行个性化修改,例如修改壁纸颜色国货就是良心,百元售价竟然配置显示屏防丢失,aigoT23上手体验近年来,很多手机都取消了3。5mm耳机孔,以至于让无线蓝牙耳机这类产品成为了手机的主流外设,友商们之间的竞争也相当激烈,为了让自家的产品与众不同,除了在音质,品质方面下功夫外,在功一加手机到底是不是被国人严重低估的国产品牌呢?众所周知,相比大部分手机厂商的机海战术来说,苹果可谓是特立独行,因为它每年只推出一个系列,而且只做旗舰。无独有偶,国内也有手机品牌和苹果一样,它就是号称NeverSettle的一加客厅秒变KTV一招轻松在家大屏K歌现如今,K歌成了很多年轻人释放压力的一种方式。而随着消费水平的渐长,不少KTV的价格也在逐年上升,原本释放压力的k歌,却成了一笔不小的开销。但其实随着智能电视的发展,电视应用的拓展微信更新支持4个帐号切换朋友圈视频封面个性提示音微信在2018年就已经上线了双帐号切换,解决了用户拥有2个账号的苦恼,同时催生了手机厂商做双开微信,360手机甚至能开数十个微信。8月16日腾讯完成了iOS安卓双平台更新,大更新主定价不到1500元年轻人的首台5G手机POCOM3Pro5G正式发布继POCO在台湾市场推出5G旗舰杀手POCOF35G与4G性能怪兽POCOX3Pro,满足各价位的用户需求,累积越来越多POCO粉后,POCO决定趁胜追击,推出目前市场上CP值最高