【问题标题】:Printing without newline (print 'a',) prints a space, how to remove?没有换行符的打印(打印'a',)打印一个空格,如何删除?
【发布时间】:2011-05-28 19:08:00
【问题描述】:

我有这个代码:

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

有可能吗?

【问题讨论】:

  • 我很惊讶还没有人提到"".join("a" for i in xrange(20))。 (它比只做"a" * 20 灵活得多,因为我认为这是一个简化的例子)。

标签: python string printing python-2.x


【解决方案1】:

有多种方法可以实现您的结果。如果您只是想为您的案例提供解决方案,请使用string multiplication 作为@Ant 提及。这只有在您的每个 print 语句都打印相同的字符串时才有效。请注意,它适用于任意长度字符串的乘法(例如 'foo' * 20 有效)。

>>> print 'a' * 20
aaaaaaaaaaaaaaaaaaaa

如果您想在一般情况下执行此操作,请构建一个字符串,然后打印一次。这会为字符串消耗一点内存,但只调用一次print。请注意,使用+= 的字符串连接现在与您要连接的字符串的大小呈线性关系,因此速度会很快。

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

或者你可以更直接地使用sys.stdout.write()print 是一个包装器。这将只写你给它的原始字符串,没有任何格式。请注意,即使在 20 个 as 的末尾也不会打印换行符。

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

Python 3 将print 语句更改为print() function,它允许您设置end 参数。您可以通过从__future__ 导入来在 >=2.6 中使用它。不过,我会在任何严肃的 2.x 代码中避免这种情况,因为这对于那些从未使用过 3.x 的人来说会有点混乱。不过,它应该让您体验到 3.x 带来的一些好处。

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

【讨论】:

  • @A A 我在字符串乘法答案出现时阅读了这个问题,并认为我会概述几个选项。当我整理我的答案时,其他人来了。它很快就被接受了,否则我可能会删除它。
  • -1 不要通过连接建立字符串;它是 O(n^2) 而不是 O(n)。请改用"".join(...)
  • 我对你的回答没有任何问题,它总结了一切,这很好。但是通过这样做,您会阻止其他回答的人。有很多好的答案,都值得+1。想象一下,如果每个人都开始做总结。
  • @katrielalex:这有关系吗? OP 是否要求优化或复杂性?对 20 个字符串有影响吗?拜托,你一定是在开玩笑。
  • @katrielalex 错误,在 Python 中使用 += 进行字符串连接是用于连接单个字符的恒定时间操作。
【解决方案2】:

来自What’s New in Python 2.6文档中的PEP 3105: print As a Function

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

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

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

    • @Soulseekah:是的,在这种情况下只使用sys.stdout.write() 更方便。但是,我想表明将空字符串写入标准输出会抑制使用 print 写入的元素之间的空格,这在类似情况下可能很有用。
    【解决方案4】:

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

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

    结果:

    aaaaaaaaaaaaaaaaaaaa
    

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

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

        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

          【讨论】:

          • 你说我可以在输出一个字符的同时输出无限量的文本吗?
          • 当我将 printf 重新定义为 stdout.write 时,我的 stdout.write 似乎正在打印字符串的字符数:“Hello,6” 给出了什么?这是怎么回事?我该如何阻止它?
          • 另外,你能解释一下你所说的 O(1) O(n) 是什么意思吗?我不明白这是指什么
          • @Tom 它指的是复杂性(大 O 表示法)作为操作 成本 的反映。 O(1) 是恒定时间 - ideal - 而 O(n) 是线性时间 - 好的 但对于如此简单的事情来说太贵了。虽然,对于一些小事,你用大脑来担心这些事情的时间比仅仅使用字符串连接更浪费计算。
          【解决方案8】:

          要么什么Antsays,要么累加成一个字符串,然后打印一次:

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

          【讨论】:

            【解决方案9】:

            没有什么? 你是说

            >>> print 'a' * 20
            aaaaaaaaaaaaaaaaaaaa
            

            ?

            【讨论】:

              【解决方案10】:

              这真的很简单

              对于 python 3+ 版本,您只需编写以下代码

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

              只需将循环转换为以下代码即可,其他的不用你操心

              【讨论】:

                【解决方案11】:

                哇!!!

                这是相当很久以前

                现在,在 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 你可以强制flush流

                【讨论】:

                  【解决方案12】:

                  就这么简单

                  def printSleeping():
                       sleep = "I'm sleeping"
                       v = ""
                       for i in sleep:
                           v += i
                           system('cls')
                           print v
                           time.sleep(0.02)
                  

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2022-01-02
                    • 1970-01-01
                    • 2018-02-25
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多