2013-04-25 8 views
7

में रिकर्सिव फ़ंक्शंस के अंदर प्रिंट() का उपयोग करके मैं ल्यूजोबिर पेर्कोविक द्वारा पाइथन का उपयोग करके कंप्यूटिंग का परिचय करने के लिए पुस्तक का अनुसरण कर रहा हूं, और मुझे पुस्तक के रिकर्सन अनुभाग में उदाहरणों में से एक के साथ परेशानी हो रही है। कोड इस प्रकार है:पायथन 3

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 

के लिए, कहते हैं, pattern(1), उत्पादन 0 1 0 होना चाहिए, और यह क्षैतिज रूप से प्रदर्शित किया जाना चाहिए। फ़ंक्शन pattern(1) पर कॉल करते समय, कुछ भी प्रिंट नहीं करता है। लेकिन अगर इसके बाद बिना किसी तर्क के प्रिंट स्टेटमेंट का पालन किया जाता है, तो परिणाम प्रदर्शित होते हैं।

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

अगर मैं पुनरावर्ती क्रिया के अंदर print() कार्यों का end तर्क निकालने के लिए, मैं सही आउटपुट प्राप्त (यद्यपि यह खड़ी प्रदर्शित करता है):

>>> pattern(1) 
0 
1 
0 

यह बनाता है मुझे लगता है कि पुनरावर्ती कोड में ही सही है (प्लस मैंने पुष्टि की है कि यह पुस्तक की वेबसाइट द्वारा प्रदान किए गए स्रोत के साथ था, और इरेटा शीट के साथ)। मुझे यकीन नहीं है, हालांकि, print कथन आउटपुट को प्रिंट नहीं कर रहा है क्योंकि कार्य end पैरामीटर शामिल है। किसी भी तरह की सहायता का स्वागत किया जाएगा।

+0

यह समस्या आईडीई विशिष्ट हो सकता है:

इन दो कार्यक्रमों में अंतर देखें। ऐसा लगता है कि उबंटू/gnome-terminal (या IPython + emacs में) पर पायथन 3 रन का उपयोग नहीं होता है। – unutbu

उत्तर

7

print फ़ंक्शन हमेशा आउटपुट को फ्लश नहीं करता है। आप यह स्पष्ट रूप से फ्लश चाहिए:

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() 

ध्यान दें कि python3.3 print पर एक नया कीवर्ड तर्क flush है कि आप (और sys.stdout.flush उपयोग करने से बचें इस प्रकार) जबरन उत्पादन फ्लश करने के लिए उपयोग कर सकते हैं।


एक सामान्य टिप्पणी पर मैं पैटर्न से उत्पादन दसगुणा चाहते हैं, कर रही है, उदाहरण के लिए:

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() 

इस कोड को अधिक लचीला और पुन: प्रयोज्य बनाता है, और केवल flush बुला का लाभ दिया है एक बार, या आप इसे x तत्वों में एक बार भी कॉल कर सकते हैं (वास्तव में मुझे विश्वास है कि print पहले से ही ऐसा करता है। स्क्रीन पर कई वर्ण लिखने का प्रयास करते समय यह फ़्लश करता है)।

python3.3 में कोड एक छोटे से सरल किया जा सकता है:

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

लेकिन इंटरैक्टिव खोल में फ्लशिंग _very_ अजीब लगता है। –

+0

@LevLevitsky नहीं यदि आप 'पैटर्न (1) जैसे कुछ करते हैं; time.sleep (10) ' – Bakuriu

+0

उसने ऐसा किया! धन्यवाद! – gos1

4

कारण यह है कि जब end कुछ अन्य मूल्य के साथ प्रयोग किया जाता है एक "\n" तो प्रिंट समारोह पूरे मूल्य जम जाता है और उत्पादन प्रिंट से है केवल तभी जब कोई नई लाइन मुद्रित की जाए या लूप खत्म हो जाए।

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