210 votes

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

Lorsque je rencontre la situation où je peux le faire en javascript, je pense toujours que s'il y a une foreach fonction, ce serait une commodité. Par foreach, j'entends la fonction qui est décrite ci-dessous :

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

ils l'ont juste fait 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 de l'écrire avec du Python pur, mais je ne l'ai pas trouvé sur la liste, ou il a juste appelé un autre nom ? ou j'ai juste manqué quelques points ici ?

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

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

mais je pensais que foreach était toujours le bienvenu sur la base des deux faits :

  1. Dans la plupart des cas, les gens ne se soucient pas de la performance.
  2. Parfois, l'API n'accepte pas l'objet itérable et vous ne pouvez pas réécrire sa source.

232voto

Jo Are By Points 459

Toutes les occurrences de "foreach" que j'ai vues (PHP, C#, ...) font fondamentalement la même chose que l'instruction "for" de Python.

Elles sont plus ou moins équivalentes :

// 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. Il s'appelle "for".

Ce que vous décrivez est une fonction "array map". Cela peut être fait avec compréhensions de listes en python :

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

namesCapitalized = [capitalize(n) for n in names]

67voto

Phillip Cloud Points 6685

Python ne dispose pas d'un foreach déclaration en soi . Il a for boucles intégrées dans le langage.

for element in iterable:
    operate(element)

Si vous le vouliez vraiment, vous pourriez définir votre propre foreach fonction :

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

A titre d'information, le for element in iterable La syntaxe vient de l'ABC langage de programmation, l'une des influences de Python.

34voto

uingtea Points 763

Autres exemples :

Boucle Foreach en Python :

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

Python For Loop :

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

13voto

Akshit Khurana Points 328

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, d'autres arguments peuvent être donnés à map :

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

Il renvoie une liste en python 2.x et un itérateur en 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 itérable depuis python 2.6), vous pouvez utiliser itertools.starmap . (qui a une syntaxe très similaire à celle que vous recherchiez). Il renvoie un itérateur.

Par exemple

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

nous donne 8 et 9

8voto

javadba Points 2430

La bonne réponse est "python collections do no ont un foreach ". En python natif, nous devons recourir à l'outil externe for _element_ in _collection_ syntaxe qui est no ce que le PO recherche.

Python est en général assez faible pour la programmation fonctionnelle. Il existe quelques bibliothèques qui permettent d'atténuer un peu le problème. J'ai participé à la création de l'une d'entre elles infixpy https://pypi.org/project/infixpy/

from infixpy import Seq
(Seq([1,2,3]).foreach(lambda x: print(x)))
1
2
3

Voir aussi : Application de gauche à droite des opérations sur une liste en Python 3

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X