问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

求帮助,Python闭包和返回函数问题

发布网友 发布时间:2022-04-27 06:10

我来回答

1个回答

热心网友 时间:2022-04-18 07:17

(1)unpack tuple和list, 可以让函数返回多个值

def count():
return (1, 2, 3) # 或者 return [1, 2, 3]

# 把列表解包,把1 2 3 分别赋值给 a b c
a, b, c = count()
print a, b, c
# 输出 1, 2, 3

(2)假设你知道Python的dict类型。Python中,在函数中定义一个变量的时候,会在一个隐藏的叫locals的dict里面插入key-value,其中key是变量名,value是变量值。而引用一个变量的时候,则首先会在这个叫locals的dict里面,根据变量名作为key,去查对应的值。

var = 1 # 你可以认为这里进行了 locals['var'] = 1 的操作
print var # 在对var变量进行求值的时候,就在locals['var']里面找var变量对应的值

(3)for循环中,每次循环只是给 `i` 重新绑定值

for i in (1, 2, 3):
print i

print i
# 一次输入 1 2 3 3

每次`for i in (1, 2, 3)`相当于在`print i`之前,进行了
`locals['i'] = 1`
`locals['i'] = 2`
`locals['i'] = 3`
的操作
所以最后的`print i`再去locals字典里面找`i`的时候,就变成 3 了。
(4)闭包是 一个函数加上这个函数引用的外部变量

var = 1
def f():
print var
# 这里的闭包是函数 f 和 f 引用的外部变量 var

def count():
var2 = 2
def f():
print var2
# 这里的闭包是函数 f 和 f 引用的外部变量 var2
return f

拿第一个函数 f 来说。在 f 运行的时候,解释器拿着'var'这个字符串去locals字典里面找,发现找不到,于是在closure字典里面找,最后closure字典里面找,你可以认为就是找closure['var'],然后发现找到对应的值。count里面的 f 函数同理。
(为了容易理解,我这里说谎了。实际上 f 压根没有closure,count里面的 f 才有。其实closure压根不是像locals那样的字典)
(5)函数定义时,函数只是记录变量的名字。
要区分什么是名字,什么是值。
`i = 1`这里 i 只是名字,只是一个字符串 'i' 。这句话运行完,locals['i'] = 1,就说 i 对应的值是1

def count():
fs = []
for i in range(1, 4):
# 定义一个函数,等价于运行了 locals['f'] = 真正生成的函数
# 每次循环,这里都会重新生成一个函数,然后把重新生成的函数赋值给 locals['f']
def f():
return i * i # 引用了'i'这个名字,但并不是引用了'i'对应的值

# 等价于 locals['fs'].append(locals['f'])
# f 不是函数,它只是一个名字'f'。f 引用的东西,也就是locals['f']才是真正的函数
fs.append(f)
# 于是这个for循环生成了三个函数,这三个函数是没有名字的,这个函数运行完后,它们跟'f'这个名字就毛关系都没有了(是的我说慌了,但可以先不管)
# 把整个列表返回,这个列表包含了三个函数
return fs

# count()返回三个函数的列表,unpack 列表的语法把列表中的三个函数抽出来,重新给他们命名为 f1, f2, f3
# 也就是说,
# locals['f1'] = 列表中的第1个函数
# locals['f2'] = 列表中的第2个函数
# locals['f3'] = 列表中的第3个函数
# 这三个函数跟'f'这个名字现在毛关系都没有。(其实是有的,但为了说明需要简化,现在你可以完全不管括号里面说的话)
f1, f2, f3 = count()
print f1(), f2(), f3()
# 好了我们运行它们,输入都是 9

# def f():
# return i * i

这是因为 f1 现在对应的函数,里面引用了 'i' 这个字符串,我们根据 'i '这个字符串去找它对应的值,先找到 f 当前的locals字典,发现没有,因为函数定义的时候没有定义 i 变量。然后再去closure['i']里面找,因为Python是通过closure字典实现闭包的(就当它是对的好不好),所以我们可以在closure['i']找到值,这个值就是我们上一次运行的时候count函数里面残留的locals['i'],而由于for循环三遍之后,locals['i'] == 3,所以找到 i 的值就是3。所以最后输出都是9
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
YY聊天中哪些语音的会不会作为文件存下来 2023谷雨节气的含义 谷雨三候是什么 我老公欠债,外遇,我想离婚,怎么办 ...我提供了我的姓名,出生年月日,还有工作地点,会出什么事吗... 刚刚接到一个诈骗电话,问我要了我的姓名和出生年月日,会不会利用... 不小心接到骗子的电话,还告诉了我的姓名和出生年月日,要不要紧啊... 知道了姓名和出生年月日,能拿来作案吗? WOW安装要CD 是什么问题? 急急急、、、魔兽世界用盘安装时老要CD片 时怎么回事 取消以后就安装不... 每次下载魔兽世界安装中途都会断掉,要求插入什么CD,然后出现这么一段文... Python中什么是闭包? 梦见过世的母亲站起来复活了 梦见至亲的死了,然后她的尸体又站起来送我回家? 梦见在小时候的老家,已经处于瘫痪病危的奶奶站起来了,跟我们在院子玩,突然天上一道黑色尘土,眼看着沙 梦见已经去世的爷爷,在医院看病,我用轮椅推着他,坐着推动太痛,后面他自己竟然站起来? 做梦梦到亲人病的无法站起来 家里的亲戚请了法师帮他做法术 生病的亲... 梦见老人重新站起来走的好快 梦见自己的怇床的亲人站起来走是好还是坏? 梦见现实中久病不起的亲人,站起来了 微信里钱太多,提现怕花手续费,怎么办 这个动漫视频背景音乐是什么。好好听啊 急!这个动漫视频的音乐是什么?高手请帮忙 腾讯TOP动画馆第一弹:宅男必看经典动画TOP10那个视频的背景音乐 求这个动漫视频的背景音乐 谁知道这动漫视频的背景音乐是什么? 三星手机是什么处理器 谁知道这个动画视频的背景音乐啊 超喜欢啊 这个动漫视频的背景音乐叫什么名字? 我想制作一段动画,不到5分钟的那种,要有配音,音乐(大概就这些)。请问用什么软件,总共需要什么呢? 动漫视频音乐 python闭包函数中怎样把内层函数传递到外层中 一个关于python闭包的问题,内部函数可以获取外部函数的变量吗 为什么Python嵌套函数不称为闭包 python闭包问题求解! python闭包实现计数器时遇到的问题? Python 为什么不能序列化函数闭包 Python 在函数中定义一个类,并返回,算闭包吗 怎么查看软件是32位还是64位 怎么查看软件是32位的还是64位的 win10如何查看软件64位还是32位 怎样查看软件是32位还是64位 如何看一个软件是32位还是64位 怎么看一个软件是64位的还是32位的? 软件怎么知道是32位的还是64位 如何查看手机是32位还是64位 我想做外贸,怎么运做啊 怎样知道应用软件是64位还是32位 做外贸运输需要办什么手续 怎么看一个软件是64位的还是32位的 怎么知道一个软件是32位还是64位