Nehmen wir an, ich habe einen Teil des Codes, der für eine bestimmte Zeitspanne ausgeführt wird, und jede Sekunde gibt etwa Folgendes aus: iteration X, score Y
. Ich werde diese Funktion durch meine Blackbox-Funktion ersetzen:
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
Wenn ich es jetzt in Jupyter-Notizbuch starte, wird nach jeder Sekunde eine neue Zeile ausgegeben:
Iteration 1 Score: 0.664167449844
Iteration 2 Score: 0.514757592404
...
Ja, wenn die Ausgabe zu groß wird, kann der HTML-Code gescrollt werden, aber ich brauche keine dieser Zeilen außer der letzten. Anstatt also n
Zeilen nach n
Sekunden zu haben, möchte ich nur 1
Zeile (die letzte) angezeigt.
Ich habe so etwas nicht in der Dokumentation oder in der Durchsicht von Magie gefunden. Eine Frage mit fast demselben Titel, aber irrelevant.
@cel ist richtig: ipython notebook clear cell output in code
Wenn Sie clear_output () benutzen, hat Ihr Notebook allerdings einige Probleme. Ich empfehle auch die Funktion display () wie folgt zu verwenden (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
Der übliche (dokumentierte) Weg, um das zu tun, was Sie beschreiben (das funktioniert nur mit Python 3)), ist:
print('Iteration', i, 'Score:', uniform(0, 1), end='\r')
In Python 2 müssen wir nach dem Ausdruck sys.stdout.flush()
, wie in diesem Beispiel gezeigt answer :
print('Iteration', i, 'Score:', uniform(0, 1), end='\r')
sys.stdout.flush()
Mit IPython Notebook musste ich die Zeichenfolge verketten, damit es funktioniert:
print('Iteration ' + str(i) + ', Score: ' + str(uniform(0, 1)), end='\r')
Und zum Schluss habe ich Folgendes verwendet, damit es mit Jupyter funktioniert:
print('\r', 'Iteration', i, 'Score:', uniform(0, 1), end='')
Oder Sie können die print
s vor und nach dem time.sleep
Aufteilen, wenn es sinnvoller ist, oder Sie müssen genauer sein:
print('Iteration', i, 'Score:', uniform(0, 1), end='')
time.sleep(1)
print('', end='\r') # or even print('\r', end='')