2016-07-23 8 views
5

Załóżmy, że mam część kodu, która działa przez pewien określony czas, a każda 1 sekunda wyświetla coś takiego: iteration X, score Y. będę zastąpić tę funkcję z moim czarnym funkcji skrzynki:Zastąp poprzednie wyjście w notebooku jupyter

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 

Teraz, gdy uruchomię go w Jupyter notebook, to wyjściowy nową linię po każdej sekundy:

Iteration 1 Score: 0.664167449844 
Iteration 2 Score: 0.514757592404 
... 

Tak, po, gdy wyjście jest zbyt duży, html staje się przewijany, ale chodzi o to, że nie potrzebuję żadnej z tych linii, z wyjątkiem tej ostatniej. Zamiast linii n po n sekundach chcę wyświetlić tylko linię 1 (ostatnia).

Nie znalazłem czegoś takiego w dokumentacji lub przeglądając magię. A question z prawie takim samym tytułem, ale bez znaczenia.

+0

może to być rozwiązanie: http://stackoverflow.com/questions/24816237/ipython-notebook-clear-cell- output-in-code – cel

Odpowiedz

5

Zwykła (udokumentowane) droga do tego, co można opisać (które działa tylko z Python 3) wynosi:

print('Iteration', i, 'Score:', uniform(0, 1), end='\r') 

W Pythonie 2 mamy do sys.stdout.flush() po druku, jak to widać w tym answer:

print('Iteration', i, 'Score:', uniform(0, 1), end='\r') 
sys.stdout.flush() 

Korzystanie ipython notebook musiałem złączyć ciąg, aby to działało:

print('Iteration ' + str(i) + ', Score: ' + str(uniform(0, 1)), end='\r') 

I wreszcie, aby to działało z Jupyter użyłem to:

print('\r', 'Iteration', i, 'Score:', uniform(0, 1), end='') 

Albo można podzielić print s przed i po time.sleep jeśli to ma większy sens, czy trzeba być bardziej wyraźne:

print('Iteration', i, 'Score:', uniform(0, 1), end='') 
time.sleep(1) 
print('', end='\r') # or even print('\r', end='') 
+0

W systemie MacOS wydaje się, że nie generuje ono żadnych danych wyjściowych w notatniku. – cel

+0

@cel, po zainstalowaniu i próbie z jowerem, to nie działa również na Linuksie. To nie jest OS, musi być jakąś zmianą dokonaną przez Juwatera. – chapelo

+1

@cel Znaleziono * hack *, aby działał z Jupyter :) – chapelo

5

@cel ma rację: ipython notebook clear cell output in code

Używanie clear_output() daje sprawia, że ​​notebook ma trema, choć. I zaleca się wyświetlacz (funkcja), a także, jak to (Pythonie 2.7):

from random import uniform 
import time 
from IPython.display import display, clear_output 

def black_box(): 
i = 1 
while True: 
    clear_output() 
    display('Iteration '+str(i)+' Score: '+str(uniform(0, 1))) 
    time.sleep(1) 
    i += 1 
+0

Dobra odpowiedź! Nazwa modułu powinna być "IPython", jak sądzę. – Cnly

+0

przegłosowano. Dziękuję za to. – Cnly

+0

Dla szybkich pętli iteracyjnych proponuję clear_output (wait = True).Po ustawieniu wartości true, oczekiwanie powoduje, że opóźnienia są usuwane, dopóki nie zostanie odebrane nowe wejście. –

Powiązane problemy