Soy un principiante y uso Python 2.7. Quiero hacer que los parámetros de las definiciones sean cambiables para poder controlar la pausa y la salida de la cadena sobre la marcha. es posible? He leído algunas cosas de hilo pero parece ser más sobre la ejecución de dos tareas al mismo tiempo. Quiero comunicación entre las dos tareas durante el tiempo de ejecución.
def writeAndPause(stringToWrite,pauseSeconds)
while True:
print stringToWrite
sleep(pauseSeconds)
Cualquier solución o enlace a la documentación es muy apreciada. ¡Gracias por tu tiempo! / Karl
3 respuestas
Los hilos son para trabajo simultáneo. Supongo que si solo rediseñas tu código tendrás el efecto que deseas. Considere eliminar la cláusula while
de su función y ponerla afuera:
def writeAndPause(stringToWrite,pauseSeconds)
print stringToWrite
sleep(pauseSeconds)
Y en algún lugar llamas a esta función:
while True:
stringToWrite, pauseSeconds = gatherSomeInformation()
writeAndPause(stringToWrite, pauseSeconds)
@Constantinius tiene razón: la respuesta es casi seguro rediseñar su código para que no tenga que hacer algo esotérico.
Describiré otra forma de hacerlo por pura diversión. Si realmente desea mantener ese ciclo while dentro de la función, puede hacerlo con un Expresión de rendimiento
Por ejemplo:
def writeAndPause():
while True:
stringToWrite, pauseSeconds = yield
print stringToWrite
sleep(pauseSeconds)
Esto se puede usar de la siguiente manera:
# create the generator
writer = writeAndPause()
# start the generator
writer.next()
# resume execution and send new values into generator
writer.send(('start string', 10))
'start string'
# resume execution and send another set of new values into generator
writer.send(('new string', 20))
'new string'
Ahora que lo has visto, olvídalo y haz lo que @Constantinius dijo.
¿Esto te ayuda?
Aprovecha las características de la definición de argumento predeterminada y el hecho de que una lista no es una variable sino una colección de referencias, en mi código solo una (dicho brevemente)
from time import sleep,time
stringToWrite = [None]
pauseSeconds = [0]
def writeAndPause(stw = stringToWrite, pz = pauseSeconds, keep = [time()]):
if stw[0]:
print stw[0]
else:
print 'START'
print ' having waited ',time()-keep[0],'seconds, must wait',pz[0],'seconds'
keep[0] = time()
sleep(pz[0])
writeAndPause()
for a,b in (('first',1),('second',2.05),('third',3.4),('fourth',0.88),
('BANANA',0.2),('APPLE',1.5),
('PEAR',0.77),('CHERRY',4),
('ORANGE',0.1),('NUT',6),
('APRICOT',0.56),('PLUM',2.5)):
stringToWrite[0] = a
pauseSeconds[0] = b
writeAndPause()
Resultado
START
having waited 0.0310001373291 seconds, must wait 0 seconds
first
having waited 0.0320000648499 seconds, must wait 1 seconds
second
having waited 1.01600003242 seconds, must wait 2.05 seconds
third
having waited 2.15600013733 seconds, must wait 3.4 seconds
fourth
having waited 3.42100000381 seconds, must wait 0.88 seconds
BANANA
having waited 0.905999898911 seconds, must wait 0.2 seconds
APPLE
having waited 0.266000032425 seconds, must wait 1.5 seconds
PEAR
having waited 1.51499986649 seconds, must wait 0.77 seconds
CHERRY
having waited 0.796999931335 seconds, must wait 4 seconds
ORANGE
having waited 4.03200006485 seconds, must wait 0.1 seconds
NUT
having waited 0.140000104904 seconds, must wait 6 seconds
APRICOT
having waited 6.03099989891 seconds, must wait 0.56 seconds
PLUM
having waited 0.765000104904 seconds, must wait 2.5 seconds
Preguntas relacionadas
Nuevas preguntas
python
Python es un lenguaje de programación multipropósito, de tipificación dinámica y de múltiples paradigmas. Está diseñado para ser rápido de aprender, comprender y usar, y hacer cumplir una sintaxis limpia y uniforme. Tenga en cuenta que Python 2 está oficialmente fuera de soporte a partir del 01-01-2020. Aún así, para preguntas de Python específicas de la versión, agregue la etiqueta [python-2.7] o [python-3.x]. Cuando utilice una variante de Python (por ejemplo, Jython, PyPy) o una biblioteca (por ejemplo, Pandas y NumPy), inclúyala en las etiquetas.