在Python中,什么等同于Ruby的Array.each方法? Python有一个很好的简短的闭包/ lambda语法吗?
[1,2,3].each do |x|
puts x
end
答案 0 :(得分:35)
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 :(得分: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)
还有一些库可以包装对象以公开所有常用的函数式编程。
github underscore.py
)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()
取消包装值!)