Imprimir sem nova linha (imprimir 'a') imprime um espaço, como remover?


124

Eu tenho este código:

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

Eu quero saída 'a', sem ' 'assim:

aaaaaaaaaaaaaaaaaaaa

É possível?


4
Estou surpreso que ninguém ainda tenha sido mencionado "".join("a" for i in xrange(20)). (É muito mais flexível do que apenas fazer "a" * 20, pois presumo que seja um exemplo simplificado).
Thomas K

Respostas:


131

Existem várias maneiras de alcançar seu resultado. Se você está apenas querendo uma solução para o seu caso, use a multiplicação de strings como o @Ant menciona. Isso só funcionará se cada uma de suas printinstruções imprimir a mesma string. Observe que ele funciona para multiplicação de qualquer cadeia de comprimento (por exemplo, 'foo' * 20funciona).

>>> print 'a' * 20
aaaaaaaaaaaaaaaaaaaa

Se você quiser fazer isso em geral, crie uma sequência e imprima-a uma vez. Isso consumirá um pouco de memória para a string, mas faça apenas uma chamada print. Observe que a concatenação de strings usando +=agora é linear no tamanho da string que você está concatenando, portanto isso será rápido.

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

Ou você pode fazer isso mais diretamente usando o sys.stdout . write () , que printé um invólucro. Isso gravará apenas a sequência bruta que você fornecer, sem nenhuma formatação. Observe que nenhuma nova linha é impressa mesmo no final dos 20 as.

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

O Python 3 altera a printinstrução para uma função print () , que permite definir um endparâmetro. Você pode usá-lo em> = 2.6 importando de __future__. No entanto, eu evitaria isso em qualquer código 2.x sério, pois será um pouco confuso para quem nunca usou o 3.x. No entanto, você deve provar algumas das vantagens que 3.x traz.

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

4
O @AAI leu a pergunta quando a resposta de multiplicação de strings estava presente e pensou em fornecer uma visão geral de várias opções. Os outros vieram enquanto eu estava reunindo minha resposta. Foi aceito logo depois, caso contrário, eu provavelmente o excluiria.
precisa saber é o seguinte

10
-1 Não construa strings por concatenação; é O (n ^ 2) em vez de O (n). Use em "".join(...)vez disso.
Katriel

10
Não tenho problema com sua resposta, ela resume tudo e isso é bom. Mas, ao fazer isso, você desencoraja outras pessoas que respondem. Existem muitas boas respostas e todas merecem +1. Imagine se todos começassem a fazer resumos.
precisa saber é o seguinte

3
@katrielalex: Isso importa? O OP pediu otimização ou complexidade? E isso importa para 20 cordas? Vamos lá, você realmente deve estar brincando.
user225312

1
@katrielalex A concatenação incorreta de strings usando +=no Python é uma operação de tempo constante para concatenação de um único caractere.
moinudin


41

Você pode suprimir o espaço imprimindo uma sequência vazia para stdout entre as printinstruções.

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

No entanto, uma solução mais limpa é criar primeiro toda a sequência que você deseja imprimir e depois imprimi-la com uma única printinstrução.


4
@Soulseekah: Sim, usar apenas sys.stdout.write()é mais conveniente neste caso. No entanto, eu queria mostrar que escrever uma string vazia para stdout suprime o espaço entre os elementos escritos usando print, o que poderia ser útil em situações semelhantes.
Pär Wieslander

34

Você pode imprimir um caractere de backspace ( '\b'):

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

resultado:

aaaaaaaaaaaaaaaaaaaa

30

Python 3.x:

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

Python 2.6 ou 2.7:

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

10

Se você deseja que eles apareçam um de cada vez, você pode fazer o seguinte:

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

sys.stdout.flush() é necessário forçar o caractere a ser gravado cada vez que o loop é executado.


7

Apenas como uma observação lateral:

A impressão é O (1), mas a construção de uma sequência e, em seguida, a impressão é O (n), onde n é o número total de caracteres na sequência. Então, sim, enquanto a construção da string é "mais limpa", não é o método mais eficiente de fazer isso.

A maneira como eu faria isso é a seguinte:

from sys import stdout
printf = stdout.write

Agora você tem uma "função de impressão" que imprime qualquer sequência que você especificar, sem retornar o novo caractere de linha a cada vez.

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

A saída será: Olá, mundo!

No entanto, se você quiser imprimir números inteiros, flutuantes ou outros valores que não sejam de sequência, precisará convertê-los em uma sequência com a função str ().

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

A saída será: 2 4


Você diz que eu posso produzir uma quantidade infinita de texto ao mesmo tempo que um caractere?
CTRL-ALT-DELOR

Quando redefinii printf para stdout.write, meu stdout.write parece estar imprimindo o número de caracteres do gráfico em que a string é: "Olá, 6" O que dá? O que está acontecendo? E como eu paro isso?
Tom

1
Além disso, você pode explicar o que você quer dizer com O (1) O (n)? Eu não entendo o que isso refere-se a
Tom

@ Tom Está se referindo à complexidade (notação Big O) como um reflexo do custo da operação. O (1) é tempo constante - ideal - e O (n) é tempo linear - ok, mas muito caro para algo tão simples. Embora, para pequenas coisas, o tempo que você gaste usando seu cérebro para se preocupar com essas coisas seja um desperdício computacional mais do que apenas usar concatenação de cordas.
Benjamin R

6

Ou o que o Ant diz , ou se acumula em uma string e imprima uma vez:

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

6

sem o que? você quer dizer

>>> print 'a' * 20
aaaaaaaaaaaaaaaaaaaa

?


3

isso é realmente simples

para versões python 3+, você só precisa escrever os seguintes códigos

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

basta converter o loop para os seguintes códigos, você não precisa se preocupar com outras coisas


2

UAU!!!

É muito muito tempo atrás

Agora, no python 3.x , será bem fácil

código:

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

resultado:

aaaaaaaaaaaaaaaaaaaa 

Mais sobre a função print ()

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

Aqui :

value1,value2,value3

você pode imprimir vários valores usando vírgulas

sep = '-'

3 valores serão separados pelo caractere '-'

você pode usar qualquer caractere em vez dessa sequência par, como sep = '@' ou sep = 'good'

end='\n'

por função de impressão padrão, coloque '\ n' caractere no final da saída

mas você pode usar qualquer caractere ou sequência alterando o valor da variável final

como end = '$' ou end = '.' ou end = 'Olá'

file=sys.stdout

este é um valor padrão, saída padrão do sistema

Usando esse argumento, você pode criar um fluxo de arquivos de saída como

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

por esse código, você criará um arquivo chamado output.txt onde sua saída Eu sou um programador será armazenada

flush = False

É um valor padrão usando flush = True, você pode liberar o fluxo à força


2

tão simples como isso

def printSleeping():
     sleep = "I'm sleeping"
     v = ""
     for i in sleep:
         v += i
         system('cls')
         print v
         time.sleep(0.02)
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.