For循环未执行两次

时间:2018-12-31 17:21:37

标签: python arrays python-3.x for-loop

我是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优化吗?

1 个答案:

答案 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,因此人们滥用maplambda表达式,有时甚至不进行迭代,只是在列表元素上调用函数。

使用Python 2,您的代码可以正常工作,但切换到Python 3时会出现恶性的可移植性错误(list(map(lambda emp: emp.salario, empleados))工具提出的2to3表达式可以解决该问题,但速度较慢甚至均匀)比理解力更难阅读