Печать без новой строки (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, поскольку я предполагаю, что это упрощенный пример).
Thomas K

Ответы:


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
@AA Я прочитал вопрос, когда присутствовал ответ на умножение строк, и подумал, что дам обзор нескольких вариантов. Остальные пришли, пока я составлял свой ответ. Вскоре он был принят, иначе я бы, скорее всего, удалил его.
moinudin

10
-1 Не создавайте строки конкатенацией; это O (n ^ 2) вместо O (n). "".join(...)Вместо этого используйте .
Катриэль

10
У меня нет проблем с вашим ответом, он резюмирует все, и это хорошо. Но поступая так, вы препятствуете тому, чтобы другие люди ответили. Есть много хороших ответов, и все они заслуживают +1. Вы только представьте, если бы все начали подводить итоги.
user225312

3
@katrielalex: Это имеет значение? ОП просил об оптимизации или сложности? И будет ли это иметь значение для 20 струн? Да ладно, ты, должно быть, серьезно шутишь.
user225312

1
@katrielalex Неправильно, конкатенация строк +=в Python - это операция с постоянным временем для конкатенации одного символа.
moinudin

119

Из PEP 3105: печать как функция в документе Что нового в Python 2.6 :

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

Очевидно, что это работает только с python 3.0 или выше (или 2.6+ с a from __future__ import print_functionв начале). Этот printоператор был удален и стал print()функцией по умолчанию в Python 3.0.


41

Вы можете подавить пробел, напечатав пустую строку в stdout между 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


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!")

Результатом будет: Hello, World!

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

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

На выходе будет: 2 4


Вы говорите, что я могу выводить бесконечное количество текста одновременно с выводом одного символа?
ctrl-alt-delor 01

Когда я переопределил printf на stdout.write, мой stdout.write, кажется, печатает количество диаграмм, строка: «Привет, 6» Что дает? В чем дело? И как мне это остановить?
Том

1
Кроме того, можете ли вы объяснить, что вы имеете в виду под O (1) O (n)? Я не понимаю, к чему это относится
Том

@Tom Имеется в виду сложность (нотация Big O) как отражение стоимости операции. O (1) - постоянное время - идеальное - и O (n) - линейное время - хорошо, но слишком дорого для чего-то такого простого. Хотя для мелочей время, которое вы тратите, используя свой мозг, чтобы беспокоиться об этих вещах, более затратно с точки зрения вычислений, чем просто использование конкатенации строк.
Benjamin R

6

Либо то, что говорит Ant , либо накапливается в строку, а затем выводится один раз:

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


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.