¿Hay una función ‘foreach’ en Python 3?

3 minutos de lectura

avatar de usuario
usuario2003548

Cuando me encuentro con la situación lo puedo hacer en javascript, siempre pienso si hay un foreach función sería conveniencia. Por foreach me refiero a la función que se describe a continuación:

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

simplemente lo hacen en cada elemento y no produjeron ni devolvieron algo, creo que debería ser una función integrada y debería ser más rápido que escribirlo con Python puro, pero no lo encontré en la lista, o ¿simplemente llamó otro nombre? ¿O simplemente me olvidé de algunos puntos aquí?

Tal vez me equivoqué, porque llamar a una función en Python cuesta mucho, definitivamente no es una buena práctica para el ejemplo. En lugar de un bucle de salida, la función debe hacer el bucle en el lado de su cuerpo que se ve así a continuación, que ya se mencionó en muchas sugerencias de código de Python:

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

pero pensé que foreach todavía es bienvenido en base a los dos hechos:

  1. En casos normales, a la gente simplemente no le importa el rendimiento.
  2. En algún momento, la API no aceptó el objeto iterable y no puede volver a escribir su fuente.

  • ¿Qué tiene de malo usar solo un for ¿círculo?

    usuario395760

    18 de agosto de 2013 a las 0:30


  • Esto es exactamente lo que for es para.

    – usuario2357112

    18 de agosto de 2013 a las 1:02

  • no hay nada malo con for loop, solo por conveniencia

    – usuario2003548

    18 de agosto de 2013 a las 1:12

  • @ user2357112, es deseable tener una abreviatura para llamar a una función una vez por elemento de una lista. list.each(func) es más limpio que for item in list: func(item), OMI. El problema es que Python ha hecho un buen trabajo reemplazando favoritos funcionales como map() y filter() con listas de comprensión que simplemente amplían su función integrada for y if (que sean homogéneos y legibles) y un específico .each() podría ir en contra de eso.

    – sevko

    9 dic 2014 a las 16:15

  • sum(0 for _ in map(f, seq)) es una solución legible.

    – Johannes Schaub – litb

    11 de junio de 2018 a las 18:44


avatar de usuario
Jo son por

