Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >群友问了道3行代码的python面试题,我懵逼了...

群友问了道3行代码的python面试题,我懵逼了...

作者头像
Python进击者
发布于 2020-05-14 14:35:55
发布于 2020-05-14 14:35:55
49500
代码可运行
举报
文章被收录于专栏:JAVAandPython君JAVAandPython君
运行总次数:0
代码可运行

有意思的题目

题目:写出下面程序运行结果

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def multipliers():
    return [lambda x:i*x for i in range(4)]
print([m(2) for m in multipliers()])

正确答案:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[6,6,6,6]

第一眼看,不就是匿名函数吗?但是仔细想想匿名函数在平时的开发中没怎么用,所以也忘的差不多了。例如那个m(2)当时就不懂是啥意思了。

好,我们就来看看这个题目,首先第一段代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def multipliers():
    return [lambda x:i*x for i in range(4)]

这是一个典型的列表推导式,简而言之就是在列表中推导计算并且将计算的结果放入列表,上面这串代码我们可以写成:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
squares = []
for i in range(4):
    res = lambda x:i*x
    squares.append(res)

这样可能看的更加的简单明了。但是这里面也有一个匿名函数,计算i*x的值,如果大家对匿名函数不太懂的,可以去翻阅相关资料了解一下。

我们接下来看这段代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
print([m(2) for m in multipliers()])

其实这段代码也很好理解,m(2)的意思就是将2作为参数传入上面的匿名函数当中,但是为什么结果等于[6,6,6,6]呢?

我们来debug一下看看:

断点,开始debug

跳到了multipliers函数当中

仍然在循环体中

运行到3,循环即将结束

跳转下来

重新进入匿名函数计算

计算

这里我省略了几张图,因为结果都是i=3 ,x=2,所以相乘自然为6。

相信大家看到这里仍然有很多的疑问,为什么i最后等于3?

其实这里涉及到闭包函数的概念,什么是闭包函数呢?

当前函数引用到上一层函数局部命名空间的变量时就会触发闭包规则。我们说触发了闭包的函数叫做闭包函数,但是要注意一点:只有当调用闭包函数的时候才会去引用外层函数的变量,因为在调用闭包函数之前,闭包内部的命名空间还不存在。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def multipliers():
  squares = []
  for i in range(4):
      res = lambda x:i*x
      squares.append(res)

我们用这种方法来看待这个闭包函数lambda x:i*x,为什么称它为闭包函数呢?因为当执行lambda x:i*x这串代码时调用了上一层函数multipliers()的局部命名空间的变量i,所以此处是闭包函数。

但是此时的列表中并不是匿名函数计算出来的值,因为此时还没有被调用,此时列表中只是有四个匿名函数的内存地址:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[<function multipliers.<locals>.<lambda> at 0x1057d1710>, <function multipliers.<locals>.<lambda> at 0x10586dd40>, <function multipliers.<locals>.<lambda> at 0x10586de60>, <function multipliers.<locals>.<lambda> at 0x10586df80>]

那什么时候才算真正调用呢?在上面我们讲过

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
print([m(2) for m in multipliers()])

