pythonforeach⽤法_Python3中是否有⼀个“foreach”功能?当我遇到这种情况时,我可以使⽤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) {
writeline和write的区别pythonconsole.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)
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论