没有换行的打印(打印'a',)打印一个空格,如何删除?

pyt*_*Foo 123 python printing string python-2.x

我有这个代码:

>>> 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
Run Code Online (Sandbox Code Playgroud)

我想输出'a',' '不像这样:

aaaaaaaaaaaaaaaaaaaa
Run Code Online (Sandbox Code Playgroud)

可能吗?

mar*_*cog 129

有很多方法可以达到你的结果.如果您只是想为您的案例寻找解决方案,请使用字符串乘法作为@Ant提及.只有在每个print语句都打印相同的字符串时,这才会起作用.请注意,它适用于任何长度字符串的乘法(例如'foo' * 20工作).

>>> print 'a' * 20
aaaaaaaaaaaaaaaaaaaa
Run Code Online (Sandbox Code Playgroud)

如果您想要执行此操作,请构建一个字符串然后再打印一次.这将占用字符串的一些内存,但只能进行一次调用print.请注意,字符串连接使用+=现在是您连接的字符串大小的线性,因此这将很快.

>>> for i in xrange(20):
...     s += 'a'
... 
>>> print s
aaaaaaaaaaaaaaaaaaaa
Run Code Online (Sandbox Code Playgroud)

或者您可以使用sys.stdout直接执行此操作.write(),它print是一个包装器.这将只写你给它的原始字符串,没有任何格式.请注意,即使在20 a秒结束时也不会打印换行符.

>>> import sys
>>> for i in xrange(20):
...     sys.stdout.write('a')
... 
aaaaaaaaaaaaaaaaaaaa>>> 
Run Code Online (Sandbox Code Playgroud)

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>>> 
Run Code Online (Sandbox Code Playgroud)

  • -1不要通过连接构建字符串; 它是O(n ^ 2)而不是O(n).使用""".join(...)`代替. (10认同)
  • 我的答案没有问题,它总结了一切,这很好.但通过这样做,你会劝阻其他回答的人.有很多好的答案,所有人都值得+1.想象一下,如果每个人都开始制作摘要. (10认同)
  • 当字符串乘法答案出现时,@ AAI读了一个问题,并且我想我会概述几个选项.其他人在我整理答案时来了.它很快被接受,否则我可能会删除它. (4认同)
  • @katrielalex:这有关系吗?OP是否要求优化或复杂性?它会对20个字符串有影响吗?来吧,你认真一定是在开玩笑. (3认同)

Ant*_*sse 119

PEP 3105:打印作为一个函数什么新的Python 2.6的文档:

>>> from __future__ import print_function
>>> print('a', end='')
Run Code Online (Sandbox Code Playgroud)

显然,只适用于python 3.0或更高版本(或开头的2.6+ from __future__ import print_function).该print语句已被删除,并print()在Python 3.0中默认成为函数.


Pär*_*der 41

您可以通过在print语句之间将空字符串打印到stdout来抑制空间.

>>> import sys
>>> for i in range(20):
...   print 'a',
...   sys.stdout.write('')
... 
aaaaaaaaaaaaaaaaaaaa
Run Code Online (Sandbox Code Playgroud)

但是,更简洁的解决方案是首先构建您要打印的整个字符串,然后使用单个print语句输出它.

  • @Soulseekah:是的,在这种情况下,只使用`sys.stdout.write()`更方便.但是,我想表明向stdout写一个空字符串会抑制使用`print`编写的元素之间的空间,这在类似情况下可能很有用. (4认同)

Luc*_*ops 34

您可以打印退格符('\b'):

for i in xrange(20):
    print '\ba',
Run Code Online (Sandbox Code Playgroud)

结果:

aaaaaaaaaaaaaaaaaaaa
Run Code Online (Sandbox Code Playgroud)


cod*_*ape 30

Python 3.x:

for i in range(20):
    print('a', end='')
Run Code Online (Sandbox Code Playgroud)

Python 2.6或2.7:

from __future__ import print_function
for i in xrange(20):
    print('a', end='')
Run Code Online (Sandbox Code Playgroud)


dav*_*les 10

如果您希望它们一次显示一个,您可以这样做:

import time
import sys
for i in range(20):
    sys.stdout.write('a')
    sys.stdout.flush()
    time.sleep(0.5)
Run Code Online (Sandbox Code Playgroud)

sys.stdout.flush() 每次循环运行时都必须强制写入字符.


小智 7

正如旁注:

打印是O(1)但是构建一个字符串然后打印是O(n),其中n是字符串中的字符总数.所以是的,虽然构建字符串是"更干净",但这不是最有效的方法.

我这样做的方式如下:

from sys import stdout
printf = stdout.write
Run Code Online (Sandbox Code Playgroud)

现在你有一个"打印功能",它打印出你给它的任何字符串,而不是每次都返回新的行字符.

printf("Hello,")
printf("World!")
Run Code Online (Sandbox Code Playgroud)

输出将是:Hello,World!

但是,如果要打印整数,浮点数或其他非字符串值,则必须使用str()函数将它们转换为字符串.

printf(str(2) + " " + str(4))
Run Code Online (Sandbox Code Playgroud)

输出将是:2 4


Ant*_*Ant 6

没有什么?你的意思是

>>> print 'a' * 20
aaaaaaaaaaaaaaaaaaaa
Run Code Online (Sandbox Code Playgroud)


jen*_*ram 6

无论是Ant 什么,还是累积成一个字符串,然后打印一次:

s = '';
for i in xrange(20):
    s += 'a'
print s
Run Code Online (Sandbox Code Playgroud)