2013-04-25 27 views
7

içinde yineleme işlevlerinin içinde yazdırma() işlevini kullanarak, Ljubomir Perkovic tarafından Python'a Giriş İşlemine Giriş kitabını takip ediyorum ve kitabın yineleme bölümünde yer alan örneklerden biriyle sorun yaşıyorum. kod aşağıdaki gibidir:Python3

def pattern(n): 
    'prints the nth pattern' 
    if n == 0: # base case 
     print(0, end=' ') 
    else: #recursive step: n > 0 
     pattern(n-1)   # print n-1st pattern 
     print(n, end=' ') # print n 
     pattern(n-1)   # print n-1st pattern 
diyelim için

, pattern(1), çıkış 0 1 0 olmalı ve yatay görüntülenmesi gerekir. Bununla birlikte, pattern(1) işlevini çağırırken hiçbir şey yazdırılmaz. Ancak, bunu argümanlar olmadan bir baskı ifadesi izlerse, sonuçlar görüntülenir. Ben özyinelemeli işlevi içinde print() fonksiyonların end argüman kaldırırsanız (dikey görüntüler de olsa)

>>>pattern(1) 
>>>print() 
0 1 0 

, ben doğru çıktı almak:

>>> pattern(1) 
0 
1 
0 

Bu beni düşündürüyor bu özyinelemeli kod kendisi doğru (artı kitabın web sitesi tarafından sağlanan kaynak ve errata sayfası ile olduğunu doğruladı). Ancak, print ifadesinin neden end parametresi eklenmişse, işlevlerin işlevler olarak yazdırılmamasına neden olduğundan emin değilim. Herhangi bir yardım büyük takdir edilecektir.

+0

Bu sorun IDE özgü olabilir:

bu iki programlarda farkı görün. Ubuntu/gnome-terminalinde (veya IPython + emacs'de) çalıştırılan Python3'ün kullanılmadığı görülüyor. – unutbu

cevap

7

print işlevi, çıkışı her zaman temizlemez. Açıkça bunu yıkamalı: python3.3 print üzerine size (sys.stdout.flush kullanmaktan kaçınmak böylece ve) zorla çıkış yıkayın için kullanabileceğiniz yeni bir anahtar kelime argüman flush sahip olduğunu

import sys 

def pattern(n): 
    'prints the nth pattern' 
    if n == 0: # base case 
     print(0, end=' ') 
    else: #recursive step: n > 0 
     pattern(n-1)   # print n-1st pattern 
     print(n, end=' ') # print n 
     pattern(n-1)   # print n-1st pattern 
    sys.stdout.flush() 

Not. Bu kod daha esnek ve yeniden kullanılabilir hale getirir

def gen_pattern(n): 
    if n == 0: 
     yield 0 
    else: 
     for elem in gen_pattern(n-1): 
      yield elem 
     yield n 
     for elem in gen_pattern(n-1): 
      yield elem 

def print_pattern(n): 
    for elem in gen_pattern(n): 
     print(elem, end=' ') 
    sys.stdout.flush() 

ve sadece flush arayarak avantajına sahiptir: Ben örneğin yapıyor, modelden çıkışını ayrıştırmak yaptığınız genel not


bir kez, ya da her x öğesinde bir kez de çağırabilirsiniz (aslında ben print zaten bunu yapar. Ekranda birçok karakter yazmaya çalışıyorsa, temizler).

python3.3 olarak kod biraz basitleştirilmiş olabilir:

def gen_pattern(n): 
    if n == 0: 
     yield 0 
    else: 
     yield from gen_pattern(n-1) 
     yield n 
     yield from gen_pattern(n-1) 
+3

Ancak etkileşimli kabuğunda kızarma değil _very_ garip görünüyor. –

+0

@LevLevitsky Desen (1) gibi bir şey yaparsanız; time.sleep (10) ' – Bakuriu

+0

Bunu yaptı! Teşekkürler! – gos1

4

nedeni end diğer bazı değerle kullanıldığında bir "\n" sonra baskı fonksiyonu bütün değerini biriktirir ve çıkış yazdırır daha olmasıdır sadece bir satırsonu yazdırılacak veya döngü bittiğinde.

In [17]: for x in range(5): 
    print(x,end=" ") 
    if x==3: 
     print(end="\n") 
    sleep(2) 
    ....:  
0 1 2 3 #first this is printed 
4  #and then after a while this line is printed 
In [18]: for x in range(5): 
    print(x,end=" ") 
    if x==3: 
     print(end="\t") 
    sleep(2) 
    ....:  
0 1 2 3  4 #whole line is printed at once