wake-up-neo.com

Überschreibt die vorherige Ausgabe in Jupyter Notebook

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.

23
Salvador Dali

@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
31
DangerousDave

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 prints 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='')
14
chapelo