Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python For循环没有执行两次_Python_Arrays_Python 3.x_For Loop - Fatal编程技术网

Python For循环没有执行两次

Python For循环没有执行两次,python,arrays,python-3.x,for-loop,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--------"

我是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)
我明白了

------萨拉里奥------- 6700 7500 2100 2150 1800 -----萨拉里奥2-------- 我希望得到

------SALARIO------- 6700 7500 2100 2150 1800 -----SALARIO2-------- 6700 7500 2100 2150 1800 ------萨拉里奥------- 6700 7500 2100 2150 1800 -----萨拉里奥2-------- 6700 7500 2100 2150 1800
为什么会这样?这是一些lenguaje优化?

是的,
map
是一个生成器(从Python 3开始)。一旦在第一个循环中被消耗,第二次它就“空”了

如果没有
map
+
lambda
组合(这是一条一般规则),您会过得更好。在您的情况下,更改:

salarios = map(lambda emp: emp.salario, empleados)

现在您有了一个列表理解,您可以根据需要多次迭代

(当前表达式相当于generator comprehension
salarios=(emp.salario表示Emplicatos中的emp)
,当您只想在其上迭代一次时,它更易于阅读)

注意:在Python2中,map返回一个
列表
,因此人们滥用
map
lambda
表达式,有时甚至没有迭代,只是为了调用列表元素上的函数


使用Python2,您的代码本来可以工作,但在切换到Python3时会有一个恶性的可移植性错误(map(lambda emp:emp.salario,empleados))表达式,该表达式是
2to3
工具提出的修复方法,但速度较慢,甚至比理解更难)

yup
map
只运行一次。。。重复阅读关于生成器您可以将多次迭代的map()结果保存在列表中,这可能有助于显示此处发生的情况:
salarios=list(map(lambda emp:emp.salario,empleados))
。在Python2中,映射自动返回列表。@DanFarrell我正要这么说!是的,执行
list(map(…)
,它是有效的。这个问题可能是由于在python 2中使用
map
来执行从循环到洗碗等所有操作的坏习惯造成的。我过去也经常这样做一小段时间,只是为了炫耀
map
lambda
(如果我能在同一个表达式中使用
reduce
,那就更好了)
salarios = map(lambda emp: emp.salario, empleados)
salarios = [emp.salario for emp in empleados]