Друк без нового рядка (print 'a',) друкує пробіл, як видалити?


124

У мене є цей код:

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

Я хочу вивести 'a', не ' 'так:

aaaaaaaaaaaaaaaaaaaa

Це можливо?


4
Я здивований, що ще ніхто не згадується "".join("a" for i in xrange(20)). (Це набагато гнучкіше, ніж просто робити "a" * 20, оскільки я припускаю, що це спрощений приклад).
Томас К

Відповіді:


131

Існує ряд способів досягнення вашого результату. Якщо ви просто хочете вирішити свій випадок, використовуйте множення рядків, як згадує @Ant . Це спрацює лише в тому випадку, якщо кожен з ваших printтверджень друкує однаковий рядок. Зауважте, що він працює для множення будь-якого рядка довжини (наприклад, 'foo' * 20працює).

>>> print 'a' * 20
aaaaaaaaaaaaaaaaaaaa

Якщо ви хочете це зробити в цілому, збирайте рядок, а потім раз надрукуйте його. Це займе трохи пам'яті для рядка, але зробить лише один виклик print. Зауважте, що об'єднання рядків +=нині використовується лінійно за розміром рядка, який ви об'єднуєте, тому це буде швидко.

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

Або ви можете зробити це більше безпосередньо, використовуючи sys.stdout . write () , яка printє обгорткою навколо. Це буде писати лише необроблений рядок, який ви йому надаєте, без форматування. Зауважте, що жоден новий рядок не друкується навіть наприкінці 20- aх с.

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

Python 3 змінює printоператор у функцію print () , яка дозволяє встановити endпараметр. Ви можете використовувати його в> = 2.6, імпортуючи з __future__. Я б уникну цього в будь-якому серйозному коді 2.x, оскільки це буде трохи заплутано для тих, хто ніколи не використовував 3.x. Однак це повинно відчути частину користі, яку приносить 3.x.

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

4
@AAI прочитав питання про наявність відповіді на множення рядків і подумав, що я огляну декілька варіантів. Інші прийшли, коли я збирав свою відповідь. Це було прийнято незабаром після цього, інакше я, швидше за все, його видалив.
moinudin

10
-1 Не створюйте рядки шляхом об'єднання; це O (n ^ 2) замість O (n). Використовуйте "".join(...)замість цього.
Катріель

10
Я не маю проблем з вашою відповіддю, вона резюмує все, і це добре. Але цим ви відволікаєте інших людей, які відповідають. Є багато хороших відповідей, і всі заслуговують +1. Уявіть собі, якби всі почали робити підсумки.
user225312

3
@katrielalex: Це має значення? Чи вимагає ОП оптимізацію чи складність? І це матиме значення для 20 струн? Давай, ти серйозно повинен жартувати.
user225312

1
@katrielalex Неправильно, конкатенація рядків, що використовується +=в Python, є постійною операцією в часі конкатенації одного символу.
moinudin


41

Ви можете придушити пробіл, надрукувавши порожній рядок для перекреслення між printоператорами.

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

Однак більш чистим рішенням є спочатку скласти весь рядок, який ви хочете надрукувати, а потім вивести його за допомогою одного printоператора.


4
@Soulseekah: Так, використання лише sys.stdout.write()в цьому випадку зручніше. Однак я хотів показати, що запис порожнього рядка в stdout пригнічує простір між елементами, написаними за допомогою print, що може бути корисним у подібних ситуаціях.
Pär Wieslander

34

Ви можете надрукувати символ зворотної області ( '\b'):

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

результат:

aaaaaaaaaaaaaaaaaaaa

30

Python 3.x:

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

Python 2.6 або 2.7:

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

10

Якщо ви хочете, щоб вони відображалися по одному, ви можете зробити це:

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

sys.stdout.flush() необхідно змушувати писати символ щоразу, коли цикл запускається.


7

Як бічна примітка:

Друк - O (1), але побудова рядка, а потім друк - O (n), де n - загальна кількість символів у рядку. Так що, хоча побудова струни є "чистішою", це не найефективніший метод.

Я б це зробив так:

from sys import stdout
printf = stdout.write

Тепер у вас є "функція друку", яка друкує будь-який рядок, який ви йому надаєте, не повертаючи нового символу рядка щоразу.

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

Вихід буде: Привіт, світ!

Однак якщо ви хочете друкувати цілі числа, плавці або інші нерядкові значення, вам доведеться перетворити їх у рядок за допомогою функції str ().

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

Вихід буде: 2 4


Ви кажете, що я можу виводити нескінченну кількість тексту одночасно з виведенням одного символу?
ctrl-alt-delor

Коли я переосмислював printf до stdout.write, моє stdout.write видає кількість діаграм: рядок: "Привіт, 6" Що дає? Що відбувається? І як я це зупиняю?
Том

1
Також, чи можете ви пояснити, що ви маєте на увазі під O (1) O (n)? Я не розумію, про що йдеться
Том

@Tom Це має на увазі складність (Big O notation) як відображення вартості операції. O (1) - постійний час - ідеально - і O (n) - лінійний час - добре, але занадто дорого для чогось такого простого. Хоча для дрібних речей час, який ви витрачаєте на використання свого мозку, щоб турбуватися про ці речі, є більш обчислювально марним, ніж просто використання струнної конкатенації.
Бенджамін Р



3

це дійсно просто

для версій python 3+ потрібно лише написати наступні коди

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

просто перетворіть цикл у наступні коди, вам не доведеться турбуватися про інші речі


2

ОГО!!!

Це досить довгий час назад

Тепер, у python 3.x це буде досить просто

код:

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

вихід:

aaaaaaaaaaaaaaaaaaaa 

Детальніше про функцію print ()

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

Тут :

value1,value2,value3

ви можете надрукувати кілька значень за допомогою коми

sep = '-'

3 значення будуть розділені символом "-"

ви можете використовувати будь-який символ замість цього рівного рядка, наприклад sep = '@' або sep = 'good'

end='\n'

за замовчуванням функція друку ставить символ \ \ n 'наприкінці виводу

але ви можете використовувати будь-який символ або рядок, змінивши значення кінцевої змінної

як end = '$' або end = '.' або end = "Привіт"

file=sys.stdout

це значення за замовчуванням, стандартний вихід системи

за допомогою цього аргументу ви можете створити потік вихідного файлу типу

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

за допомогою цього коду ви створите файл з назвою output.txt, де буде зберігатися ваш вихід Я - програміст

flush = False

Це значення за замовчуванням, використовуючи flush = True, ви можете насильно очистити потік


2

так просто

def printSleeping():
     sleep = "I'm sleeping"
     v = ""
     for i in sleep:
         v += i
         system('cls')
         print v
         time.sleep(0.02)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.