Python 3中是否有'foreach'功能?

时间:2013-08-18 00:14:35

标签: python python-3.x foreach

当我遇到这种情况时,我可以在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

但我认为foreach仍然受到以下两个事实的欢迎:

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

13 个答案:

答案 0 :(得分:133)

每次出现" foreach"我已经看过(PHP,C#,......)与蟒蛇基本相同"对于"言。

这些或多或少是等价的:

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

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

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

所以,是的,有一个" foreach"在python中。它被称为" for"。

你所描述的是一个"数组映射"功能。这可以使用python中的list comprehensions完成:

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

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

答案 1 :(得分:38)

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

for element in iterable:
    operate(element)

如果您真的想要,可以定义自己的foreach功能:

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

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

答案 2 :(得分:25)

其他例子:

Python Foreach循环:

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

Python For Loop:

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

答案 3 :(得分:6)

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

E.g。

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。 (它的语法与你想要的语法非常相似)。它返回一个迭代器。

E.g。

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

给我们8和9

答案 4 :(得分:3)

以下是“ foreach”结构的示例,可同时访问Python中的元素索引

for idx, val in enumerate([3, 4, 5]):
    print (idx, val)

答案 5 :(得分:2)

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

您可以使用' all'。

例如:我想在列表中获取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))]

答案 6 :(得分:2)

正确答案是“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

另见:Left to right application of operations on a list in Python 3

答案 7 :(得分:1)

看看this article。 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]]

答案 8 :(得分:1)

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

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

答案 9 :(得分:1)

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

[fn(x) for x in iterable]

但是列表理解的重点是创建一个列表 - 仅将它用于副作用是一种糟糕的风格。 for 循环也少打字

for x in iterable: fn(x)

答案 10 :(得分:0)

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

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

只需用分号分隔其他语句即可。

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

这可能与您的本地风格指南不符,但是当您在控制台中玩耍时,这样做是有道理的。

答案 11 :(得分:0)

我认为这回答了您的问题,因为它就像一个“ for each”循环。
以下脚本在python(版本3.8)中有效:

a=[1,7,77,7777,77777,777777,7777777,765,456,345,2342,4]
if (n := len(a)) > 10:
    print(f"List is too long ({n} elements, expected <= 10)")

答案 12 :(得分:-2)

这是python 3中的foreach

测试= [0,1,2,3,4,5,6,7,8, “测试”]

for fetch in test:
    print(fetch)