在 Python 中,什么相当于 Ruby 的 Array.each 方法?Python 是否有一个漂亮而简短的闭包/lambda 语法?
[1,2,3].each do |x|
puts x
end
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
最地道的:
for x in [1,2,3]:
print x
您可以使用 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])
但正如其他人所说,如果您只想打印每个,请使用循环。
还有一些库可以包装对象以公开所有常用的函数式编程内容。
github underscore.py
)例如 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()
!)
无需分配:
list(print(_) for _ in [1, 2, 3])
要不就
[print(_) for _ in [1, 2, 3]]