python foreach用法_Python 3中是否有一个“ 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) {

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)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值