首页 > 编程语言 >python返回函数学习笔记

python返回函数学习笔记

时间:2023-06-14 18:56:03浏览次数:33  
标签:返回 lazy return 函数 python sum 笔记 def

内部函数sum可以引用外部函数lazy_sum的参数和局部变量,当lazy_sum返回函数sum时,相关参数和变量都保存在返回的函数中,这种称为“闭包(Closure)”的程序结构拥有极大的威力

def lazy_sum(*args):

def sum():
    ax = 0
    for n in args:
        ax = ax + n
    return ax
return sum

调用lazy_sum()时,返回的并不是求和结果,而是求和函数:

f = lazy_sum(1, 3, 5, 7, 9)
f
<function lazy_sum..sum at 0x101c6ed90>

调用函数f时,才是真正计算求和的结果

f()
25

当我们调用lazy_sum()时,每次调用都会返回一个新的函数,则f1()和f2()的调用结果互不影响

f1 = lazy_sum(1, 3, 5, 7, 9)
f2 = lazy_sum(1, 3, 5, 7, 9)
f1==f2
False

闭包

辅助理解资料https://zhuanlan.zhihu.com/p/453787908

返回的函数在其定义内部引用了局部变量args,一个函数返回了一个函数后,其内部的局部变量还被新函数引用,返回的函数并没有立刻执行,而是直到调用了f()才执行

def count():

fs = []
for i in range(1, 4):
    def f():
         return i*i
    fs.append(f)
return fs

f1, f2, f3 = count()

上面的例子中,每次循环,都创建了一个新的函数,然后,把创建的3个函数都返回了。调用上述三个函数,结果全部都是9,原因就在于返回的函数引用了变量i,但它并非立刻执行。等到3个函数都返回时,它们所引用的变量i已经变成了3,因此最终结果为9。

返回闭包时牢记一点:返回函数不要引用任何循环变量,或者后续会发生变化的变量。

若一定要引用循环变量,方法是再创建一个函数,用该函数的参数绑定循环变量当前的值,无论该循环变量后续如何更改,已绑定到函数参数的值不变:

def count():
def f(j):
def g():
return j*j
return g
fs = []
for i in range(1, 4):
fs.append(f(i)) # f(i)立刻被执行,因此i的当前值被传入f()
return fs

nonlocal

使用闭包,就是内层函数引用了外层函数的局部变量。如果只是读外层变量的值,我们会发现返回的闭包函数调用一切正常

点击查看代码
def inc():
    x = 0
    def fn():
        # 仅读取x的值:
        return x + 1
    return fn
	f = inc()
	print(f()) # 1
	print(f()) # 1

但如果对外层变量赋值,由于Python解释器会把x当作函数fn()的局部变量,它会报错,原因是:x作为局部变量并没有初始化,直接计算x+1是不行的。但我们其实是想引用inc()函数内部的x,所以需要在fn()函数内部加一个nonlocal x的声明。加上这个声明后,解释器把fn()的x看作外层函数的局部变量,它已经被初始化了,可以正确计算x+1。

点击查看代码
def inc():
    x = 0
    def fn():
        # nonlocal x
        x = x + 1
        return x
    return fn

f = inc()
print(f()) # 1
print(f()) # 2

使用闭包时,对外层变量赋值前,需要先使用nonlocal声明该变量不是当前函数的局部变量

标签:返回,lazy,return,函数,python,sum,笔记,def
From: https://www.cnblogs.com/luwanzi/p/17480617.html

相关文章

  • 关于函数指针的一些问题小结
    最近接到一个需求,使用sdk提供的消息回调,一般我们是继承sdk的消息类,然后sdk的消息回调(虚函数)会在有消息的时候调用回调指针,从而触发回调不过因为sdk那边又对该消息类二次封装了并提供了一些接口,所以在研究二次封装的方法时,遇到了一些有意思的问题,故记录下typedefvoid(_......
  • MATLAB技巧——sort和sortrows函数
    1、sort函数sort函数用于对数据进行排序,通过helpsort命令,可以查找到sort函数的具体用法:Y=SORT(X,DIM,MODE)hastwooptionalparameters.DIMselectsadimensionalongwhichtosort.MODEselectsthedirectionofthesort'ascend'resultsinascendingorder......
  • Python基础——网络编程
    在网络编程中主要是使用Socket(套接字)进行编程,套接字相当于应用程序访问下层网络的服务的接口,使用Socket可以是得不同主机之间进行通信,从而实现数据交换。1、Socket工作方式套接字在工作的时候连接的两端分别为客户端和服务器端,对于客户端和服务器端的工作方式是不一样的。对于服......
  • Python中时间与时间戳之间的转换
    对于时间数据,如2016-05-0520:28:54,有时需要与时间戳进行相互的运算,此时就需要对两种形式进行转换,在Python中,转换时需要用到time模块,具体的操作有如下的几种:将时间转换为时间戳重新格式化时间时间戳转换为时间获取当前时间及将其转换成时间戳1、将时间转换成时间戳将如上的时间2016......
  • FFT 学习笔记
    首先就是中考这几天我们学校做考场,然后初二放假在家写作业。然后我就摸鱼来推之前不会的FFT的式子,推一推发现诶麻麻我懂了!麻麻我悟了麻麻!于是在放假第二天我写下了这样一篇学习笔记qwq多项式的系数表示和点值表示我们都知道,一个\(n\)项多项式,如果我们写成一个函数,就可以......
  • 软件测试|教你用Python处理PDF文件(一)
    前言点击获取更多技术资料!我们在工作中,难免会遇到需要处理PDF文件的情况,PDF文件与Word文件不同,内容提取不是很容易,表格和图片都需要特别处理。不过PDF有一个优势,PDF可以跨平台使用,Windows系统,Mac系统都可以打开PDF文件,不像doc文件,需要在word或者类似的软件中才能打开。但是PDF......
  • python nohup 远程运行不宕机方法
    远程运行最怕断电,训练了几个小时的数据说没就没,或者停止运行。用nohup记录代码的输出,还可以不受断电的影响。方法1.用nohup运行一个python文件nohuppython-umain.py>nohup.out2>&1&除了main.py换成自己的文件名,nohup.out也可以改为其他名字,nohup1.out等。其余照搬。不......
  • python GUI+爬虫——12306抢票软件(2)
    这部分主要是项目环境的配置,下图是概览1.基于项目的虚拟环境--pipenv1.1简介1.2安装pipinstallpipenv, 检查安装状态:pipenv--version 我的系统是mac,该项目使用Windows10开发更好1.3创建项目的虚拟环境,使用pycharm1.4创建完后修改安装源,修改位置为pipfile文件修改:来源修......
  • JavaScript学习笔记 - 语法篇 - 一句废话没有版
    写在前面:绝不废话!放心食用JavaScript语法很简单,可以直接在控制台调试理解目录1、变量和常量2、数据类型3、字符串3.1模板字符串3.2字符串的部分常用函数4、数组5、对象6、对象数组&&JSON7、if条件&&三目运算7.1if条件7.2三目运算8、switch9、循环9.0准备工作9.1......
  • python偏函数学习笔记
    Python的functools模块提供了很多有用的功能,其中一个就是偏函数(Partialfunction)比如,int函数默认十进制转换,若提供其它base参数,就可以进行n进制转换int('12345',base=8)5349int('12345',16)74565定义一个int2()的函数,默认把base=2传进去defint2(x,base=2):retu......