web-dev-qa-db-fra.com

Existe-t-il une fonction 'foreach' dans Python 3?

Quand je rencontre la situation, je peux le faire en javascript, je pense toujours que s'il y a une fonction foreach, ce serait pratique. Par foreach je veux dire la fonction qui est décrite ci-dessous:

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

ils le font juste sur chaque élément et n'ont pas donné ou retourné quelque chose, je pense que cela devrait être une fonction intégrée et devrait être plus rapide que l'écrire avec du Python pur, mais je ne l'ai pas trouvé sur la liste, ou il vient d'appeler un autre nom - ou je manque juste quelques points ici?

Peut-être que je me suis trompé, car appeler une fonction dans Python coûte cher, ce n'est certainement pas une bonne pratique pour l'exemple. Plutôt qu'une boucle de sortie, la fonction devrait faire la boucle de côté. Son corps ressemble à ceci ci-dessous, ce qui a déjà été mentionné dans de nombreuses suggestions de code de python:

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

mais je pensais que foreach est toujours le bienvenu sur la base de deux faits:

  1. Dans des cas normaux, les gens ne se soucient tout simplement pas de la performance
  2. Parfois, l'API n'acceptait pas d'objet itératif et vous ne pouvez pas réécrire son source.
109
user2003548

Chaque occurrence de "foreach" que j'ai vue (PHP, C #, ...) est fondamentalement la même chose que pythons "pour".

Ce sont plus ou moins équivalents:

// PHP:
foreach ($array as $val) {
    print($val);
}

// C#
foreach (String val in array) {
    console.writeline(val);
}

// Python
for val in array:
    print(val)

Donc, oui, il y a un "foreach" en python. Ça s'appelle "pour".

Ce que vous décrivez est une fonction "carte de tableau". Cela pourrait être fait avec liste compréhensions en python:

names = ['tom', 'john', 'simon']

namesCapitalized = [capitalize(n) for n in names]
137
Jo Are By

Python n'a pas d'instruction foreach en soi . Il a for boucles intégrées dans le langage.

for element in iterable:
    operate(element)

Si vous le souhaitez vraiment, vous pouvez définir votre propre fonction foreach:

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

Notons que la syntaxe for element in iterable provient du langage de programmation ABC , l'une des influences de Python.

42
Phillip Cloud

Autres exemples:

Boucle Foreach Python:

array = ['a', 'b']
for value in array:
    print(value)
    # a
    # b

Python pour la boucle:

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
25
uingtea

map peut être utilisé pour la situation mentionnée dans la question.

Par exemple.

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

Pour les fonctions qui prennent plusieurs arguments, plusieurs arguments peuvent être donnés pour mapper:

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

Il retourne une liste dans python 2.x et un itérateur dans python 3.

Dans le cas où votre fonction prend plusieurs arguments et que les arguments sont déjà sous la forme de tuples (ou de tout élément itérable depuis python 2.6), peut utiliser itertools.starmap . (qui a une syntaxe très similaire à celle que vous recherchiez). Il retourne un itérateur.

Par exemple.

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

nous donne 8 et 9

5
Akshit Khurana

Si je vous ai bien compris, vous voulez dire que si vous avez une fonction 'func', vous voulez vérifier chaque élément de la liste si func (item) renvoie la valeur true; si vous devenez vrai pour tous, faites quelque chose.

Vous pouvez utiliser "tous".

Par exemple: je veux obtenir tous les nombres premiers compris entre 0 et 10 dans une liste:

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))]
2
Be'ezrat Hashem

Si vous cherchez simplement une syntaxe plus concise, vous pouvez mettre la boucle pour sur une seule ligne:

array = ['a', 'b']
for value in array: print(value)

Séparez simplement les instructions supplémentaires par un point-virgule.

array = ['a', 'b']
for value in array: print(value); print('hello')

Cela peut ne pas être conforme à votre guide de style local, mais il peut être judicieux de le faire comme ceci lorsque vous jouez dans la console.

1
aris

Cela fait foreach dans python 3

test = [0,1,2,3,4,5,6,7,8,"test"]

for fetch in test:
    print(fetch)
1
veera sai

Regardez cet article . L’objet itérateur nditer du paquet numpy , introduit dans NumPy 1.6, fournit de nombreuses manières flexibles de visiter systématiquement tous les éléments d’un ou de plusieurs tableaux.

Exemple:

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]]
1
foo bar