Python中与Ruby的Array.each方法相当的方法是什么?

20

在Python中,与Ruby的Array.each方法相当的是什么? Python是否有一个漂亮而简短的闭包/lambda语法来实现它?

[1,2,3].each do |x|
  puts x
end
5个回答

42
Python中有一个短小精悍的闭包/lambda语法吗?
是的,但在这种情况下不需要它。
最接近Ruby代码的等效写法是:
new_values = map(print, [1, 2, 3])

如果你已经有一个函数了,比如 print,那看起来就很好用。但是如果你只有一些随意的表达式,想在map中使用它们,你需要使用def或者lambda将其转换为函数,像这样:

new_values = map(lambda x: print(x), [1, 2, 3])

那似乎是你想要避免的丑陋之处。Python有一种不错的方法可以避免它:理解:

new_values = [print(x) for x in values]

然而,在这种情况下,你只是想为每个值执行一些语句,而不是累加每个值的新值。所以,虽然这样可以工作(你会得到一个由None值组成的列表),但这绝不是惯用方法。

在这种情况下,正确的做法是明确编写它——没有闭包、没有函数、也没有推导式,只有一个循环:

for x in values:
    print x

1
这可能是最好的、最完整的答案,因为它实际上解决了问题中提到的lambda问题,而我的答案没有。+1 - Shashank
1
值得一提的是,我特别举的这些例子只适用于Python 3.x(或者在2.6-2.7中,如果你使用from__future__import print_function);或许我应该使用sys.stdout.write或其他相似的方式来代替print,以避免这种情况...但如果你理解了所有内容,我想这已经足够好了。 - abarnert
每个不会返回任何值,不同于map。 - Incerteza
@AlexanderSupertramp:没错,但Python没有“each”。更重要的是,当你不关心返回值时,它没有任何表达式语法来改变事物。这是有意为之的。如果你想要一个值,你可以在表达式中做到;如果不想要,就没有理由不使用语句,就像我的答案所说的那样。 - abarnert

12

最为惯用的:

for x in [1,2,3]:
    print x

2
您可以使用numpy对数组进行向量化算术运算:
>>> import numpy as np
>>> a = np.array([1, 2, 3])
>>> a * 3
array([3, 6, 9])

您可以轻松地定义一个lambda函数,该函数可用于数组中的每个元素:
>>> array_lambda=np.vectorize(lambda x: x * x)
>>> array_lambda([1, 2, 3])
array([1, 4, 9])

但是正如其他人所说,如果你只想打印每一个,请使用循环。


1

还有一些库可以封装对象来暴露所有常见的函数式编程内容。

例如,pydash允许您执行以下操作:

>>> from pydash import py_
>>> from __future__ import print_function
>>> x = py_([1,2,3,4]).map(lambda x: x*2).each(print).value()
2
4
6
8
>>> x
[2, 4, 6, 8]

(只需始终记住在结尾处“触发”执行和/或使用.value()来取消包装的值!)

我个人喜欢这样编写代码的原因是它从左到右阅读。更容易跟踪数据/值的流动。 - Ru Hasha

1
不需要分配任务:
list(print(_) for _ in [1, 2, 3])

或者只是
[print(_) for _ in [1, 2, 3]] 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接