suma - ¿Cómo invoco una función dos o más veces consecutivas en python?
mclibre funciones python (8)
¿Un bucle simple para?
for i in range(3):
do()
O bien, si está interesado en los resultados y desea recopilarlos, con la ventaja de ser un trazador de líneas 1:
vals = [do() for _ in range(3)]
¿Hay alguna forma de llamar a una función dos o más veces consecutivas en python? Por ejemplo:
do()
do()
do()
tal como:
3*do()
Me gustaría:
for _ in range(3):
do()
El _
es una convención para una variable cuyo valor no te importa.
También puede ver a algunas personas escribir:
[do() for _ in range(3)]
sin embargo, eso es un poco más caro porque crea una lista que contiene los valores de retorno de cada invocación de do()
(incluso si es None
), y luego descarta la lista resultante. No recomendaría usar esto a menos que esté usando la lista de valores devueltos.
Podría definir una función que repita la función aprobada N veces.
def repeat_fun(times, f):
for i in range(times): f()
Si desea hacerlo aún más flexible, puede pasar argumentos a la función que se repite:
def repeat_fun(times, f, *args):
for i in range(times): f(*args)
Uso:
>>> def do():
... print ''Doing''
...
>>> def say(s):
... print s
...
>>> repeat_fun(3, do)
Doing
Doing
Doing
>>> repeat_fun(4, say, ''Hello!'')
Hello!
Hello!
Hello!
Hello!
Tres formas más de hacerlo:
(I) Creo que usar map
también puede ser una opción, aunque es necesario generar una lista adicional con None
s en algunos casos y siempre necesita una lista de argumentos:
def do():
print ''hello world''
l=map(lambda x: do(), range(10))
(II) Las itertools
contienen funciones que pueden usarse para iterar a través de otras funciones también https://docs.python.org/2/library/itertools.html
(III) El uso de listas de funciones no se mencionó hasta el momento, creo (y en realidad es el más cercano en sintaxis al originalmente discutido):
it=[do]*10
[f() for f in it]
O como un trazador de líneas:
[f() for f in [do]*10]
Mis dos centavos:
from itertools import repeat
list(repeat(f(), x)) # for pure f
[f() for f in repeat(f, x)] # for impure f
Puede probar while loop como se muestra a continuación;
def do1():
do something
def do2():
x=0
while x<n:
do1()
x=x+1
do2()
Por lo tanto, llame a la función do1 n veces.
Aquí hay un enfoque que no requiere el uso de un bucle for
o la definición de una función intermedia o una función lambda (y también es de una sola línea). El método combina las siguientes dos ideas:
llamando a la función incorporada
iter()
con el argumento centinela opcional, yusando la receta
itertools
para avanzar un iterador en pasosn
(ver la receta paraconsume()
).
Juntando esto, obtenemos:
next(islice(iter(do, object()), 3, 3), None)
(La idea de pasar object()
como centinela proviene de esta respuesta aceptada de desbordamiento de pila.)
Y esto es lo que parece desde el mensaje interactivo:
>>> def do():
... print("called")
...
>>> next(itertools.islice(iter(do, object()), 3, 3), None)
called
called
called
from itertools import repeat, starmap
results = list(starmap(do, repeat((), 3)))
Vea la receta repeatfunc del módulo itertools que en realidad es mucho más poderosa. Si necesita simplemente llamar al método pero no le importan los valores devueltos, puede usarlo en un ciclo for:
for _ in starmap(do, repeat((), 3)): pass
pero eso se está poniendo feo