不换行打印(print 'a',)会打印一个空格,如何去掉?

125

我有这段代码:

>>> 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
13个回答

132

有多种方法可以实现您的结果。如果您只是想要解决方案,请像@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__导入来使用它。但是,对于那些从未使用过3.x的人来说,我会避免在任何严肃的2.x代码中使用它,因为这可能会有点令人困惑。然而,它应该让您尝到3.x带来的一些好处。
>>> from __future__ import print_function
>>> for i in xrange(20):
...     print('a', end='')
... 
aaaaaaaaaaaaaaaaaaaa>>> 

4
当字符串乘法的答案出现时,我阅读了问题,并想给出几个选项的概述。其他选项是在我整理答案时出现的。如果那时它还没有被接受,我可能会将其删除。 - moinudin
10
不要通过字符串连接来构建字符串;这样会变成 O(n^2) 而非 O(n)。相反,请使用 "".join(...) - Katriel
10
我对你的回答没有任何问题,总结了一切,这很好。但是这样做会使其他回答者受到打击。有很多好的答案都值得被点赞。想象一下,如果每个人都开始做总结,会怎样呢? - user225312
3
这是否重要?原文作者是否提出了优化或复杂性的问题?对于20个字符串,这是否重要?拜托,你一定在开玩笑。 - user225312
1
@katrielalex 错了,Python中使用+=进行字符串连接对于单个字符的连接是一个常数时间操作。 - moinudin
1
我已在元社区(meta)上开始了关于此事的讨论。 - moinudin

119

PEP 3105:将打印作为函数Python 2.6中的新功能文档中:

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

显然,这只适用于Python 3.0或更高版本(或者在开头使用from __future__ import print_function的2.6+版本)。在Python 3.0中,print语句被删除并默认变为print()函数。


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

输出结果是:Hello, World!
但如果你想输出整数、浮点数或其他非字符串的值,你需要使用str()函数将它们转换成字符串。
printf(str(2) + " " + str(4))

输出结果为:2 4。

你是说在输出一个字符的同时,我可以输出无限量的文本吗? - ctrl-alt-delor
当我将printf重新定义为stdout.write时,我的stdout.write似乎打印了字符串的字符数:"Hello,6"。这是怎么回事?发生了什么?我该如何停止它? - Tom
1
另外,您能解释一下O(1)和O(n)的含义吗?我不明白它指的是什么。 - Tom
@Tom 这里指的是复杂度(大O符号)作为操作_成本_的反映。O(1)代表常数时间 - 理想 - 而O(n)则代表线性时间 - 还可以 但对于一些简单的操作来说太过昂贵。 不过,对于小事情而言,你花费在担心这些问题上的时间比使用字符串连接更加浪费计算资源。 - Benjamin R

6

要么按照 Ant 的说法,要么将其累加为一个字符串,然后一次性打印出来:

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

6

您是指没有什么?

>>> print 'a' * 20
aaaaaaaaaaaaaaaaaaaa

?


3

这真的非常简单。

对于Python 3+版本,您只需编写以下代码即可:

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

只需将循环转换为以下代码,无需担心其他事项。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接