不带换行符的打印(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,因为我认为这是一个简化的示例)。
托马斯K 2010年

Answers:


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

10
-1不要通过串联建立字符串;它是O(n ^ 2)而不是O(n)。使用"".join(...)代替。
卡特里尔(Katriel)2010年

10
我对您的回答没有问题,它总结了所有内容,这很好。但是通过这样做,您会阻止其他回答的人。有很多好的答案,所有都应+1。试想一下,如果每个人都开始进行摘要。
user225312 2010年

3
@katrielalex:有关系吗?OP是否要求优化或复杂性?对20根琴弦重要吗?来吧,你一定是在开玩笑。
user225312 '12

1
@katrielalex错误,+=在Python中使用字符串连接是对单个字符进行连接的恒定时间操作。
moinudin 2010年


41

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

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

但是,更干净的解决方案是首先构建您要打印的整个字符串,然后使用单个print语句将其输出。


4
@Soulseekah:是的,sys.stdout.write()在这种情况下,仅使用更方便。但是,我想证明向stdout中写入一个空字符串会抑制使用编写的元素之间的空格print,这在类似情况下可能会很有用。
韦尔斯兰德(PärWieslander)2010年


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

当我将printf重新定义为stdout.write时,我的stdout.write似乎正在打印该字符串的character数量为:“ Hello,6”,这有什么用?这是怎么回事?我该如何阻止它?
汤姆,

1
另外,您能解释一下O(1)O(n)的意思吗?我不明白这是什么意思
汤姆(Tom),

@Tom指的是复杂性(Big O表示法),以反映操作成本。O(1)是恒定时间- 理想 -O(n)是线性时间- 好的,但是对于这么简单的东西来说太昂贵了。尽管对于小事情,花费时间用脑部担心这些事情比仅使用字符串连接要浪费更多的计算时间。
本杰明·R

6

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

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='')

只需将循环转换为以下代码,您就不必担心其他事情


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 ='Hello'

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)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.