Drukowanie bez znaku nowej linii (print 'a',) wypisuje spację, jak usunąć?

124

Mam ten kod:

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

Chcę wydrukować 'a', bez ' 'tego:

aaaaaaaaaaaaaaaaaaaa

Czy to możliwe?

pythonFoo
źródło
4
Dziwię się, że nikt jeszcze o tym nie wspomniał "".join("a" for i in xrange(20)). (Jest to znacznie bardziej elastyczne niż zwykłe robienie tego "a" * 20, ponieważ zakładam, że jest to uproszczony przykład).
Thomas K

Odpowiedzi:

131

Istnieje wiele sposobów osiągnięcia wyniku. Jeśli szukasz tylko rozwiązania dla swojego przypadku, użyj mnożenia ciągów, jak wspomina @Ant . To zadziała tylko wtedy, gdy każda z twoich printinstrukcji wypisze ten sam ciąg. Zauważ, że działa on dla mnożenia dowolnego łańcucha długości (np. 'foo' * 20Działa).

>>> print 'a' * 20
aaaaaaaaaaaaaaaaaaaa

Jeśli chcesz to zrobić ogólnie, utwórz ciąg, a następnie wydrukuj go raz. Zuży to trochę pamięci dla ciągu, ale wykona tylko jedno wywołanie print. Zauważ, że użycie konkatenacji ciągów +=jest teraz liniowe względem rozmiaru łańcucha, który łączysz, więc będzie to szybkie.

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

Lub możesz to zrobić bardziej bezpośrednio, używając sys.stdout . write () , który printjest opakowaniem wokół. Spowoduje to zapisanie tylko nieprzetworzonego ciągu, który mu podasz, bez żadnego formatowania. Zauważ, że żadna nowa linia nie jest drukowana nawet pod koniec 20 asekund.

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

Python 3 zmienia printinstrukcję w funkcję print () , która umożliwia ustawienie endparametru. Możesz go użyć w> = 2.6, importując z __future__. Unikałbym tego jednak w każdym poważnym kodzie 2.x, ponieważ będzie to trochę mylące dla tych, którzy nigdy nie używali 3.x. Powinien jednak dać ci przedsmak dobrodziejstw, jakie niesie ze sobą 3.x.

>>> from __future__ import print_function
>>> for i in xrange(20):
...     print('a', end='')
... 
aaaaaaaaaaaaaaaaaaaa>>> 
moinudin
źródło
4
@AA Przeczytałem pytanie, gdy była obecna odpowiedź mnożenia ciągu i pomyślałem, że podam przegląd kilku opcji. Inni przyszli, gdy zbierałem odpowiedź. Został zaakceptowany wkrótce potem, w przeciwnym razie prawdopodobnie bym go usunął.
moinudin
10
-1 Nie buduj łańcuchów przez konkatenację; to jest O (n ^ 2) zamiast O (n). Użyj "".join(...)zamiast tego.
Katriel
10
Nie mam problemu z twoją odpowiedzią, podsumowuje wszystko i to dobrze. Ale robiąc to, zniechęcasz inne osoby, które odpowiadają. Jest wiele dobrych odpowiedzi i wszystkie zasługują na +1. Wyobraź sobie, że wszyscy zaczęliby podsumowywać.
user225312
3
@katrielalex: Czy to ma znaczenie? Czy OP poprosił o optymalizację lub złożoność? I czy będzie to miało znaczenie dla 20 strun? No dalej, poważnie chyba żartujesz.
user225312
1
@katrielalex Źle, konkatenacja ciągów znaków używana +=w Pythonie jest operacją trwającą w czasie dla konkatenacji pojedynczego znaku.
moinudin
119

Z PEP 3105: drukuj jako funkcję w dokumencie What's New in Python 2.6 :

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

Oczywiście działa to tylko z Pythonem 3.0 lub nowszym (lub 2.6+ z literą from __future__ import print_functionna początku). printOświadczenie zostało usunięte i stał się print()funkcja domyślnie w Pythonie 3.0.

Antoine Pelisse
źródło
41

Można pominąć spację, wypisując pusty ciąg na standardowe wyjście między printinstrukcjami.

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

Jednak czystszym rozwiązaniem jest najpierw zbudowanie całego ciągu, który chcesz wydrukować, a następnie wyprowadzenie go za pomocą pojedynczej printinstrukcji.

Pär Wieslander
źródło
4
@Soulseekah: Tak, sys.stdout.write()w tym przypadku używanie samego tylko jest wygodniejsze. Chciałem jednak pokazać, że zapisanie pustego ciągu na standardowe wyjście pomija odstępy między elementami napisanymi przy użyciu print, co może być przydatne w podobnych sytuacjach.
Pär Wieslander
34

