当我遇到这种情况时,我可以用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不接受可迭代对象,你不能重写它的源代码。


当前回答

我知道这是一个老话题,但我在尝试做代码战练习时也遇到过类似的问题。

我想出了一个嵌套循环的解决方案,我相信这个解决方案适用于这个问题,它在大多数情况下复制了一个工作“for each (x) doThing”语句:

for elements in array:
    while elements in array:
        
        array.func()

其他回答

Python本身并没有foreach语句。它在语言中内置了for循环。

for element in iterable:
    operate(element)

如果你真的想,你可以定义自己的foreach函数:

def foreach(function, iterable):
    for element in iterable:
        function(element)

顺便说一句,可迭代语法中的for元素来自ABC编程语言,这是Python的影响之一。

如果你真的想,你可以这样做:

[fn(x) for x in iterable]

但是列表理解的重点是创建一个列表-仅为副作用使用它是糟糕的风格。for循环的输入也更少

for x in iterable: fn(x)

简而言之,函数式编程的方法是:

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)

我所见过的每一个“foreach”(PHP, c#,…)基本上都与python的“for”语句相同。

这些或多或少是等价的:

// PHP:
foreach ($array as $val) {
    print($val);
}

// C#
foreach (String val in array) {
    console.writeline(val);
}

// Python
for val in array:
    print(val)

所以,是的,在python中有一个“foreach”。它叫做“for”。

你所描述的是一个“数组映射”函数。这可以用python中的列表推导式来实现:

names = ['tom', 'john', 'simon']

namesCapitalized = [capitalize(n) for n in names]

正确答案是“python集合没有foreach”。在原生python中,我们需要使用外部的for _element_ In _collection_语法,这不是OP所追求的。

一般来说,Python在函数式编程方面相当薄弱。有一些库可以减轻一些压力。我帮助撰写了其中一本

PIP安装infixpy https://pypi.org/project/infixpy/

from infixpy import Seq
(Seq([1,2,3]).foreach(lambda x: print(x)))
1
2
3

另请参阅:Python 3中从左到右对列表操作的应用