Mencetak tanpa baris baru (mencetak 'a',) mencetak spasi, bagaimana cara menghapus?

124

Saya punya kode ini:

>>> for i in xrange(20):
...     print 'a',
... 
a a a a a a a a a a a a a a a a a a a a

Saya ingin menampilkan 'a', tanpa ' 'seperti ini:

aaaaaaaaaaaaaaaaaaaa

Apa itu mungkin?

pythonFoo
sumber
4
Saya terkejut bahwa belum ada yang disebutkan "".join("a" for i in xrange(20)). (Ini jauh lebih fleksibel daripada hanya melakukan "a" * 20, karena saya menganggap itu adalah contoh sederhana).
Thomas K

Jawaban:

131

Ada beberapa cara untuk mencapai hasil Anda. Jika Anda hanya menginginkan solusi untuk kasus Anda, gunakan perkalian string sebagai @Ant . Ini hanya akan berfungsi jika masing-masing printpernyataan Anda mencetak string yang sama. Perhatikan bahwa ia berfungsi untuk perkalian string panjang apa pun (mis. 'foo' * 20Berfungsi).

>>> print 'a' * 20
aaaaaaaaaaaaaaaaaaaa

Jika Anda ingin melakukan ini secara umum, buat string dan kemudian cetak sekali. Ini akan menghabiskan sedikit memori untuk string, tetapi hanya membuat satu panggilan saja print. Perhatikan bahwa penggabungan string +=sekarang linear dalam ukuran string yang Anda gabungkan sehingga ini akan cepat.

>>> for i in xrange(20):
...     s += 'a'
... 
>>> print s
aaaaaaaaaaaaaaaaaaaa

Atau Anda bisa melakukannya lebih langsung menggunakan sys.stdout . tulis () , yang printmerupakan pembungkus. Ini akan menulis hanya string mentah yang Anda berikan, tanpa format apa pun. Perhatikan bahwa tidak ada baris baru yang dicetak pada akhir 20- aan.

>>> import sys
>>> for i in xrange(20):
...     sys.stdout.write('a')
... 
aaaaaaaaaaaaaaaaaaaa>>> 

Python 3 mengubah printpernyataan menjadi fungsi print () , yang memungkinkan Anda untuk mengatur endparameter. Anda dapat menggunakannya di> = 2.6 dengan mengimpor dari __future__. Saya akan menghindari ini dalam kode 2.x serius, karena akan sedikit membingungkan bagi mereka yang belum pernah menggunakan 3.x. Namun, itu harus memberi Anda rasa dari beberapa kebaikan yang 3.x bawa.

>>> from __future__ import print_function
>>> for i in xrange(20):
...     print('a', end='')
... 
aaaaaaaaaaaaaaaaaaaa>>> 
moinudin
sumber
4
@ AAI membaca pertanyaan ketika jawaban perkalian string hadir, dan saya pikir saya akan memberikan gambaran dari beberapa opsi. Yang lain datang ketika saya sedang menyusun jawaban saya. Itu diterima segera setelah itu, kalau tidak saya kemungkinan akan menghapusnya.
moinudin
10
-1 Jangan membangun string dengan penggabungan; itu O (n ^ 2) bukan O (n). Gunakan "".join(...)sebagai gantinya.
Katriel
10
Saya tidak punya masalah dengan jawaban Anda, itu merangkum semuanya dan itu bagus. Tetapi dengan melakukan ini, Anda membuat orang lain enggan menjawab. Ada banyak jawaban bagus dan semuanya layak diberi +1. Bayangkan saja jika semua orang mulai membuat ringkasan.
user225312
3
@katrielalex: Apakah itu penting? Apakah OP meminta optimasi atau kompleksitas? Dan apakah itu penting untuk 20 string? Ayolah, kamu serius pasti bercanda.
user225312
1
@katrielalex Salah, penggabungan string menggunakan +=Python adalah operasi waktu yang konstan untuk penggabungan satu karakter.
moinudin
119

Dari PEP 3105: cetak Sebagai Fungsi dalam dokumen What's New in Python 2.6 :

>>> from __future__ import print_function
>>> print('a', end='')

Jelas itu hanya berfungsi dengan python 3.0 atau lebih tinggi (atau 2.6+ dengan a from __future__ import print_functiondi awal). The printpernyataan telah dihapus dan menjadi print()fungsi secara default di Python 3.0.

Antoine Pelisse
sumber
41

Anda dapat menekan spasi dengan mencetak string kosong ke stdout di antara printpernyataan.

>>> import sys
>>> for i in range(20):
...   print 'a',
...   sys.stdout.write('')
... 
aaaaaaaaaaaaaaaaaaaa

Namun, solusi yang lebih bersih adalah dengan terlebih dahulu membangun seluruh string yang ingin Anda cetak dan kemudian mengeluarkannya dengan satu printpernyataan.

Pär Wieslander
sumber
4
@ Soulseekah: Ya, hanya menggunakan sys.stdout.write()lebih nyaman dalam hal ini. Namun, saya ingin menunjukkan bahwa menulis string kosong ke stdout menekan ruang di antara elemen yang ditulis menggunakan print, yang dapat berguna dalam situasi serupa.
Pär Wieslander
34

