lambda表达式与for循环的搭配用法

  1. 开篇-遇到的问题
    给出一个值 x ,分别计算 x 与 0~5 之间各个数的和
#  给出一个值 x ,分别计算 x 与 0~5 之间各个数的和
res=[lambda x,i=i:x+i for i in range (6)]
print(res)       #得到返回 x+i 函数的五个地址
for f in res:    #循环遍历每个地址
    print(f(2))  #对每个遍历到的函数 传递参数 x=2
#2 3 4 5 6 7

问题一:lambda表达式,在内部嵌套for循环,怎么用的?如果for循环在外部又会怎么样?
问题二:lambda表达式外部加上[]的用法

  1. 知识回顾

语法:lambda 变量1,变量2,…,变量N : 使用变量的表达式

注意 :(1)可以无参,调用时不可以在参数表中赋值;
t = lambda : Tru
>>True
(2) 无参,直接返回值
等效为:
def f():
return x
(3) 有参,调用时直接给变量赋值
(4) 后面表达式不能使用未定义的变量,可以使用匿名函数外定义的变量

  1. lambda表达式在for循环内部,和append搭配
    代码:输出 0~4 所有数的的幂
li=[]
for x in range(5):
     li.append(lambda x: x**2)
     print(li[0](1))
#li得到的是个列表,里面存的可不是计算出来的数,而是五个函数地址
'''
    print(li) 
输出五个函数的地址:
[<function <lambda> at 0x000001A3D5EE59D8>]
[<function <lambda> at 0x000001A3D5EE59D8>, <function <lambda> at 0x000001A3D5EE5A68>]
[<function <lambda> at 0x000001A3D5EE59D8>, <function <lambda> at 0x000001A3D5EE5A68>, <function <lambda> at 0x000001A3D5EE5AF8>]
[<function <lambda> at 0x000001A3D5EE59D8>, <function <lambda> at 0x000001A3D5EE5A68>, <function <lambda> at 0x000001A3D5EE5AF8>, <function <lambda> at 0x000001A3D5EE5B88>]
[<function <lambda> at 0x000001A3D5EE59D8>, <function <lambda> at 0x000001A3D5EE5A68>, <function <lambda> at 0x000001A3D5EE5AF8>, <function <lambda> at 0x000001A3D5EE5B88>, <function <lambda> at 0x000001A3D5EE5C18>]

'''

    # li,[]内是地址的索引位置

print(li[1](2))  #4
    # print(li[0](2))  #4
    # print(li[4](3))  #9
  • 首先直接输出执行:print(li)
    li 得到的是个列表,但是里面存的不是计算出来的幂,而是五个函数地址
    预计是得到 0,1,2, 9,16
  • 原因是:循环的 x 并没有传递给 lambda 里面的 x ,只是让它生成多个 x**2 函数

总结:
lambda在for循环内部,和append搭配时,for循环不是为了给函数传递参数,只是为了生成多个函数。

问:什么时候for循环可以给lambda参数那?

*其实for在lambda内部可以给参数,但是,即使给出参数也不一定都会参与lambda表达式中的计算并得结果。

有以下两种情况: 放在()中的lambda与for搭配 放在[]中的lambda与for搭配*

一、放在小括号()中,参数由for循环给出,搭配append


li=[]
li.append(lambda : x for x in range(5)) # 是否能得到0,1,2, 9,16 ???
#print(li)
#[<generator object <genexpr> at 0x0000021D62ADEA48>]

分析:
1.内部 lambda : x for x in range(5)这是函数

2,加上小括号()!!!

 # res=(lambda : x  for x in range(5))
   # print(res)
  输出:<generator object <genexpr> at 0x000001AEE73EEAC8>

因此:(lambda : x for x in range(5))这种形式,返回值是一个generator(生成器)

  1. 整体,加入空列表后,在列表的内部就存了一个生成器
 # li=[]
 # li.append(lambda  : x  for x in range(5))
 用next()调用一下
 print(next(li[0])()) # 0
 print(next(li[0])()) # 1
 print(next(li[0])()) # 2
当地址变为1时:报错
print(next(li[1])())      # IndexError: list index out of range

二、放在[ ]中、参数由for循环给出

li = [lambda :x  for x in range(5)]

首先直接输出:print(li)
输出的是五个函数(return x )地址

注意:不是生成器,与上面别混淆,(lambda :x for x in range(5))这种形式,返回值是一个generator(生成器)
[<function <listcomp>.<lambda> at 0x0000022AC3BE0558>,
 <function <listcomp>.<lambda> at 0x0000022AC3BE05E8>, 
 <function <listcomp>.<lambda> at 0x0000022AC3BE0678>, 
 <function <listcomp>.<lambda> at 0x0000022AC3BE0708>, 
 <function <listcomp>.<lambda> at 0x0000022AC3BE0798>]

分析:
首先:lambda :x for x in range(5)仍然是一个函数(返回 x)
再者,加上中括号后:输出的是五个函数(return x )地址
再执行 print(li0),就会输出x的值

print(li[0]())    # 4
print(li[1]())    # 4

因此:直接套 [ ]也是输出不了循环的各个数值的计算结果

Logo

基于 Vue 的企业级 UI 组件库和中后台系统解决方案,为数万开发者服务。

更多推荐