是否有一个';foreach&x27;Python 3中的函数?
当我遇到这种情况时,我可以用javascript来做,我总是认为如果有一个是否有一个';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中调
foreach
函数,那会很方便。我所说的foreach是指下述功能:
def foreach(fn,iterable):
for x in iterable:
fn(x)
他们只是在每个元素上都这样做,没有产生或返回任何东西,我认为它应该是一个内置函数,应该比用纯Python编写更快,但我没有在列表中找到它,或者它只是调用了另一个名称?或者我只是错过了一些要点
也许我弄错了,因为在Python中调用函数的成本很高,对于本例来说,这绝对不是一个好的实践。函数应该在其主体中执行循环,而不是外循环,如下所示,这已在许多python代码建议中提到:
def fn(*args):
for x in args:
dosomething
但基于以下两个事实,我认为foreach仍然受欢迎:
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)