Câu hỏi Làm thế nào để in mà không có dòng mới hoặc không gian?


Câu hỏi nằm trong tiêu đề.

Tôi muốn làm điều đó trong . Những gì tôi muốn làm trong ví dụ này trong :

#include <stdio.h>

int main() {
    int i;
    for (i=0; i<10; i++) printf(".");
    return 0;
}

Đầu ra:

..........

Trong Python:

>>> for i in xrange(0,10): print '.'
.
.
.
.
.
.
.
.
.
.
>>> for i in xrange(0,10): print '.',
. . . . . . . . . .

Trong Python print sẽ thêm một \n hoặc một không gian, làm thế nào tôi có thể tránh điều đó? Bây giờ, nó chỉ là một ví dụ. Đừng nói với tôi trước tiên tôi có thể xây dựng một chuỗi rồi in nó. Tôi muốn biết cách "nối thêm" chuỗi stdout.


1375
2018-01-29 20:58


gốc


Đối với những người tìm kiếm chuỗi định dạng tài liệu của python: docs.python.org/library/stdtypes.html#string-formatting - guettli


Các câu trả lời:


Cách chung

import sys
sys.stdout.write('.')

Bạn cũng có thể cần phải gọi

sys.stdout.flush()

đảm bảo stdout được xả ngay lập tức.

Python 2.6+

Từ Python 2.6, bạn có thể nhập print chức năng từ Python 3:

from __future__ import print_function

Điều này cho phép bạn sử dụng giải pháp Python 3 bên dưới.

Python 3

Trong Python 3, print tuyên bố đã được thay đổi thành một hàm. Trong Python 3, bạn có thể thay thế:

print('.', end='')

Điều này cũng hoạt động trong Python 2, miễn là bạn đã sử dụng from __future__ import print_function.

Nếu bạn gặp sự cố khi lưu vào bộ đệm, bạn có thể xóa đầu ra bằng cách thêm flush=True đối số từ khóa:

print('.', end='', flush=True)

Tuy nhiên, lưu ý rằng flush từ khóa không có sẵn trong phiên bản của print chức năng được nhập từ __future__ trong Python 2; nó chỉ hoạt động trong Python 3, cụ thể hơn là 3.3 và sau đó. Trong các phiên bản cũ hơn, bạn vẫn cần phải thực hiện thủ công bằng một cuộc gọi đến sys.stdout.flush().


1896
2018-01-29 21:01



Chẳng phải ví dụ thứ hai cũng sẽ in mười không gian sao? - Triptych
Nó cũng có thể đáng chú ý rằng, trong một số trường hợp, bạn có thể cần phải gọi sys.stdout.flush() theo cách thủ công, nếu đầu ra không hiển thị ngay lập tức. - CmdrMoozy
Để sử dụng ví dụ thứ ba trong Python 2.6+, hãy sử dụng from __future__ import print_function, được đề xuất cho khả năng tương thích về phía trước. - Amir Ali Akbari
sys.stdout.write('.') sẽ hoạt động với cả hai phiên bản 2.x và 3.x mà không có bất kỳ thay đổi bổ sung nào. - Levon
chú thích rằng flush đối số [chỉ hoạt động trên python 3.3] là "Chúng không trả về đối số flush cho Python 2.7" [1]: stackoverflow.com/questions/230751/… - Kuzeko


Nó phải đơn giản như được mô tả trong liên kết này bởi Guido Van Rossum:

Làm thế nào để in mà không có một c / r?

http://legacy.python.org/search/hypermail/python-1992/0115.html

Có thể in một cái gì đó nhưng không tự động có   vận chuyển trở lại nối thêm vào nó?

Có, thêm dấu phẩy sau đối số cuối cùng để in. Ví dụ, vòng lặp này in các số 0..9 trên một dòng được phân tách bằng dấu cách. chú thích "print" không có tham số thêm dòng mới cuối cùng:

>>> for i in range(10):
...     print i,
... else:
...     print
...
0 1 2 3 4 5 6 7 8 9
>>> 

270
2017-07-27 10:09



