17.面试题(难)
1)面试题1
友情提示:惰性机制,不到最后不拿值
2)面试题2
(1)求输出结果
改写代码:
通过调试模式,可以清楚看到代码的执行过程。
lst1.append(fn):列表lst1中存储的是fn函数的地址,4个函数中保存的函数都是i*x
lst2.append(m(2)):才开始真正执行函数,此时i=3,实参x=2,所以列表中4个元素都是6
(2)如何得到你想要的结果[0, 2, 4, 6]
返回值(lambda x: ix for i in range(4))的类型是生成器
改写代码:
for m in mul():第一次调用mul(),i=0,返回fn。接着执行lst.append(m(2)),此时的m就是fn函数的地址,调用m(2)=02=0。最后将0添加到列表lst中。
后面的过程以此类推,最终得到列表[0, 2, 4, 6]
(3)两个代码的区别:
代码1)返回的是列表,列表中保存着函数地址,函数表达式都是ix。调用函数时,循环从列表中取值,i不会循环,i已经是3了,传参x=2,结果是6.
代码2)返回的是生成器,for m in mul()每次取值,执行到yield就返回了函数地址,紧接着就会执行m(2)调用fn(x)数。得到ix的结果,随着i的不同结果不同