Możesz wydrukować znak backspace ( '\b'):

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

wynik:

aaaaaaaaaaaaaaaaaaaa
Lucas Moeskops
źródło
30

Python 3.x:

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

Python 2.6 lub 2.7:

from __future__ import print_function
for i in xrange(20):
    print('a', end='')
codeape
źródło
10

Jeśli chcesz, aby pojawiały się pojedynczo, możesz to zrobić:

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

sys.stdout.flush() jest konieczne, aby wymusić zapis znaku przy każdym uruchomieniu pętli.

daviewales
źródło
7

Na marginesie:

Drukowanie to O (1), ale budowanie ciągu, a następnie drukowanie to O (n), gdzie n to całkowita liczba znaków w ciągu. Więc tak, chociaż budowanie łańcucha jest „czystsze”, nie jest to najbardziej wydajna metoda zrobienia tego.

Sposób, w jaki bym to zrobił, jest następujący:

from sys import stdout
printf = stdout.write

Teraz masz „funkcję drukowania”, która wypisuje dowolny podany przez Ciebie ciąg bez zwracania za każdym razem znaku nowego wiersza.

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

Wynik będzie wyglądał następująco: Hello, World!

Jeśli jednak chcesz wydrukować liczby całkowite, zmiennoprzecinkowe lub inne wartości niebędące ciągami, musisz przekonwertować je na ciąg za pomocą funkcji str ().

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

Wynik będzie następujący: 2 4

Kyle Siopiolosz
źródło
Czy mówisz, że mogę wydrukować nieskończoną ilość tekstu w tym samym czasie, co wydrukowanie jednego znaku?
ctrl-alt-delor
Kiedy przedefiniowałem printf na stdout.write, mój stdout.write wydaje się wypisywać liczbę znaków wykresu, których ciąg to: „Cześć, 6” Co daje? Co się dzieje? Jak mam to zatrzymać?
Tom
1
Czy możesz również wyjaśnić, co masz na myśli, mówiąc O (1) O (n)? Nie rozumiem, do czego to się odnosi
Tom,
@Tom Odnosi się do złożoności (notacja Big O) jako odzwierciedlenia kosztu operacji. O (1) to stały czas - idealny - a O (n) to czas liniowy - w porządku, ale o wiele za drogi na coś tak prostego. Chociaż w przypadku drobiazgów czas poświęcany na martwienie się o te rzeczy przy użyciu mózgu jest bardziej marnotrawny obliczeniowo niż zwykłe łączenie ciągów.
Benjamin R
6

Albo to, co mówi Ant , albo zbierzesz w ciąg, a następnie wydrukuj raz:

s = '';
for i in xrange(20):
    s += 'a'
print s
jensgram
źródło
6

bez czego? czy masz na myśli

>>> print 'a' * 20
aaaaaaaaaaaaaaaaaaaa

?

Mrówka
źródło
3

to jest naprawdę proste

dla wersji Pythona 3+ wystarczy napisać następujące kody

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

po prostu przekonwertuj pętlę na następujące kody, nie musisz się martwić o inne rzeczy

Shad Munir
źródło
2

ŁAŁ!!!

To było całkiem dawno temu

Teraz w Pythonie 3.x będzie to całkiem proste

kod:

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

wynik:

aaaaaaaaaaaaaaaaaaaa 

Więcej o funkcji print ()

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

Tutaj :

value1,value2,value3

można drukować wiele wartości za pomocą przecinków

sep = '-'

Trzy wartości zostaną oddzielone znakiem „-”

możesz użyć dowolnego znaku zamiast tego nawet łańcucha, takiego jak sep = '@' lub sep = 'good'

end='\n'

domyślnie funkcja drukowania umieszcza znak '\ n' na końcu wyjścia

ale możesz użyć dowolnego znaku lub ciągu, zmieniając wartość end variale

jak end = '$' lub end = '.' or end = 'Hello'

file=sys.stdout

jest to wartość domyślna, standardowe wyjście systemu

używając tego argumentu możesz utworzyć strumień pliku wyjściowego, taki jak

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

za pomocą tego kodu utworzysz plik o nazwie output.txt, w którym będą przechowywane dane wyjściowe Jestem programistą

flush = False

Jest to wartość domyślna przy użyciu flush = True , możesz wymusić opróżnienie strumienia

SHAH MD IMRAN HOSSAIN
źródło
2

tak proste jak to

def printSleeping():
     sleep = "I'm sleeping"
     v = ""
     for i in sleep:
         v += i
         system('cls')
         print v
         time.sleep(0.02)
tlejmi
źródło