206

当我遇到这种情况我可以用javascript来做的时候,我总是认为如果有一个foreach函数会很方便。foreach 我的意思是下面描述的功能:

def foreach(fn,iterable):
    for x in iterable:
        fn(x)

他们只是在每个元素上都这样做并且没有产生或返回某些东西,我认为它应该是一个内置函数并且应该比使用纯 Python 编写它更快,但我没有在列表中找到它,或者它只是叫了另一个名字?或者我只是在这里错过了一些点?

也许我错了,因为在 Python 中调用函数的成本很高,对于这个例子来说绝对不是一个好习惯。而不是一个输出循环,该函数应该在它的主体侧执行循环,如下所示,这在许多 python 的代码建议中已经提到:

def fn(*args):
    for x in args:
       dosomething

但基于以下两个事实,我认为 foreach 仍然受欢迎:

  1. 在正常情况下,人们只是不关心性能
  2. 有时 API 不接受可迭代对象,您无法重写其源代码。
4

13 回答 13

226

我见过的每次出现的“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”。称为“为”。

您所描述的是“数组映射”功能。这可以通过python中的列表推导来完成:

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

namesCapitalized = [capitalize(n) for n in names]
于 2013-08-18T00:33:51.117 回答
66

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

for element in iterable:
    operate(element)

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

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

作为旁注,for element in iterable语法来自ABC编程语言,这是 Python 的影响之一。

于 2013-08-18T00:18:40.117 回答
35

其他示例:

Python Foreach 循环:

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

Python For 循环:

array = ['a', 'b']
for index in range(len(array)):
    print("index: %s | value: %s" % (index, array[index]))
    # index: 0 | value: a
    # index: 1 | value: b
于 2017-04-26T16:34:06.173 回答
13

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

例如

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

对于采用多个参数的函数,可以为 map 提供更多参数:

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

它在 python 2.x 中返回一个列表,在 python 3 中返回一个迭代器

如果您的函数采用多个参数并且参数已经采用元组的形式(或自 python 2.6 起的任何可迭代),您可以使用itertools.starmap. (它的语法与您要查找的语法非常相似)。它返回一个迭代器。

例如

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

给我们 8 和 9

于 2013-08-18T00:38:45.130 回答
7

是的,尽管它使用与 for 循环相同的语法。

for x in ['a', 'b']: print(x)
于 2019-09-27T15:39:40.973 回答
7

正确答案是“python 集合没有foreach”。在本机 python 中,我们需要求助于外部for _element_ in _collection_语法,这不是OP 所追求的。

对于函数式编程,Python 通常相当薄弱。有一些库可以减轻一点。我帮助创作了其中一个infixpy https://pypi.org/project/infixpy/

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

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

于 2020-12-19T10:14:30.490 回答
6

以下是在 Python 中同时访问元素索引的“foreach”构造示例:

for idx, val in enumerate([3, 4, 5]):
    print (idx, val)
于 2020-03-20T22:33:14.453 回答
4

这在 python 3 中执行 foreach

test = [0,1,2,3,4,5,6,7,8,"test"]

for fetch in test:
    print(fetch)
于 2018-04-16T11:07:05.587 回答
3

看看这篇文章。NumPy 1.6 中引入的numpy包中的迭代器对象nditer提供了许多灵活的方法来系统地访问一个或多个数组的所有元素。

例子:

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]]
于 2017-06-09T11:49:38.083 回答
2

如果我理解正确,你的意思是如果你有一个函数'func',如果func(item)返回true,你想检查列表中的每个项目;如果你对所有人都是真实的,那就做点什么。

您可以使用“全部”。

例如:我想在列表中获取 0-10 范围内的所有素数:

from math import sqrt
primes = [x for x in range(10) if x > 2 and all(x % i !=0 for i in range(2, int(sqrt(x)) + 1))]
于 2017-06-02T09:09:54.687 回答
2

我知道这是一个旧线程,但是在尝试进行代码战练习时我遇到了类似的问题。

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

for elements in array:
    while elements in array:
        
        array.func()
于 2021-08-15T02:24:36.357 回答
1

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

[fn(x) for x in iterable]

但是列表理解的重点是创建一个列表 - 仅将其用于副作用是不好的风格。for 循环也少了打字

for x in iterable: fn(x)
于 2021-05-11T08:33:37.453 回答
1

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

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

只需用分号分隔附加语句。

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

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

于 2019-06-17T21:44:16.820 回答