是否有一个';foreach&x27;Python 3中的函数?

是否有一个';foreach&x27;Python 3中的函数?,python,python-3.x,foreach,Python,Python 3.x,Foreach,当我遇到这种情况时,我可以用javascript来做,我总是认为如果有一个foreach函数,那会很方便。我所说的foreach是指下述功能: def foreach(fn,iterable): for x in iterable: fn(x) 他们只是在每个元素上都这样做,没有产生或返回任何东西,我认为它应该是一个内置函数,应该比用纯Python编写更快,但我没有在列表中找到它,或者它只是调用了另一个名称?或者我只是错过了一些要点 也许我弄错了,因为在Python中调

当我遇到这种情况时,我可以用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仍然受欢迎:

  • 在正常情况下,人们只是不关心性能
  • 有时API不接受iterable对象,您无法重写其源代码

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

    for element in iterable:
        operate(element)
    
    如果确实需要,可以定义自己的
    foreach
    函数:

    def foreach(function, iterable):
        for element in iterable:
            function(element)
    
    作为旁注,iterable语法中的
    for元素来自编程语言,这是Python的影响之一。

    我所看到的每次出现“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]
    
    可用于问题中提到的情况

    例如

    对于具有多个参数的函数,可以为映射提供更多参数:

    map(pow, [2, 3], [4,2]) # 16 9
    
    它在Python2.x中返回一个列表,在Python3中返回一个迭代器

    test = [0,1,2,3,4,5,6,7,8,"test"]
    
    for fetch in test:
        print(fetch)
    
    如果您的函数接受多个参数,并且这些参数已经是元组形式的((或自python 2.6以来的任何iterable),您可以使用。(它的语法与您所寻找的非常相似)。它返回一个迭代器

    例如

    给我们8和9的其他例子:

    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
    

    若我没弄错的话,你们的意思是若你们有一个函数“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))]
    
    看。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]]
    

    这在Python3中实现了foreach

    test = [0,1,2,3,4,5,6,7,8,"test"]
    
    for fetch in test:
        print(fetch)
    

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

    array = ['a', 'b']
    for value in array: print(value)
    
    只需用分号分隔其他语句

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

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

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

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

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

    a=[1,7,77777 654563452342,4]
    如果(n:=len(a))>10:
    
    print(f)List太长({n}个元素,应为),下面是在Python中同时访问元素索引的“foreach”结构的示例:

    for idx, val in enumerate([3, 4, 5]):
        print (idx, val)
    
    正确的答案是“python集合没有
    foreach
    ”。在本机python中,我们需要使用外部
    for _元素u。In u集合
    语法,这不是OP所追求的

    Python在函数式编程方面通常很弱。有几个库需要稍微缓解。我帮助编写了其中一个
    infixpy


    另请参见:

    如果您确实需要,可以执行以下操作:

    [fn(x) for x in iterable]
    
    但是列表理解的重点是创建一个列表——仅将其用于副作用是不好的风格。for循环也较少键入

    for x in iterable: fn(x)
    

    仅仅使用
    for
    循环有什么错?这正是
    for
    的目的。for循环没有错,只是for循环convenience@user2357112,最好为列表中的每个项使用一次函数调用的速记。
    list。对于列表中的项,每个(func)
    都比
    干净:func(item)
    ,IMO。问题是Python很好地用列表理解取代了像
    map()
    filter()
    这样的函数式收藏夹,而列表理解只是扩展了它内置的
    for
    if
    (同质且可读)和一个特定的
    。每个()
    都可能与之相反。
    求和(0表示地图中的uu(f,seq))
    是一个可读的解决方法。如果您这样做是为了产生副作用,而不是为了映射的结果,那么在Python 3中以这种方式使用
    map
    是不可行的,因为
    map
    是惰性的。也就是说,它现在返回一个迭代器,而不是一个已经计算过的列表。副作用直到您通过ugh结果列表。这是正确的,当然是一个正确的观点,但问题表明OP可能不关心这些微妙之处。@LaurenceGonsalves谢谢。我编辑了Python 3中的第一个示例,使其正确。这很难看,它几乎和
    for
    循环一样长,如果iterable很长(可能是无限的)或者函数返回值很大,它会被一个
    MemoryError
    。编辑以删除映射讨论。它不是map(),因为map()会累积并返回一个列表,而foreach()不会。如果在一个很长的项目列表上迭代,差异可能会非常昂贵。同意()这很有意思,我见过这个
    from infixpy import Seq
    (Seq([1,2,3]).foreach(lambda x: print(x)))
    1
    2
    3
    
    [fn(x) for x in iterable]
    
    for x in iterable: fn(x)