2013-08-18 24 views
51

Quando incontro la situazione posso farlo in javascript, penso sempre che se c'è una funzione sarebbe conveniente. Con foreach intendo la funzione che viene descritto di seguito:Esiste una funzione 'foreach' in Python 3?

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

solo che su ogni elemento e non ha dato o restituire qualcosa, penso che dovrebbe essere una funzione built-in e dovrebbe essere più veloce di scrivendolo con Python puro, ma non l'ho trovato sulla lista, o ha appena chiamato un altro nome? o mi mancano alcuni punti qui?

Forse ho sbagliato, perché chiamare una funzione in Python costa molto, sicuramente non è una buona pratica per l'esempio. Invece di un loop out, la funzione dovrebbe fare il loop in parte il suo corpo assomiglia a questo sotto del quale già menzionato nel suggerimenti codice di molti pitone:

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

ma ho pensato foreach è ancora base accogliente sui due fatti:

  1. In casi normali, la gente non si preoccupano le prestazioni
  2. A volte l'API non ha accettato oggetto iterabile e non si può riscrivere la sua fonte.
+2

Cosa c'è di sbagliato con solo utilizzando un 'ciclo for'? – delnan

+1

Questo è esattamente ciò che 'for' è per. – user2357112

+0

Non c'è niente di sbagliato nel ciclo, solo per comodità – user2003548

risposta

20

Python non ha rilasciato dichiarazioni foreachper sé. Ha i loop for integrati nella lingua.

for element in iterable: 
    operate(element) 

Se si voleva davvero, è possibile definire il proprio foreach funzione:

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

Come nota a margine la sintassi for element in iterable viene da the ABC linguaggio di programmazione, una delle influenze di Python.

+10

Se stai facendo questo per gli effetti collaterali, piuttosto che per il risultato della mappatura, allora usare 'map' in questo modo non funzionerà in Python 3 dove' map' è pigro. Cioè, ora restituisce un iteratore, non una lista già calcolata. Gli effetti collaterali non avranno luogo finché non si itera l'elenco risultante. –

+0

Questo è vero e certamente un punto valido, ma la domanda suggerisce che il PO non è probabilmente interessato a tali sottigliezze. –

+0

@LaurenceGonsalves Grazie. Ho modificato per rendere corretto il primo esempio in Python 3. –

81

Ogni occorrenza di "foreach" che ho visto (PHP, C#, ...) è praticamente la stessa di "python" per "dichiarazione".

Questi sono più o meno equivalenti:

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

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

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

Quindi, sì, c'è un "foreach" in pitone. Si chiama "per".

Quello che stai descrivendo è una funzione "mappa di array". Ciò potrebbe essere fatto con list comprehensions in pitone:

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

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

Non è map(), perché map() accumula e restituisce un elenco, mentre foreach() no. La differenza potrebbe essere piuttosto costosa se stai iterando su un lungo elenco di elementi. D'accordo che per() fa il trucco. – Canuck

+2

Ho visto questo come un ciclo __for-in__. – Vox

3

map è preferito nella maggior parte dei casi per la situazione menzionata nella domanda.

E.g.

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

Per le funzioni che accettano più argomenti, più argomenti può essere dato per mappare:

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

Si ritorna una lista in Python 2.x e un iteratore in Python 3

Nel caso la vostra funzione prende più argomenti e gli argomenti sono già sotto forma di tuple (o di qualunque iterabile dal Python 2.6) è possibile utilizzare itertools.starmap. (che ha una sintassi molto simile a quella che stavi cercando). Restituisce un iteratore.

E.g.

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

ci dà 8 e 9

+1

'map' e' foreach' hanno un significato diverso.'map' restituisce una lista di risultati (che implica la creazione di una lista, o una struttura enumerabile, o una struttura che sarà consumata, e quindi non chiamata immediatamente),' foreach' chiama la funzione su ciascun elemento, ignorando il risultato. – njzk2

+0

'Foreach' deve restituire immediatamente il risultato. Dire che creare iteratore invece di foreach è preferito è una schifezza totale. –

2

un altro esempio

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

// Python For Loop 
for index in range(len(array)): 
    print(array[index]) 
    index+= 1 
0

Se ho capito destro, vuoi dire che se si dispone di una funzione di 'func', si consiglia di controllare per ogni voce nell'elenco se func (item) restituisce true; se diventi vero per tutti, allora fai qualcosa.

È possibile utilizzare "tutti".

Per esempio: Voglio ottenere tutti i numeri primi nella gamma 0-10 in un elenco:

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))] 
1

Guarda this article. L'oggetto iteratore nditer dal pacchetto numpy, introdotto in NumPy 1.6, offre molti modi flessibili per visitare tutti gli elementi di uno o più array in modo sistematico.

Esempio:

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]] 
Problemi correlati