Satırsonu olmadan yazdırmak ('a' yazdır) boşluk yazdırır, nasıl kaldırılır?


124

Bu koda sahibim:

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

Ben çıkış istiyorum 'a'olmadan, ' 'böyle:

aaaaaaaaaaaaaaaaaaaa

Mümkün mü?


4
Henüz kimseden bahsedilmemesine şaşırdım "".join("a" for i in xrange(20)). (Bunun "a" * 20basitleştirilmiş bir örnek olduğunu varsaydığım için yapmaktan çok daha esnektir ).
Thomas K

Yanıtlar:


131

Sonuca ulaşmanın birkaç yolu vardır. Sadece sizin durumunuz için bir çözüm istiyorsanız, @Ant'ın bahsettiği gibi dize çarpmayı kullanın . Bu, yalnızca ifadelerinizin her biri aynı dizeyi yazdırırsa işe yarar . Herhangi bir uzunluktaki dizginin çarpımı için çalıştığını unutmayın (örneğin çalışır).print'foo' * 20

>>> print 'a' * 20
aaaaaaaaaaaaaaaaaaaa

Bunu genel olarak yapmak istiyorsanız, bir dizi oluşturun ve ardından bir kez yazdırın. Bu, dizi için biraz bellek tüketir, ancak yalnızca tek bir çağrı yapar print. Kullanarak dize birleştirme +=işleminin artık birleştirdiğiniz dizenin boyutunda doğrusal olduğunu ve bu nedenle hızlı olacağını unutmayın.

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

Veya sys.stdout kullanarak daha doğrudan yapabilirsiniz . write () , printetrafındaki bir sarmalayıcıdır. Bu, herhangi bir biçimlendirme olmadan yalnızca verdiğiniz ham dizeyi yazacaktır. 20 as'nin sonunda bile satırsonu basılmadığına dikkat edin .

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

Python 3, printifadeyi bir parametre ayarlamanıza izin veren bir print () işlevine dönüştürür end. 'Den içe aktararak> = 2.6'da kullanabilirsiniz __future__. 3.x'i hiç kullanmayanlar için biraz kafa karıştırıcı olacağından, herhangi bir ciddi 2.x kodunda bundan kaçınırdım. Bununla birlikte, size 3.x'in getirdiği bazı iyiliklerin tadına bakmalıdır.

>>> from __future__ import print_function
>>> for i in xrange(20):
...     print('a', end='')
... 
aaaaaaaaaaaaaaaaaaaa>>> 

4
@AAI, dize çarpımı yanıtı varken soruyu okudu ve birkaç seçeneğe genel bir bakış vereceğimi düşündüm. Diğerleri ben cevabımı bir araya getirirken geldi. Kısa süre sonra kabul edildi, aksi takdirde büyük olasılıkla silerdim.
moinudin

10
-1 Dizeleri bitiştirerek oluşturmayın; O (n) yerine O (n ^ 2). "".join(...)Bunun yerine kullanın .
Katriel

10
Cevabınla bir problemim yok, her şeyi özetliyor ve bu iyi. Ancak bunu yaparak, cevap veren diğer insanları caydırırsınız. Pek çok iyi cevap var ve hepsi + 1'i hak ediyor. Herkesin özetlemeye başladığını hayal edin.
user225312

3
@katrielalex: Fark eder mi? OP optimizasyon veya karmaşıklık istedi mi? Ve 20 tel için önemli mi? Hadi, cidden şaka yapıyor olmalısın.
user225312

1
@katrielalex Yanlış, +=Python'da kullanılan dizge birleştirme , tek bir karakterin birleştirilmesi için sabit zamanlı bir işlemdir.
moinudin


41

printİfadeler arasındaki stdout'a boş bir dize yazdırarak boşluğu bastırabilirsiniz .

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

Ancak, daha temiz bir çözüm, önce yazdırmak istediğiniz dizenin tamamını oluşturmak ve ardından tek bir printifadeyle çıktı almaktır.


4
@Soulseekah: Evet, sys.stdout.write()bu durumda sadece kullanmak daha uygun. Bununla birlikte, stdout'a boş bir dizge yazmanın print, benzer durumlarda yararlı olabilecek şekilde kullanılarak yazılan öğeler arasındaki boşluğu bastırdığını göstermek istedim .
Pär Wieslander

34

