20

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

[1,2,3].each do |x|
  puts x
end
4

5 回答 5

42

Python 是否有一个漂亮而简短的闭包/lambda 语法?

是的,但在这种情况下你不想要它。

与该 Ruby 代码最接近的等价物是:

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

当你已经有一个函数时,这看起来很不错,比如print. 当您只有一些任意表达式并且想要在 中使用它时map,您需要使用 adef或 a从中创建一个函数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
于 2013-09-23T22:54:31.580 回答
12

最地道的:

for x in [1,2,3]:
    print x
于 2013-09-23T22:50:47.493 回答
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])

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

于 2013-09-23T23:20:54.680 回答
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()!)

于 2015-10-07T19:26:57.070 回答
1

无需分配:

list(print(_) for _ in [1, 2, 3])

要不就

[print(_) for _ in [1, 2, 3]] 
于 2020-04-17T10:47:27.923 回答