这串代码将2作为参数传入上面的匿名函数当中,此时也就是调用了匿名函数。当去调用的时候,for i in range(4)这个循环已经执行完毕,此时的i已经是3了,所以就有了最后的结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[6,6,6,6

总结

其实很多题目都是出自一些我们平时不是很重视的知识点上,但是往往这些知识点非常重要。所以学习的时候,对于重点知识不能因为不使用它而去遗忘,而是要多去看看。非常感谢大家能够看完这篇文章,如果在看数超过30,我会写一篇匿名函数专题的文章给大家!

本文部分知识参考了: https://blog.csdn.net/weixin_34007291/article/details/88755406

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-05-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python进击者 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
day 16 - 2 内置函数(二)练习
1、用 map 来处理字符串列表,把列表中所有人都变成 sb,比方 alex_sb name=['alex','wupeiqi','yuanhao','nezha']
py3study
2020/01/20
3900
面试题-python 什么是闭包(closure)?
前面学了装饰器,那么闭包和装饰器有什么区别呢? 闭包传递的是变量,而装饰器传递的是函数对象,只是传的参数内容不一样,闭包的概念包含了装饰器,可以说装饰器是闭包的一种,它只是传递函数对象的闭包。
上海-悠悠
2021/03/19
1.2K0
python练习题-day15
li = [(1,-2),[3],[-48,78,9],'hello world']
10JQKA
2019/10/23
5100
送给小白的 7 个 python 小坑
比如在创建一个新类时,该类中的所有内容都在声明下缩进,决策、循环还有其它结构语句也会出现类似的情况,
昱良
2019/06/19
6860
python简单面试题
——鲁迅
tnt阿信
2020/08/05
9930
Python面试题大全(二):python高级语法
71.Python主要的内置数据类型都有哪些? print dir( ‘a ’) 的输出?
不吃西红柿
2022/07/29
1.8K0
挑战30天学完Python:Day13 列表推导式和Lambda
在Python中,列表推导式(又称列表解析式)提供了一种简明扼要的方法来创建列表。一种从序列创建列表的紧凑方式。列表推导式比使用 for 循环处理列表要快得多。
MegaQi
2023/10/21
3060
挑战30天学完Python:Day13 列表推导式和Lambda
Python函数基础回顾
函数可以有一些位置参数(positional)和一些关键字参数(keyword)。关键字参数通常用于指定默认值或可选参数。在上面的函数中,x和y是位置参数,而z则是关键字参数。
timerring
2023/05/07
3970
Python函数基础回顾
5 个很好的 Python 面试题
问题一:以下的代码的输出将是什么? 说出你的答案并解释。 class Parent(object): x = 1 class Child1(Parent): pass class
CDA数据分析师
2018/02/05
9370
撩课-Python-每天5道面试题-第8
一. 解释下什么是闭包? 有怎样的场景作用? 概念 在函数嵌套的前提下 内层函数引用了外层函数的变量(包括参数) 外层函数, 又把 内层函数 当做返回值进行返回 这个内层函数+所引用的外层变量, 称为
py3study
2020/01/20
3100
Python基础常见面试题总结[通俗易懂]
以下是总结的一些常见的Python基础面试题,帮助大家回顾基础知识,了解面试套路。会一直保持更新状态。 PS:加粗为需要注意的点。
全栈程序员站长
2022/11/19
2.4K0
Python基础常见面试题总结[通俗易懂]
Python面试常见问题集锦:基础语法篇
在求职Python开发岗位的过程中,扎实掌握基础语法是成功应对面试的关键。本篇博客将聚焦Python基础语法,梳理面试中常见的问题、易错点,并提供实用的代码示例,帮助您在面试中展现出深厚的技术功底,从容应对挑战。
Jimaks
2024/04/16
2830
python数据分析师面试题选
python数据分析部分 1. 如何利用SciKit包训练一个简单的线性回归模型 利用linear_model.LinearRegression()函数 # Create linear regression object regr = linear_model.LinearRegression() # Train the model using the training sets regr.fit(data_X_train, data_y_train) 2. 例举几个常用的python分析数据包及其作用
机器学习AI算法工程
2018/03/15
2.9K0
python迭代器-迭代器取值-for循环-生成器-yield-生成器表达式-常用内置方法-面向过程编程-05
迭代: # 更新换代(其实也是重复)的过程,每一次的迭代都必须基于上一次的结果(上一次与这一次之间必须是有关系的)
suwanbin
2019/09/26
1.5K0
python迭代器-迭代器取值-for循环-生成器-yield-生成器表达式-常用内置方法-面向过程编程-05
Python升级之路(五) 函数
第一章 Python 入门 第二章 Python基本概念 第三章 序列 第四章 控制语句 第五章 函数
时间静止不是简史
2022/06/02
5830
Python升级之路(五) 函数
【Python基础】06、Python函数
函数是python为了代码最大程度地重用和最小化代码冗余而提供的基础程序结构。
py3study
2020/01/06
2.6K0
新手上路必学的Python函数基础知识,全在这里了(多段代码举例)
导读:函数是Python中最重要、最基础的代码组织和代码复用方式。根据经验,如果你需要多次重复相同或类似的代码,就非常值得写一个可复用的函数。通过给一组Python语句一个函数名,形成的函数可以帮助你的代码更加可读。
IT阅读排行榜
2018/08/17
6850
Python3 | 练气期,函数创建、参数传递、作用域!
描述:上一章,我们学习了Python3编程中最基本而得流程控制语句,相信大家在作者的实践下也已经掌握了相关关键字了吧,这一章我们一起学习Python3编程入门中函数定义、函数调用、函数参数(传递、类型),匿名函数、递归函数。内嵌函数和闭包、装饰器函数,以及命名空间作用域的讲解,它也是Python编程中最基础且常用的部分,所以说也是需要我们掌握的。
全栈工程师修炼指南
2024/07/29
1040
Python3 | 练气期,函数创建、参数传递、作用域!
Python函数
位置可变参数可以在普通参数之前, 但是在位置可变参数之后的普通参数变成了keyword-only参数:
职场亮哥
2020/10/10
2.7K0
一道面试题让我重新学了一遍匿名函数
首先祝各位节日快乐,不管有没有npy,大家还是要快乐,过节也不能停止学习。上一篇文章群友问了道3行代码的python面试题,我懵逼了...给大家说了一道Python面试题,很多小伙伴都拍了自己大腿,我竟然这么无知。
Python进击者
2020/05/29
7190
推荐阅读
相关推荐
day 16 - 2 内置函数(二)练习
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验