2012-12-26 8 views
5

Tôi đang chạy phiên bản python 2.7.3 trên MacOSX.Tại sao các lệnh in python chứa các đối số 'end =' hoạt động khác nhau trong các vòng lặp while?

Xem xét khối mã này:

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

Nếu tôi chạy kịch bản này, tôi quan sát đầu ra tôi mong đợi: Những con số 0 qua 4 với một nhân vật \n nối vào mỗi số. Hơn nữa, mỗi số hiển thị sau một giây tạm dừng.

0 
1 
2 
3 
4 

Bây giờ xem xét khối mã này:

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

Kết quả là những gì tôi mong đợi, mà không \n 's, nhưng thời gian là bất ngờ. Thay vì hiển thị từng chữ số sau một giây tạm dừng, quá trình chờ bốn giây, sau đó hiển thị tất cả năm số.

Tại sao print('string') hoạt động khác với print('string', end='') trong các vòng lặp while? Có cách nào để hiển thị các ký tự không có dòng mới, một giây tại một thời điểm không? Tôi đã thử sys.stdout.write(str(x)), nhưng nó hoạt động theo cùng một cách như print(end='').

Trả lời

16

Bởi vì luồng đầu ra được đệm theo đường - vì nó không được xóa một cách rõ ràng giữa các lệnh in, nó chờ cho đến khi nó nhìn thấy một dòng mới để xóa đầu ra.

Bạn có thể buộc xả nước qua sys.stdout.flush().

Hoặc nếu bạn chạy Python với cờ -u, nó sẽ tắt tính năng lưu vào bộ đệm dòng.

+1

Trên python 3.5 'print (x, end = '', flush = True)' sẽ aso hoạt động – evan54

7

Đây chỉ là bộ đệm đệm chuẩn python. This answer có một số thông tin khác.

Bạn có thể tuôn ra nó như thế này:

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) 

Ngoài ra bắt đầu trăn python -u và nó sẽ không được đệm.