2012-12-26 34 views
5

मै मैकॉक्स पर पायथन संस्करण 2.7.3 चला रहा हूं। संख्या 04 के माध्यम से एक \n चरित्र प्रत्येक संख्या के साथ जोड़ दिया साथ:पाइथन प्रिंट स्टेटमेंट्स जिनमें 'end =' तर्क शामिल हैं, जबकि loops में अलग-अलग व्यवहार करते हैं?

from __future__ import print_function 
import time 
x = 0 
while x < 5: 
    print(x) 
    x += 1 
    time.sleep(1) 

अगर मैं इस स्क्रिप्ट को चलाने, मैं उत्पादन मैं उम्मीद पर ध्यान दें:

कोड के इस खंड पर विचार करें। फ़्यूथरमोर, प्रत्येक नंबर एक दूसरे विराम के बाद प्रदर्शित होता है।

0 
1 
2 
3 
4 

अब इस कोड ब्लॉक पर विचार करें:

from __future__ import print_function 
import time 
x = 0 
while x < 5: 
    print(x, end='') 
    x += 1 
    time.sleep(1) 

उत्पादन मैं क्या उम्मीद है, \n के बिना , लेकिन समय अप्रत्याशित है। एक-दूसरे विराम के बाद प्रत्येक अंक को प्रदर्शित करने के बजाय, प्रक्रिया चार सेकंड प्रतीक्षा करती है, फिर सभी पांच संख्याएं प्रदर्शित करती है।

print('string', end='') से अलग-अलग व्यवहार क्यों करता है? क्या बिना किसी न्यूलाइन के पात्रों को प्रदर्शित करने का कोई तरीका है, एक बार में एक सेकंड? मैंने sys.stdout.write(str(x)) की कोशिश की, लेकिन यह print(end='') जैसा ही व्यवहार करता है।

उत्तर

16

क्योंकि आउटपुट स्ट्रीम लाइन-बफर्ड है - क्योंकि इसे प्रिंट स्टेटमेंट के बीच स्पष्ट रूप से फ़्लश नहीं किया जा रहा है, यह आउटपुट को फ्लश करने के लिए एक नई लाइन को देखता है।

आप sys.stdout.flush() के माध्यम से फ़्लशिंग को मजबूर कर सकते हैं।

वैकल्पिक रूप से यदि आप -u ध्वज के साथ पाइथन चलाते हैं, तो यह लाइन बफरिंग को अक्षम कर देगा।

+1

पायथन 3.5 'प्रिंट (एक्स, एंड =' ', फ्लश = ट्रू) पर भी काम करेगा – evan54

7

यह सिर्फ पाइथन बफरिंग स्टडआउट है। This answer में कुछ और जानकारी है।

आप इस तरह यह फ्लश कर सकते हैं:

import sys 
from __future__ import print_function 
import time 
x = 0 
while x < 5: 
    print(x, end='') 
    x += 1 
    sys.stdout.flush() 
    time.sleep(1) 

वैकल्पिक रूप से अजगर python -u शुरू करने और यह बफ़र नहीं किया जाएगा।