有意思的题目

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

很多人学习python,不知道从何学起。
很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手。
很多已经做案例的人,却不知道如何去学习更加高深的知识。
那么针对这三类人,我给大家提供一个好的学习平台,免费领取视频教程,电子书籍,以及课程的源代码!
QQ群:1097524789

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

正确答案:

[6,6,6,6]

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

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

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

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

squares = []
for i in range(4):
    res = lambda x:i*x
    squares.append(res)

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

我们接下来看这段代码:

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?

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

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

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,所以此处是闭包函数。

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

[<function multipliers.<locals>.<lambda> at 0x1057d1710>, <function multipliers.<locals>.<lambda> at 0x10586dd40>, <function multipliers.<locals>.<lambda> at 0x10586de60>, <function multipliers.<locals>.<lambda> at 0x10586df80>]

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

print([m(2) for m in multipliers()])

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

[6,6,6,6

总结

其实很多题目都是出自一些我们平时不是很重视的知识点上,但是往往这些知识点非常重要。所以学习的时候,对于重点知识不能因为不使用它而去遗忘,而是要多去看看。非常感谢大家能够看完这篇文章......

一道 3 行代码的 Python面试题,我懵逼了一天的更多相关文章

  1. 50行代码实现python计算器主要功能

    实现功能:计算带有括号和四则运算的式子   3*( 4+ 50 )-(( 100 + 40 )*5/2- 3*2* 2/4+9)*((( 3 + 4)-4)-4) 基本思路:使用正则表达式提取出每一层 ...

  2. 听说图像识别很难,大神十行代码进行Python图像识别

      随着深度学习算法的兴起和普及,人工智能领域取得了令人瞩目的进步,特别是在计算机视觉领域.21世纪的第二个十年迅速采用卷积神经网络,发明了最先进的算法,大量训练数据的可用性以及高性能和高性价比计算的 ...

  3. 千行代码入门Python

    这个是从网上找到的一份快速入门python的极简教程,大概一千行左右,个人觉得不错,特此收藏以备后用. # _*_ coding: utf-8 _*_ """类型和运算- ...

  4. 女朋友汇总表格弄了大半天,我实在看不下去了,用40行代码解决问题 | Python使用openpyxl库读写表格Excel(xlsx)

    1.openpyxl基本操作 python程序从excel文件中读数据基本遵循以下步骤: 1.import openpyxl 2.调用openpyxl模块下的load_workbook('你的文件名. ...

  5. 10行代码使用python统计词频

    # -*- coding: utf-8 -*- #!/usr/bin/env python import re f = open("C:\\Users\\陶敏\\Documents\\Pys ...

  6. 一道python面试题引发的血案

    这里说的是一道阿里校招的面试题:一行代码实现对列表a中的偶数位置的元素进行加3后求和? 今天去面试同样遇到了这个题目,这道题考察的是对python高阶函数map/filter的灵活运用(具体的使用方法 ...

  7. 一道Python面试题

    无意间,看到这么一道Python面试题:以下代码将输出什么? def testFun():    temp = [lambda x : i*x for i in range(4)]    return ...

  8. python入门机器学习,3行代码搞定线性回归

    本文着重是重新梳理一下线性回归的概念,至于几行代码实现,那个不重要,概念明确了,代码自然水到渠成. “机器学习”对于普通大众来说可能会比较陌生,但是“人工智能”这个词简直是太火了,即便是风云变化的股市 ...

  9. python实现统计你一共写了多少行代码

    程序员要保证一定的代码量就必须勤奋的敲代码,但怎么知道自己一共写了多少代码呢,笔者用python写了个简单的脚本,遍历所有的.java,.cpp,.c文件的行数,但是正如大家所知,java生成了许多代 ...

随机推荐

  1. shell专题(五):运算符

    1.基本语法 (1)“$((运算式))”或“$[运算式]” (2)expr  + , - , \*,  /,  %    加,减,乘,除,取余 注意:expr运算符间要有空格 2.案例实操: (1)计 ...

  2. Django之 url组件

    本节内容 路由系统 models模型 admin views视图 template模板 路由系统 我们已知,用户从浏览器发出的请求会首先打到django url的路由分发系统这里,然后再到views视 ...

  3. CRM【第一篇】: 权限组件之权限控制

    1. 问:为什么程序需要权限控制? 答:生活中的权限限制,① 看灾难片电影<2012>中富人和权贵有权登上诺亚方舟,穷苦老百姓只有等着灾难的来临:② 屌丝们,有没有想过为什么那些长得漂亮身 ...

  4. web前端知识点(webpack篇)

    webpack 是一个现代 JavaScript 应用程序的静态模块打包器(module bundler).当 webpack 处理应用程序时,它会递归地构建一个依赖关系图(dependency gr ...

  5. 网络编程-HTTPS

    明文: 对称加密: 非对称:(公钥:pk 私钥:sk) 对称+非对称: 先用非对称方式发送num1给server,server用私钥得出key(由num1算出来),自此,约定C.S以此key(num1 ...

  6. Python Ethical Hacking - KEYLOGGER(2)

    Report function: Run in the background. Don't interrupt program execution. Every X seconds, send the ...

  7. 产品升级前后MD5码对比

    在做产品测试的时候,经常会需要对比升级前后的MD5码,这时可以通过终端登录设备,具体步骤如下: 1.在升级前时,将MD5码写入log1.info文件: check_md5 -d / -w log1.i ...

  8. springboot application.yml配置学习

    一.背景 为了更好的使用springboot,所以看一下application.yml配置这块.主要是看数据绑定这块. 主要参考:https://www.hangge.com/blog/cache/d ...

  9. map数据按照list排序

    简介 (Introduction): 背景 需要对字段进行排序,但是,一个字段的结果存在一个map中,一个存在list中,需要让map的数组,按照list的顺序进行排序 结构图 list顺序 [ { ...

  10. Fisher算法+两类问题

    文章目录 一.Fisher算法 二.蠓的分类问题: 三.代码实现: 一.Fisher算法 二.蠓的分类问题: 两种蠓Af和Apf已由生物学家根据它们的触角和翼长加以区分(Af是能传播花粉的益虫,Apf ...