一道Python面试题

无意间,看到这么一道Python面试题:以下代码将输出什么?

def testFun(): temp = [lambda x : i*x for i in range(4)] return temp
for everyLambda in testFun(): print (everyLambda(2))

脑中默默一想,这还用说么,肯定是:

0 2 4 6

最后一看答案,竟然是:

6 6 6 6

于是带着怀疑的心态(其实是不服输,不认错),打开编辑器,快速一敲,果然是。

怀疑了人生半天,本来还想黑,WTF Python…然后才想通是自己太生疏……

最后发现原因竟是:Python 的闭包的后期绑定导致的 late binding,这意味着在闭包中的变量是在内部函数被调用的时候被查找。

所以结果是,当任何 testFun() 返回的函数被调用,在那时,i 的值是在它被调用时的周围作用域中查找,到那时,无论哪个返回的函数被调用,for 循环都已经完成了,i 最后的值是 3,因此,每个返回的函数 testFun 的值都是 3。因此一个等于 2 的值被传递进以上代码,它们将返回一个值 6 (比如: 3 x 2)。

究竟如何才能实现出这样的结果呢?

想了想,若能立即绑定参数,或者直接不用闭包总该行吧,用另一种方式避免 i 的改写。

回忆了之前所学知识,最后酝酿出了四种解决方案:

第一种:创建一个闭包,通过使用默认参数立即绑定它的参数

第二种:使用functools.partial 函数,把函数的某些参数(不管有没有默认值)给固定住(也就是相当于设置默认值)

第三种:优雅的写法,直接用生成器

第四种:利用yield的惰性求值的思想

有了解决方案后,又陷入了怀疑自己,这个题目究竟是考察的是什么?是在考面试者闭包相关知识以及Python 的闭包的后期绑定问题么?

若将题目改成:以下代码输出的结果是(0,2,4,6)么?如果不是,你将会怎么做,让它变成(0,2,4,6)?这样会不会更有意思点呢?欢迎大家出妙招,看究竟有多少招?(哈哈哈!)

本文作者简介:一个痴迷于Python语言的业余程序猿,经过半年苦练,经历过从入门到放弃,现在庆幸走到痴迷于Python状态。未来的理想是能够与一群痴迷于Python语言的程序猿做有意义的事。

作者:燕大侠v
链接:

https://www.jianshu.com/p/7e8a16321334

-END-


   识别图中二维码,领取python全套视频资料

转载于:https://www.cnblogs.com/IT-Scavenger/p/9878698.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/249115.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Windows下的ssh姐妹花 Xshell 和 Xftp

Windows下的ssh姐妹花 Xshell 和 Xftp 今天是3月8号,中国传统的三八妇女节,是距离中国新兴节日三七女生(神)节最近的一个全国性节日,今天我也是宅在家,研究了一下近日工作上遇到的一个纯软件技术问题。废话…

关于数字证书理解的简单整理以及12306站点证书简单分析

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sundacheng1989/article/details/25540601 首先简单理解一下什么是数字证书。这里是一篇英文文档,描写叙述的非常形象。形象的描写叙述了什么是公钥。什么是私钥。…

Luogu3350 ZJOI2016 旅行者 最短路、分治

传送门 题意:给出一个$N \times M$的网格图,边有边权,$Q$组询问,每组询问$(x_1,y_1)$到$(x_2,y_2)$的最短路。$N \times M \leq 2 \times 10^4 , Q \leq 10^5$ BZOJ原题竟然没有数据范围 矩形的多组询问问题考虑分治。考虑计算矩形…

Mac中安装Node和版本控制工具nvm遇到的坑

首先说说常规的安装 1. 下载nvm,使用nvm来管理Node版本 官方文档 windows 版本  https://github.com/coreybutler/nvm-windows mac 版本    https://github.com/creationix/nvm#install-script 命令行 尽量不要用brew,免得掉坑 curl -o- https://raw.githubu…

几道比较有意思的js面试题

1、[] ? !![] : ![];输出结果是什么? 12345let val [] ? !![] : ![];console.log(val); //true://之前的错误解释:[] 是一个null,做判断则为false,false执行![]语句,结果为非空,即true//更正…

wepy - 与原生有什么不同(x.wpy)使用实例

源码 1 <template>2 <view classmark wx:if"{{showMark}}">3 <view animation"{{animationData}}" class"animCat">4 <image src"http://osk1hpe2y.bkt.clouddn.com/18-5-30/34559443.jpg"></…

vue从入门到精通之高级篇(一)vue-router的高级用法

今天要介绍的是路由元信息&#xff0c;滚动行为以及路由懒加载这几个的使用方法。 1.路由元信息 什么是路由元信息&#xff0c;看看官网的解释&#xff0c;定义路由的时候可以配置 meta 字段可以匹配meta字段&#xff0c;那么我们该如何使用它&#xff0c;一个简单的例子&…