Cada ocurrencia de “foreach” que he visto (PHP, C #, …) hace básicamente lo mismo que la declaración “for” de Python.

Estos son más o menos equivalentes:

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

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

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

Entonces, sí, hay un “foreach” en python. Se llama “por”.

Lo que estás describiendo es una función de “mapa de matriz”. Esto podría hacerse con lista de comprensiones en pitón:

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

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

  • No es map(), porque map() acumula y devuelve una lista, mientras que foreach() no lo hace. La diferencia podría ser bastante costosa si está iterando sobre una larga lista de elementos. De acuerdo en que for() hace el truco.

    – Canuck

    08/04/2015 a las 17:10

  • He visto esto referido como un para adentro círculo.

    – Vox

    9 de julio de 2015 a las 21:23


  • Preguntaron por la función, pero respondiste con una declaración.

    – Johannes Schaub – litb

    12 de junio de 2018 a las 7:08

  • @JohannesSchaub-litb es que tiene razón… ‘for’ en python es literalmente ‘foreach’ conocido en otros idiomas… en tcl for, por ejemplo, un bucle ‘for’ sería algo así como for {cosas corridas al principio de loop} {condición aquí} {cosas que se ejecutan en cada iteración} {comandos aquí…} p. ej.: for {set x 1} {$x <= 10} {incr x} {puts $x} también puede agregar extra comprueba dentro de las llaves de iteración usando ';'. Para mí, tendría más sentido si viniera aquí preguntando si Python tenía un verdadero bucle 'for'

    – Francisco

    18 de enero de 2019 a las 7:40

  • @Francisco También tengo razón al decir que la tierra no es plana. Pero no lo agregaré como respuesta.

    – Johannes Schaub – litb

    18 de enero de 2019 a las 17:44

avatar de usuario
phillip nube

Python no tiene un foreach declaración per se. Tiene for bucles integrados en el lenguaje.

for element in iterable:
    operate(element)

Si realmente quisieras, podrías definir tu propia foreach función:

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

Como nota al margen la for element in iterable la sintaxis proviene el abecedario lenguaje de programación, una de las influencias de Python.

  • Si está haciendo esto por efectos secundarios, en lugar de por el resultado de la asignación, entonces use map de esta manera realmente no va a funcionar en Python 3 donde map es perezoso. Es decir, ahora devuelve un iterador, no una lista ya calculada. Los efectos secundarios no se producirán hasta que repita la lista resultante.

    – Laurence Gonsalves

    18 de agosto de 2013 a las 0:38

  • Eso es cierto y ciertamente un punto válido, pero la pregunta sugiere que el OP probablemente no esté preocupado por tales sutilezas.

    – Felipe Nube

    18 de agosto de 2013 a las 0:41

  • @LaurenceGonsalves Gracias. He editado para que el primer ejemplo sea correcto en Python 3.

    – Felipe Nube

    18 de agosto de 2013 a las 0:48

  • Esto es feo, es casi tan largo como el for bucle, y si el iterable es largo (quizás infinito) o los valores de retorno de la función son grandes, se rompe con un MemoryError.

    – usuario2357112

    18 de agosto de 2013 a las 1:05

  • Editado para eliminar la discusión del mapa.

    – Felipe Nube

    11 de junio de 2016 a las 17:18

avatar de usuario
uingtea

Otros ejemplos:

Bucle Foreach de Python:

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

Python para bucle:

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

  • Esto no es una foreach construir en su lugar es un bucle para emularlo.

    – Proyectos de la costa oeste

    8 de julio a las 5:53

  • si para emular.

    – uingtea

    8 de julio a las 12:26

avatar de usuario
Akshit Khurana

map se puede utilizar para la situación mencionada en la pregunta.

P.ej

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

Para funciones que toman múltiples argumentos, se pueden dar más argumentos al mapa:

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

Devuelve una lista en python 2.x y un iterador en python 3

En caso de que su función tome múltiples argumentos y los argumentos sean ya en forma de tuplas (o cualquier iterable desde python 2.6) puede usar itertools.starmap. (que tiene una sintaxis muy similar a lo que estabas buscando). Devuelve un iterador.

P.ej

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

nos da 8 y 9

avatar de usuario
ProyectosCostaOeste

La respuesta correcta es “las colecciones de python no no tener un foreach“. En python nativo necesitamos recurrir a la externa for _element_ in _collection_ sintaxis que es no lo que busca el OP.

Python es, en general, bastante débil para la programación funcional. Hay algunas bibliotecas para mitigar un poco. Ayudé a escribir uno de estos infixpy

pip install infixpy https://pypi.org/proyecto/infixpy/

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

Ver también: Aplicación de operaciones de izquierda a derecha en una lista en Python 3

  • Esta es la respuesta que estaba buscando. La mayoría de las otras respuestas no son claras acerca de que Python carece de un bucle integrado para cada uno, y solo proporciona soluciones alternativas. ¡Salud!

    – Causando subdesbordamientos en todas partes

    3 de febrero a las 19:07

Sí, aunque usa la misma sintaxis que un bucle for.

for x in ['a', 'b']: print(x)

  • Esta es la respuesta que estaba buscando. La mayoría de las otras respuestas no son claras acerca de que Python carece de un bucle integrado para cada uno, y solo proporciona soluciones alternativas. ¡Salud!

    – Causando subdesbordamientos en todas partes

    3 de febrero a las 19:07

Aquí está el ejemplo de la construcción “foreach” con acceso simultáneo a la índices de elementos en Python:

for idx, val in enumerate([3, 4, 5]):
    print (idx, val)

  • ¡Esto es brillante! Mucho más limpio que for idx in range(len(myList)):\print(idx,myList[idx]) dónde myList=[3, 4, 5].

    – Brazo

    7 dic 2020 a las 21:07

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad