Python 3中是否有“foreach”函数?

当我遇到这种情况时,我可以用javascript来实现,我总是认为如果有一个foreach函数,这将是方便的。 按照foreach我的意思是下面描述的function:

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

他们只是在每个元素上做,并没有产生或返回的东西,我认为它应该是一个内置函数,应该比用纯Python编写速度更快,但我没有在列表中find它,或者它只是叫另一个名字?或者我只是想念这里的一些观点?

也许我错了,因为调用Python的函数成本高,绝对不是一个好的做法。 而不是一个循环,该函数应该做的循环在其身体看起来像下面这已经在许多python的代码build议中提到:

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

但是我认为基于这两个事实,foreach仍然是受欢迎的:

  1. 在正常情况下,人们并不在乎performance
  2. 有时API不接受可迭代的对象,你不能重写它的源代码。

每一次我见过的“foreach”(PHP,C#,…)都和python的“for”语句基本相同。

这些或多或less是等同的:

 // 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”。 它被称为“为”。

你所描述的是一个“数组映射”function。 这可以通过Python中的列表parsing来完成:

 names = ['tom', 'john', 'simon'] namesCapitalized = [capitalize(n) for n in names] 

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

 for element in iterable: operate(element) 

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

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

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

在大多数情况下,对于问题中提到的情况, map是首选。

例如

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

对于需要多个参数的函数,可以给map更多的参数:

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

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

如果你的函数有多个参数,并且参数已经以元组的forms出现(或者是Python 2.6以后的任何迭代),你可以使用itertools.starmap 。 (它与你正在寻找的语法非常相似)。 它返回一个迭代器。

例如

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

给我们8和9

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

另一个例子

 // Python Foreach Loop for val in array: print(val) // Python For Loop for index in range(len(array)): print(array[index]) index+= 1 

如果我理解你的意思,你的意思是,如果你有一个函数'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))]