Java 数组实现堆栈操作

class Stack {private int stck[] ; private int tos ; Stack(int size) { // 一个参数的构造参数stck new int[size] ; // 创建数组&#xff08;创建堆栈&#xff09;tos -1 ; // 空堆栈标识 -1}// 堆栈操作的特性&#xff1a;先进后出、后进先出void push(int…

re模块

什么是正则表达式 一组特殊符号组成的表达式&#xff0c;用于描述某种规则。该应用场景生活中随处可见。 例如&#xff1a;让有志青年过上体面的生活&#xff0c;这里面就由规则&#xff0c;即有志青年。 正则表达式的作用&#xff0c;以及使用场景 用于从字符串中匹配满足某种…

CSS实现div梯形分割

原理 使用的border边框属性结合svg 转换 详见代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>css实现div边框斜角</title><style type"text/css"> .labels {display: i…

算法学习——决策单调性优化DP

update in 2019.1.21 优化了一下文中年代久远的代码 的格式…… 什么是决策单调性&#xff1f; 在满足决策单调性的情况下&#xff0c;通常决策点会形如1111112222224444445555588888..... 即不可能会出现后面点的决策点小于前面点的决策点这种情况。 那么这个性质应该如何使用…

SVG画一个箭头

参考菜鸟手册&#xff1a; https://www.runoob.com/svg/svg-tutorial.html 打开菜鸟中的在线工具 在可视化截图拖拉元素绘制箭头 点击command U 查看源码 将源码拷入html代码中&#xff0c;查看效果 最后&#xff0c;贴出源码供大家参考 <!DOCTYPE html> <…

HP Instant Information

HP Instant Information before HP-UX 11i v3 《管理系统和工作组&#xff1a;HP-UX系统管理员指南》 After HP-UX 11i v3 《HP-UX系统管理指南》(由多个文档组成的文档集) 《HP-UX系统管理员指南&#xff1a;概述》 《HP-UX系统管理员指南&#xff1a;配置管理》 《HP-UX系统管…

CodeForces 258D Little Elephant and Broken Sorting(期望)

CF258D Little Elephant and Broken Sorting 题意 题意翻译 有一个\(1\sim n\)的排列&#xff0c;会进行\(m\)次操作&#xff0c;操作为交换\(a,b\)。每次操作都有\(50\%\)的概率进行。 求进行\(m\)次操作以后的期望逆序对个数。 \(n,m\le 1000\) 输入输出格式 输入格式&#x…

记一次vue项目yarn打包环境配置失效的解决方案

项目中使用到了yarn打包工程&#xff0c;主要有以下几个命名。 # build for production with minification yarn run build# build for production and view the bundle analyzer report yarn run build --report# 自定义API地址 baseurl"http://127.0.0.1:8080/api/&quo…

数字签名与HTTPS详解

因为HTTP协议本身存在着明文传输、不能很好的验证通信方的身份和无法验证报文的完整性等一些安全方面的确点&#xff0c;所以才有了HTTPS的缺陷。HTTPS确切的的说不是一种协议&#xff0c;而是HTTP SSL (TSL)的结合体。HTTP报文经过SSL层加密后交付给TCP层进行传输。SSL(安全套…

[BZOJ4320][ShangHai2006]Homework(根号分治+并查集)

对于<sqrt(300000)的询问&#xff0c;对每个模数直接记录结果&#xff0c;每次加入新数时暴力更新每个模数的结果。 对于>sqrt(300000)的询问&#xff0c;枚举倍数&#xff0c;每次查询大于等于这个倍数的最小数是多少&#xff0c;这个操作通过将询问逆序使用并查集支持。…

VScode 结局插件prettier和vetur格式化冲突

先上配置代码 {"workbench.iconTheme": "vscode-icons","workbench.startupEditor": "newUntitledFile","workbench.colorTheme": "One Dark Pro","editor.fontSize": 14,"editor.tabSize":…

WPF效果(GIS三维续篇)

去年这个时候简单的摸索了一下三维的GIS相关的东西,也就是仅仅玩耍了一把,这次来点真正用的上的干货效果效果&#xff1a; 1、加载自定义百度样式的瓦片效果 2、加载自定义百度样式的缩放效果 3、快速手动进去咱的大帝都 4、加载海量Mark效果 5、加载海量Mark和简单模型效果 6、…

vue 表单 验证 async-validator

1、使用插件async-validator async-validator 地址&#xff1a;https://github.com/yiminghe/async-validator 2、示例&#xff08;vueelement-ui&#xff09; <el-form :model"numberValidateForm" ref"numberValidateForm" label-width"100px&qu…