lambda表达式与for循环的搭配用法
lambda表达式与for循环的搭配用法开篇-遇到的问题给出一个值 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))#对每个遍历到的函数 传
lambda表达式与for循环的搭配用法
- 开篇-遇到的问题
给出一个值 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表达式外部加上[]的用法
- 知识回顾
语法:lambda 变量1,变量2,…,变量N : 使用变量的表达式
注意 :(1)可以无参,调用时不可以在参数表中赋值;
t = lambda : Tru
>>True
(2) 无参,直接返回值
等效为:
def f():
return x
(3) 有参,调用时直接给变量赋值
(4) 后面表达式不能使用未定义的变量,可以使用匿名函数外定义的变量
- 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(生成器)
- 整体,加入空列表后,在列表的内部就存了一个生成器
# 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
因此:直接套 [ ]也是输出不了循环的各个数值的计算结果
更多推荐
所有评论(0)