Bir geri alma karakteri ( '\b') yazdırabilirsiniz :

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

sonuç:

aaaaaaaaaaaaaaaaaaaa

30

Python 3.x:

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

Python 2.6 veya 2.7:

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

10

Her seferinde bir tane görünmelerini istiyorsanız, bunu yapabilirsiniz:

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

sys.stdout.flush() döngü her çalıştırıldığında karakteri yazmaya zorlamak için gereklidir.


7

Bir yan not olarak:

Baskı O (1), ancak bir dizi oluşturma ve ardından yazdırma O (n) 'dir, burada n, dizedeki toplam karakter sayısıdır. Yani evet, dizge oluşturmak "daha temiz" olsa da, bunu yapmanın en verimli yöntemi değil.

Bunu yapmamın yolu şu:

from sys import stdout
printf = stdout.write

Artık, verdiğiniz dizeleri, her seferinde yeni satır karakterini döndürmeden yazdıran bir "yazdırma işlevine" sahipsiniz.

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

Çıktı şöyle olacaktır: Merhaba, Dünya!

Bununla birlikte, tamsayıları, kayan sayıları veya diğer dize olmayan değerleri yazdırmak istiyorsanız, bunları str () işleviyle bir dizeye dönüştürmeniz gerekir.

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

Çıktı: 2 4


Bir karakter çıkarırken aynı anda sonsuz miktarda metin çıkarabileceğimi mi söylüyorsunuz?
ctrl-alt-delor

Printf'i stdout.write olarak yeniden tanımladığımda, stdout.write'ım dizenin olduğu karakter sayısını yazdırıyor gibi görünüyor: "Merhaba, 6" Ne verir? Neler oluyor? Ve bunu nasıl durdururum?
Tom

1
Ayrıca, O (1) O (n) ile ne demek istediğinizi açıklayabilir misiniz? Bunun ne anlama geldiğini anlamıyorum
Tom

@Tom Operasyonun maliyetinin bir yansıması olarak karmaşıklığa (Büyük O notasyonu) atıfta bulunuyor . O (1) sabit zamandır - ideal - ve O (n) doğrusal zamandır - tamam ama bu kadar basit bir şey için çok pahalı. Bununla birlikte, küçük şeyler için, bu şeyler hakkında endişelenmek için beyninizi kullanarak harcadığınız zaman, yalnızca dizi birleştirme kullanmaktan daha hesaplama açısından israftır.
Benjamin R

6

Ya neyi Ant diyor ya bir dizeye birikir, sonra da bir kez basmak:

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

6

Ne olmadan? demek istiyorsun

>>> print 'a' * 20
aaaaaaaaaaaaaaaaaaaa

?


3

bu gerçekten basit

python 3+ sürümleri için yalnızca aşağıdaki kodları yazmanız gerekir

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

sadece döngüyü aşağıdaki kodlara çevirin, başka şeyler için endişelenmenize gerek yok


2

VAY!!!

Oldukça uzun zaman önce

Şimdi, python 3.x'te oldukça kolay olacak

kod:

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

çıktı:

aaaaaaaaaaaaaaaaaaaa 

Print () işlevi hakkında daha fazla bilgi

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

Burada :

value1,value2,value3

virgül kullanarak birden çok değer yazdırabilirsiniz

sep = '-'

3 değer '-' karakteriyle ayrılacaktır

sep = '@' veya sep = 'good' gibi dizge yerine herhangi bir karakter kullanabilirsiniz

end='\n'

varsayılan olarak yazdırma işlevi çıktının sonuna '\ n' karakterini koy

ancak son değişken değerini değiştirerek herhangi bir karakter veya dizeyi kullanabilirsiniz

end = '$' veya end = 'gibi.' veya end = 'Merhaba'

file=sys.stdout

bu varsayılan bir değerdir, sistem standart çıktısı

bu argümanı kullanarak aşağıdaki gibi bir çıktı dosyası akışı oluşturabilirsiniz:

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

Bu kodla adlı bir dosya oluşturur çýktý.txt çıktı nerede ben Programcı değilim saklanacaktır

flush = False

Bu, flush = True kullanan varsayılan bir değerdir , akışı zorla temizleyebilirsiniz


2

kadar basit

def printSleeping():
     sleep = "I'm sleeping"
     v = ""
     for i in sleep:
         v += i
         system('cls')
         print v
         time.sleep(0.02)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.