当我遇到这种情况时,我可以用javascript来做,我总是认为如果有一个foreach函数,它会很方便。foreach指的是下面描述的函数:
def foreach(fn,iterable):
for x in iterable:
fn(x)
他们只是在每个元素上都这样做,不产生或返回一些东西,我认为它应该是一个内置函数,应该比用纯Python编写它更快,但我没有在列表中找到它,或者它只是叫另一个名字?还是我漏了一些地方?
也许我错了,因为在Python中调用一个函数代价很高,对于这个例子来说绝对不是一个好的实践。函数应该在内部进行循环,而不是out循环,它的主体如下所示,这在许多python代码建议中已经提到过:
def fn(*args):
for x in args:
dosomething
但基于以下两个事实,我认为两者都是受欢迎的:
在正常情况下,人们只是不关心性能
有时API不接受可迭代对象,你不能重写它的源代码。
简而言之,函数式编程的方法是:
def do_and_return_fn(og_fn: Callable[[T], None]):
def do_and_return(item: T) -> T:
og_fn(item)
return item
return do_and_return
# where og_fn is the fn referred to by the question.
# i.e. a function that does something on each element, but returns nothing.
iterable = map(do_and_return_fn(og_fn), iterable)
所有说“for”循环与“foreach”函数相同的答案都忽略了一点,即python中对iter操作的其他类似函数,如map、filter和itertools中的其他函数都是惰性求值的。
假设,我有一个来自数据库的字典迭代器,当迭代器迭代时,我想从每个字典元素中取出一项。我不能使用map,因为pop返回的是pop项,而不是原来的字典。
我上面给出的方法允许我实现这一点,如果我传递lambda x: x.pop()作为我的og_fn,
如果python有一个内置的lazy函数,它的接口就像我构造的那样:
foreach(do_fn: Callable[[T], None], iterable: Iterable)
用之前给出的函数实现,它看起来像:
def foreach(do_fn: Callable[[T], None], iterable: Iterable[T]) -> Iterable[T]:
return map(do_and_return_fn(do_fn), iterable)
# being called with my db code.
# Lazily removes the INSERTED_ON_SEC_FIELD on every element:
doc_iter = foreach(lambda x: x.pop(INSERTED_ON_SEC_FIELD, None), doc_iter)
Python本身并没有foreach语句。它在语言中内置了for循环。
for element in iterable:
operate(element)
如果你真的想,你可以定义自己的foreach函数:
def foreach(function, iterable):
for element in iterable:
function(element)
顺便说一句,可迭代语法中的for元素来自ABC编程语言,这是Python的影响之一。
看看这篇文章。numpy包中的迭代器对象niter是numpy 1.6中引入的,它提供了许多灵活的方法以系统的方式访问一个或多个数组的所有元素。
例子:
import random
import numpy as np
ptrs = np.int32([[0, 0], [400, 0], [0, 400], [400, 400]])
for ptr in np.nditer(ptrs, op_flags=['readwrite']):
# apply random shift on 1 for each element of the matrix
ptr += random.choice([-1, 1])
print(ptrs)
d:\>python nditer.py
[[ -1 1]
[399 -1]
[ 1 399]
[399 401]]
简而言之,函数式编程的方法是:
def do_and_return_fn(og_fn: Callable[[T], None]):
def do_and_return(item: T) -> T:
og_fn(item)
return item
return do_and_return
# where og_fn is the fn referred to by the question.
# i.e. a function that does something on each element, but returns nothing.
iterable = map(do_and_return_fn(og_fn), iterable)
所有说“for”循环与“foreach”函数相同的答案都忽略了一点,即python中对iter操作的其他类似函数,如map、filter和itertools中的其他函数都是惰性求值的。
假设,我有一个来自数据库的字典迭代器,当迭代器迭代时,我想从每个字典元素中取出一项。我不能使用map,因为pop返回的是pop项,而不是原来的字典。
我上面给出的方法允许我实现这一点,如果我传递lambda x: x.pop()作为我的og_fn,
如果python有一个内置的lazy函数,它的接口就像我构造的那样:
foreach(do_fn: Callable[[T], None], iterable: Iterable)
用之前给出的函数实现,它看起来像:
def foreach(do_fn: Callable[[T], None], iterable: Iterable[T]) -> Iterable[T]:
return map(do_and_return_fn(do_fn), iterable)
# being called with my db code.
# Lazily removes the INSERTED_ON_SEC_FIELD on every element:
doc_iter = foreach(lambda x: x.pop(INSERTED_ON_SEC_FIELD, None), doc_iter)