Supposons que j'ai une partie du code qui s'exécute pendant un certain temps et que chaque seconde génère quelque chose comme ceci: iteration X, score Y
. Je remplacerai cette fonction par ma fonction de boîte noire:
from random import uniform
import time
def black_box():
i = 1
while True:
print 'Iteration', i, 'Score:', uniform(0, 1)
time.sleep(1)
i += 1
Maintenant, quand je l'exécute dans Jupyter notebook , il affiche une nouvelle ligne après chaque seconde:
Iteration 1 Score: 0.664167449844
Iteration 2 Score: 0.514757592404
...
Oui, après que la sortie devienne trop grande, le html devient défilable, mais le fait est que je n'ai besoin d'aucune de ces lignes à l'exception de la dernière. Donc, au lieu d'avoir n
lignes après n
secondes, je veux avoir seulement 1
ligne (la dernière) affichée.
Je n'ai rien trouvé de tel dans la documentation ou dans la magie. ne question avec presque le même titre mais non pertinent.
@cel a raison: sortie de cellule claire du cahier ipython dans le code
L'utilisation de clear_output () donne cependant à votre ordinateur portable la nervosité. Je recommande également d'utiliser la fonction display (), comme ceci (Python 2.7):
from random import uniform
import time
from IPython.display import display, clear_output
def black_box():
i = 1
while True:
clear_output(wait=True)
display('Iteration '+str(i)+' Score: '+str(uniform(0, 1)))
time.sleep(1)
i += 1
La façon habituelle (documentée) de faire ce que vous décrivez (qui ne fonctionne qu'avec Python 3) est:
print('Iteration', i, 'Score:', uniform(0, 1), end='\r')
Dans Python 2, nous devons sys.stdout.flush()
après l'impression, comme cela apparaît dans ce réponse :
print('Iteration', i, 'Score:', uniform(0, 1), end='\r')
sys.stdout.flush()
En utilisant le bloc-notes IPython, j'ai dû concaténer la chaîne pour la faire fonctionner:
print('Iteration ' + str(i) + ', Score: ' + str(uniform(0, 1)), end='\r')
Et enfin, pour le faire fonctionner avec Jupyter, j'ai utilisé ceci:
print('\r', 'Iteration', i, 'Score:', uniform(0, 1), end='')
Ou vous pouvez diviser les print
avant et après le time.sleep
Si cela a plus de sens, ou vous devez être plus explicite:
print('Iteration', i, 'Score:', uniform(0, 1), end='')
time.sleep(1)
print('', end='\r') # or even print('\r', end='')