Anda dapat mencetak karakter backspace ( '\b'):

for i in xrange(20):
    print '\ba',

hasil:

aaaaaaaaaaaaaaaaaaaa
Lucas Moeskops
sumber
30

Python 3.x:

for i in range(20):
    print('a', end='')

Python 2.6 atau 2.7:

from __future__ import print_function
for i in xrange(20):
    print('a', end='')
kode kode
sumber
10

Jika Anda ingin mereka muncul satu per satu, Anda dapat melakukan ini:

import time
import sys
for i in range(20):
    sys.stdout.write('a')
    sys.stdout.flush()
    time.sleep(0.5)

sys.stdout.flush() diperlukan untuk memaksa karakter yang akan ditulis setiap kali loop dijalankan.

daviewales
sumber
7

Sama seperti catatan tambahan:

Pencetakan adalah O (1) tetapi membangun string dan kemudian mencetak adalah O (n), di mana n adalah jumlah total karakter dalam string. Jadi ya, sementara membangun string adalah "bersih", itu bukan metode yang paling efisien untuk melakukannya.

Cara saya akan melakukannya adalah sebagai berikut:

from sys import stdout
printf = stdout.write

Sekarang Anda memiliki "fungsi cetak" yang mencetak string apa pun yang Anda berikan tanpa mengembalikan karakter baris baru setiap kali.

printf("Hello,")
printf("World!")

Outputnya adalah: Halo, Dunia!

Namun, jika Anda ingin mencetak bilangan bulat, float, atau nilai non-string lainnya, Anda harus mengonversinya menjadi string dengan fungsi str ().

printf(str(2) + " " + str(4))

Outputnya adalah: 2 4

Kyle Siopiolosz
sumber
Apakah Anda mengatakan bahwa saya dapat menampilkan jumlah teks yang tidak terbatas dalam waktu yang sama dengan menghasilkan satu karakter?
ctrl-alt-delor
Ketika saya mendefinisikan ulang printf ke stdout.write, stdout.write saya tampaknya mencetak jumlah karakter grafik stringnya adalah: "Halo, 6" Apa artinya? Apa yang sedang terjadi? Dan bagaimana saya menghentikannya?
Tom
1
Juga, dapatkah Anda menjelaskan apa yang Anda maksud dengan O (1) O (n)? Saya tidak mengerti apa yang dimaksud dengan
Tom
@ Tom Ini mengacu pada kompleksitas (notasi O Besar) sebagai refleksi dari biaya operasi. O (1) adalah waktu konstan - ideal - dan O (n) adalah waktu linier - oke tapi terlalu mahal untuk sesuatu yang sangat sederhana. Meskipun, untuk hal-hal kecil, waktu yang Anda habiskan menggunakan otak Anda untuk mengkhawatirkan hal-hal ini lebih sia-sia secara komputasi daripada hanya menggunakan penggabungan string.
Benjamin R
6

Entah apa yang dikatakan Ant , atau terakumulasi menjadi string, lalu cetak sekali:

s = '';
for i in xrange(20):
    s += 'a'
print s
jensgram
sumber
6

tanpa apa? maksudmu

>>> print 'a' * 20
aaaaaaaaaaaaaaaaaaaa

?

Semut
sumber
3

ini sangat sederhana

untuk versi python 3+ Anda hanya perlu menulis kode berikut

for i in range(20):
      print('a',end='')

cukup konversi loop ke kode berikut, Anda tidak perlu khawatir tentang hal-hal lain

Shad Munir
sumber
2

WOW!!!

Ini cukup lama lalu

Sekarang, Dalam python 3.x itu akan sangat mudah

kode:

for i in range(20):
      print('a',end='') # here end variable will clarify what you want in 
                        # end of the code

keluaran:

aaaaaaaaaaaaaaaaaaaa 

Lebih lanjut tentang fungsi print ()

print(value1,value2,value3,sep='-',end='\n',file=sys.stdout,flush=False)

Di sini :

value1,value2,value3

Anda dapat mencetak beberapa nilai menggunakan koma

sep = '-'

3 nilai akan dipisahkan oleh karakter '-'

Anda dapat menggunakan karakter apa pun alih-alih string genap seperti sep = '@' atau sep = 'baik'

end='\n'

secara fungsi cetak default menempatkan '\ n' karakter di akhir output

tetapi Anda dapat menggunakan karakter atau string apa pun dengan mengubah nilai nilai akhir

seperti end = '$' atau end = '.' atau end = 'Hello'

file=sys.stdout

ini adalah nilai default, output standar sistem

menggunakan argumen ini Anda dapat membuat aliran file output seperti

print("I am a Programmer", file=open("output.txt", "w"))

dengan kode ini Anda akan membuat file bernama output.txt di mana output Anda saya seorang Programmer akan disimpan

flush = False

Ini adalah nilai default menggunakan flush = True Anda dapat secara paksa menyiram aliran

SHAH MD IMRAN HOSSAIN
sumber
2

sesimpel itu

def printSleeping():
     sleep = "I'm sleeping"
     v = ""
     for i in sleep:
         v += i
         system('cls')
         print v
         time.sleep(0.02)
tlejmi
sumber