【问题标题】:For loop not executing two times [duplicate]For循环未执行两次[重复]
【发布时间】:2019-05-28 03:08:28
【问题描述】:

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

【问题讨论】:

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

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


【解决方案1】:

是的,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 时会出现严重的可移植性错误(2to3 工具提出的list(map(lambda emp: emp.salario, empleados)) 表达式修复了该问题,但比理解)

【讨论】:

    猜你喜欢
    • 2017-04-26
    • 1970-01-01
    • 2013-05-02
    • 2021-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多