我是python的新手,我正在学习有关lambda和map的信息,但是当我尝试某些事情时,我发现一个循环没有执行,我想知道为什么。
我知道这样做是没有用的,但是当我重复两次相同的列表时,第二次不会执行。
salarios = map(lambda emp: emp.salario, empleados)
print("------SALARIO-------")
for salario in salarios:
print(salario)
print("-----SALARIO2--------")
for salario in salarios:
print(salario)
我明白了
------SALARIO------- 6700 7500 2100 2150 1800 -----SALARIO2--------
我希望得到
------SALARIO------- 6700 7500 2100 2150 1800 -----SALARIO2-------- 6700 7500 2100 2150 1800
为什么会发生?这是一些lenguaje优化吗?
答案 0 :(得分:8)
是的,map
是一个生成器(自Python 3起)。一旦在第一个循环中被消耗掉,第二次就被“清空”。
如果没有map
+ lambda
组合(这是一条一般规则),您会更好。根据您的情况,更改:
salarios = map(lambda emp: emp.salario, empleados)
作者
salarios = [emp.salario for emp in empleados]
现在您有了列表解析,可以根据需要进行多次迭代。
(您当前的表达式等效于生成器理解salarios = (emp.salario for emp in empleados)
,当您只想对进行一次迭代时,它更易于阅读)
注意:在Python 2中,map
返回一个list
,因此人们滥用map
和lambda
表达式,有时甚至不进行迭代,只是在列表元素上调用函数。
使用Python 2,您的代码可以正常工作,但切换到Python 3时会出现恶性的可移植性错误(list(map(lambda emp: emp.salario, empleados))
工具提出的2to3
表达式可以解决该问题,但速度较慢甚至均匀)比理解力更难阅读