Đây là câu trả lời pythonic tốt nhất. - gaborous
Điều này được liệt kê cụ thể trong câu hỏi là hành vi không mong muốn vì không gian - Zags
Ngược lại, câu trả lời sẽ bị xóa vì hai lý do: nó có tác dụng phụ không mong muốn mà bạn không thể vô hiệu hóa (bao gồm khoảng trống thừa) và nó không tương thích với python 3 (dấu ngoặc đơn chuyển đổi thành bộ tuple) . Tôi mong đợi những loại cấu trúc kém chất lượng này từ PHP, chứ không phải Python. Vì vậy, tốt nhất là không bao giờ sử dụng điều này. - Eric Leschinski
//, Đây là cách đơn giản nhất để làm cho nó được thực hiện trong Python 2, mặc dù, và có rất nhiều mã một lần ra khỏi đó cho hệ điều hành thực sự cũ. Có lẽ không phải là giải pháp tốt nhất, hoặc thậm chí được đề nghị. Tuy nhiên, một trong những ưu điểm tuyệt vời của StackOverflow là nó cho phép chúng ta biết những thủ thuật lạ lùng nào ở ngoài đó. KDP, bạn sẽ bao gồm một cảnh báo nhanh ở đầu về những gì @Eric Leschinski nói? Nó có ý nghĩa, sau khi tất cả. - Nathan Basanese
@nathanbasanese Đơn giản hay không, nó có tác dụng phụ người hỏi một cách rõ ràng không muốn. Đã bỏ phiếu. - Shadur


Lưu ý: Tiêu đề của câu hỏi này được sử dụng để được một cái gì đó như "Làm thế nào để printf trong python?"

Vì mọi người có thể đến đây tìm kiếm nó dựa trên tiêu đề, Python cũng hỗ trợ thay thế kiểu printf:

>>> strings = [ "one", "two", "three" ]
>>>
>>> for i in xrange(3):
...     print "Item %d: %s" % (i, strings[i])
...
Item 0: one
Item 1: two
Item 2: three

Và, bạn có thể dễ dàng nhân các giá trị chuỗi:

>>> print "." * 10
..........

158
2018-01-29 21:24



Điều này là thiếu điểm. - Andrea Ambu
Thật vậy, nó thiếu điểm. :) Vì đã có một câu trả lời tuyệt vời cho câu hỏi, tôi chỉ đang xây dựng trên một số kỹ thuật liên quan có thể hữu ích. - Beau
Dựa trên tiêu đề của câu hỏi, tôi tin rằng câu trả lời này là tương tự thích hợp hơn với cách người ta thường sử dụng printf trong C / C ++ - Dan
Điều này trả lời tiêu đề của câu hỏi, nhưng không phải là phần thân. Điều đó nói rằng, nó cung cấp cho tôi những gì tôi đang tìm kiếm. :) - ayman
@Vanuan, tôi giải thích ở dưới cùng của câu trả lời của tôi rằng tiêu đề của câu hỏi thay đổi tại một số điểm. :) - Beau


Sử dụng chức năng in kiểu python3 cho python2.6 + (cũng sẽ phá vỡ bất kỳ câu lệnh in đã có từ khóa nào trong cùng một tệp.)

# for python2 to use the print() function, removing the print keyword
from __future__ import print_function
for x in xrange(10):
    print('.', end='')

Để không làm hỏng tất cả các từ khóa in python2 của bạn, hãy tạo một printf.py tập tin

# printf.py

from __future__ import print_function

def printf(str, *args):
    print(str % args, end='')

Sau đó, sử dụng nó trong tập tin của bạn

from printf import printf
for x in xrange(10):
    printf('.')
print 'done'
#..........done

Các ví dụ khác cho thấy kiểu printf

printf('hello %s', 'world')
printf('%i %f', 10, 3.14)
#hello world10 3.140000

85
2018-02-21 20:50





Đây không phải là câu trả lời cho câu hỏi trong tiêu đề, nhưng đó là câu trả lời về cách in trên cùng một dòng:

import sys
for i in xrange(0,10):
   sys.stdout.write(".")
   sys.stdout.flush()

37
2017-12-03 17:16



flush () ing stdout trên mỗi ghi có thể tác động đến hiệu suất - sfk


Mới (như Python 3.0) print chức năng có một tùy chọn end tham số cho phép bạn sửa đổi ký tự kết thúc. Cũng có sep cho dấu phân cách.


21
2018-01-29 21:07





Bạn chỉ có thể thêm , vào cuối print để nó không in trên dòng mới.


16
2017-07-10 19:45



//, Điều này thực sự làm cho nó in ra không có gì. Chúng ta không cần phải thêm một tuyên bố in khác mà không có một đối số ở cuối, như được hiển thị trong stackoverflow.com/a/493500/2146138? Bạn có sẵn lòng chỉnh sửa câu trả lời này bằng một ví dụ ngắn hoặc hai dòng ngắn gọn không? - Nathan Basanese
Điều này làm việc tuyệt vời cho python2.7 trên win7 - tqjustc
OP không muốn một không gian nối thêm - ppperry


Sử dụng functools.partial để tạo một hàm mới gọi là printf

>>> import functools

>>> printf = functools.partial(print, end="")

>>> printf("Hello world\n")
Hello world

Cách dễ dàng để bọc một hàm với các tham số mặc định.


14
2018-06-17 01:55