栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

记录一道有趣的python笔试题:匿名函数与闭包的综合运用

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

记录一道有趣的python笔试题:匿名函数与闭包的综合运用

前言

最近做某公司的数据挖掘岗的笔试题 遇到一道python题 让我印象深刻。如下

def num():
 return [lambda x:x*i for i in range(4)]
print([m(?) for m in num()])

如果打印的结果为[6,6,6,6] 问❓处的数字应该为多少

分析

首先 很显然的 num()函数返回的是4个匿名函数组成的列表 那么遍历这4个函数并调用的结果就是我们的打印结果。如果不仔细想清楚 会很自然的认为答案就是[0*❓,1*❓,2*❓,3*❓]。但是如果是这样 那么无论❓处输入什么数字 结果都不是[6,6,6,6]。这也是我当时第一眼的想法。但是 如果我们我们再仔细想一想 就会发现num()函数内部构成闭包 我们可以将其改写为如下更易懂的形式。

def num():
 func_li []
 for i in range(4):
 def func(x):
 return x*i
 func_li.append(func)
 return func_li
# 真正的执行
for func in num():
 print(func(❓))

在我们调用num()中的每个func()时 func()才开始去寻找需要的参数i,因为函数内部根本找不到i这个变量 但是这个时候 内部的for循环结束 此时存在变量i 3,因此对于调用每个func()来说 返回的结果都是x*3。当明白这个点之后 这个问题也就迎刃而解了 ❓处的数字自然就是2。

如果我们希望当❓处数字为2时 输出的结果是[0,2,4,6],那么可以将num()修改为如下

def num():
 return [lambda x,i i:x*i for i in range(4)]

即让每个函数都存储当前for循环的i值。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/267288.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号