当我遇到这种情况时,我可以使用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不接受可迭代对象,因此您无法重写其源代码。
仅使用for循环有什么问题?
这正是for的用途。
for循环没什么问题,只是为了方便
@ user2357112,它希望有一个快捷方式来为列表的每个项目调用一次函数。 list.each(func)比IMO for item in list: func(item)更干净。 问题在于,Python很好地用列表推导替换了功能性收藏夹(如map()和filter()),列表推导简单地扩展了其内置的for和if(同类且可读)和特定的可能与此相反。
sum(0 for _ in map(f, seq))是一种可读的解决方法。
我所见过的每次出现的" 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"。它称为" for"。
您要描述的是"数组映射"功能。这可以通过python中的列表理解来完成:
names = ['tom', 'john', 'simon']
namesCapitalized = [capitalize(n) for n in names]
它不是map(),因为map()会累积并返回一个列表,而foreach()不会。如果您要遍历一长串项目,则差异可能会非常昂贵。同意for()可以解决问题。
我已经看到这被称为for-in循环。
他们询问功能,但是您回答了。
@ JohannesSchaub-litb的事情是他是对的...因为在python中,foreach实际上是其他语言所知的...在tcl中,例如for循环将类似于{stuff在循环开始时运行} {条件在这里} {每次迭代中运行的内容} {此处的命令...}例如:对于{set x 1} {$ x <= 10} {incr x} {puts $ x}您还可以使用以下命令在迭代括号内添加额外的检查;。对我来说,如果他来这里问python是否有一个真正的for循环,那将更有意义。
@Francisco Im也说地球不是平坦的。但我不会将其添加为答案。
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的影响之一。
如果您这样做是出于副作用而不是映射的结果,那么以这种方式使用map并不能真正在map惰性的Python 3中工作。也就是说,它现在返回一个迭代器,而不是已经计算出的列表。除非您遍历结果列表,否则副作用不会发生。
没错,这当然是正确的观点,但是这个问题表明,OP可能并不关心这种微妙之处。
@LaurenceGonsalves谢谢。我已经编辑过以使第一个示例在Python 3中正确无误。
这很丑陋,几乎和for循环一样长,并且如果iterable很长(也许是无限的)或函数的返回值很大,则它会以MemoryError中断。
什么丑陋?第一个例子?可以,但是可以回答问题。我还提到了仅使用普通的for循环工作以及列表推导。
下选民会在意发表评论吗?
map和foreach是两个不同的抽象。 map应该返回一个新值,而foreach根本不返回任何值。我想答案中的第一句话会导致投票否决。
编辑后删除地图讨论。
其他例子:
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
map可以用于问题中提到的情况。
例如。
map(len, ['abcd','abc', 'a']) # 4 3 1
对于带有多个参数的函数,可以给映射提供更多参数:
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
map和foreach具有不同的含义。 map返回结果列表(这意味着创建列表,可枚举的结构或将要使用的结构,因此不会立即调用),foreach在每个项目上调用函数,而忽略结果。
foreach必须立即返回结果。说创建迭代器而不是foreach是首选。
当忽略结果时使用map()是反模式。您应该改用for循环。
这在python 3中做了foreach
test = [0,1,2,3,4,5,6,7,8,"test"]
for fetch in test:
print(fetch)
这不能回答问题。
如果我没看错,意思是如果您有一个函数'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))]
如果您只是在寻找一种更简洁的语法,可以将for循环放在一行上:
array = ['a', 'b']
for value in array: print(value)
只需用分号分隔其他语句即可。
array = ['a', 'b']
for value in array: print(value); print('hello')
这可能与您的本地风格指南不符,但是在控制台中玩耍时这样做是有道理的。
看这篇文章。 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]]
是的,尽管它使用与for循环相同的语法。
for x in ['a', 'b']: print(x)