当我遇到这种情况时,我可以用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循环相同的语法。

for x in ['a', 'b']: print(x)

其他回答

正确答案是“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中从左到右对列表操作的应用

看看这篇文章。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]]

如果你只是寻找一个更简洁的语法,你可以把for循环放在一行:

array = ['a', 'b']
for value in array: print(value)

只需要用分号分隔额外的语句。

array = ['a', 'b']
for value in array: print(value); print('hello')

这可能不符合您的本地风格指南,但当您在控制台上玩游戏时,这样做是有意义的。

python中没有from functools import foreach支持。然而,无论如何,你可以用与导入相同的行数来实现:

foreach = lambda f, iterable: (*map(f, iterable),)

奖金: 可变参数支持:foreach = lambda f, iterable, *args: (*map(f, iterable, *args),)你可以通过避免构造Nones元组来提高效率

地图可以用于问题中提到的情况。

E.g.

map(len, ['abcd','abc', 'a']) # 4 3 1

对于接受多个参数的函数,可以给map更多参数:

map(pow, [2, 3], [4,2]) # 16 9

它在python2中返回一个列表。X和python 3中的迭代器

如果你的函数有多个参数,并且参数已经是元组的形式(或者自python 2.6以来的任何可迭代对象),你可以使用itertools.starmap。(它的语法与您正在寻找的非常相似)。它返回一个迭代器。

如。

for num in starmap(pow, [(2,3), (3,2)]):
    print(num)

得到8和9