有意思的题目

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

很多人学习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. JVM 学习笔记(五)

    前言: 前面的文件介绍了JVM的内存模型以及各个区域存放了那些内容,本编文章将介绍JVM中的垃圾回收Garbage Collector,和大家一起探讨一下. 如何确定一个对象是垃圾: 这里介绍两种方法 ...

  2. SQLAlchemy(二):SQLAlchemy对数据的增删改查操作、属性常用数据类型详解

    SQLAlchemy02 /SQLAlchemy对数据的增删改查操作.属性常用数据类型详解 目录 SQLAlchemy02 /SQLAlchemy对数据的增删改查操作.属性常用数据类型详解 1.用se ...

  3. bzoj2160拉拉队排练

    bzoj2160拉拉队排练 题意: 给一个字符串,求最长的k个回文子串(此处回文子串长度必须为奇数)长度的乘积.字符串长度≤1000000 题解: 先用manacher预处理出第i个字符为中心的最长回 ...

  4. Python Ethical Hacking - Intercepting and Modifying Packets

    INTERCEPTING & MODIFYING PACKETS Scapy can be used to: Create packets. Analyze packets. Send/rec ...

  5. package.json中dependencies和devDependencies区别

    package.json中dependencies和devDependencies区别 dependencies: 应用能够正常运行依赖的包.用户发布环境,依赖的包不仅开发环境能够使用,生产环境也能使 ...

  6. socket链接

    服务端: package com.batch.service.impl; import java.io.BufferedReader; import java.io.BufferedWriter; i ...

  7. centos7+jexus5.8.3部署ASP.NET的MVC项目

    1.在centos7终端以root权限安装jexus5.8.3的独立版 命令:curl https://jexus.org/release/x64/install.sh|sh 2.跳转到目录/usr/ ...

  8. ST表解决RMQ问题

    RMQ问题: RMQ(Range Minimum/Maximum Query),区间最值查询.对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j<=n),返回数列A中下标在i,j之间 ...

  9. office 2016激活方法windows

    安装office 2016 win+R,输入“cmd” 根据系统位数和安装的office位数选择相应的命令 OFFICE 64位 和 WINDOWS 64位 cscript "C:\Prog ...

  10. Lua中 pairs和ipairs的区别

    Lua系列–pairs和ipairsLua中Table的存储方式在看二者的区别之前,我们首先来看一下Lua中的table是如何在内存中进行分配的.Table的组成:1.哈希表 用来存储Key-Valu ...