Python相当于Ruby Array.each方法

时间:2013-09-23 22:49:56

标签: python ruby

在Python中,什么等同于Ruby的Array.each方法? Python有一个很好的简短的闭包/ lambda语法吗?

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

5 个答案:

答案 0 :(得分:35)

  

Python有一个很好的简短的闭包/ lambda语法吗?

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

与Ruby代码最接近的是:

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

当你已经有一个功能时,这看起来很不错,比如print。当您只有一些任意表达式并且想要在map中使用它时,您需要使用deflambda创建一个函数,如下所示:

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 :(得分:12)

最惯用的:

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

答案 2 :(得分: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])

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

答案 3 :(得分:1)

无需分配作业:

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

或者只是

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

答案 4 :(得分:0)

还有一些库可以包装对象以公开所有常用的函数式编程。

E.g。 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()取消包装值!)