【问题标题】:How is print('\r') or print(' ') giving me the output?print('\r') 或 print(' ') 如何给我输出?
【发布时间】:2021-11-16 07:06:41
【问题描述】:

我们被要求打印以下输出:

1 1 1 1 1 1 1 1 1 1
2 2 2 2 2 2 2 2 2
3 3 3 3 3 3 3 3
4 4 4 4 4 4 4
5 5 5 5 5 5
6 6 6 6 6
7 7 7 7
8 8 8
9 9 
10

我知道它需要两个循环,所以我厌倦了这个:

a = int(input())
i = a
f = 1
while i>0:
 for j in range(i):
      print(f,end=' ')
 f += 1
 i -= 1
 print('\r')

有了这个,我得到了想要的输出,但是一旦我删除 print('\r') 的最后一行,输出就会变成这样:

1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 5 5 5 5 5 5 6 6       6 6 6 7 7 7 7 8 8 8 9 9 10

当我使用 print(' ') 而不是 print('\r') 时,所需的输出也会出现,我不明白为什么会这样?

Ps:我是一个新手程序员,从大一开始,所以如果格式不符合标准,或者代码看起来很庞大,请放轻松。

【问题讨论】:

  • 您需要将print('\n') 作为最后一行。 \r 将光标放回第 1 列,但不前进到下一行。而且你真的不需要那里有两个计数器;你可以做for f in range(1,a+1):
  • @TimRoberts print('\n') 将打印两个换行符,因为print() 的本质是默认总是打印一个换行符。
  • 你是对的。 print('') 是正确答案。
  • 在其他一些语言或脚本语言(大多数旧版本)中,在为 Windows 操作系统设计的服务器中,我们使用 CRLF \r\n .. 我不知道 python,所以如果这会改变事情,请尝试自己\r = 回车,\n= 换行
  • 好吧,所以 print(' ') 会自动将光标移到下一行,但是我不明白的是,为什么光标在 print( f,end='') 语句,为什么我需要添加额外的打印? @Felk 你的意思是 print() 总是打印一个新的空行吗?

标签: python python-3.x loops


【解决方案1】:

可能对您帮助不大,但以下代码会产生预期的输出:

a = 10
for i, j in enumerate(range(a, 0, -1), 1):
    print(*[i] * j)

# Output:
1 1 1 1 1 1 1 1 1 1   # i=1, j=10
2 2 2 2 2 2 2 2 2     # i=2, j=9
3 3 3 3 3 3 3 3       # i=3, j=8
4 4 4 4 4 4 4         # i=4, j=7
5 5 5 5 5 5           # i=5, j=6
6 6 6 6 6             # i=6, j=5
7 7 7 7               # i=7, j=4
8 8 8                 # i=8, j=3
9 9                   # i=9, j=2
10                    # i=10, j=1

这里的两个重要参数是sep(打印列表时)和end 作为print 的参数。让我们尝试使用它:

a = 10
for i, j in enumerate(range(a, 0, -1), 1):
    print(*[i] * j, sep='-', end='\n\n')

# Output:
1-1-1-1-1-1-1-1-1-1

2-2-2-2-2-2-2-2-2

3-3-3-3-3-3-3-3

4-4-4-4-4-4-4

5-5-5-5-5-5

6-6-6-6-6

7-7-7-7

8-8-8

9-9

10

更新

一步一步:

# i=3; j=8

>>> print([i])
[3]

>>> print([i] * j)
[3, 3, 3, 3, 3, 3, 3, 3]

# print takes an arbitrary number of positional arguments.
# So '*' unpack the list as positional arguments (like *args, **kwargs)
# Each one will be printed and separated by sep keyword (default is ' ')
>>> print(*[i] * j)

【讨论】:

  • 想出了相同的解决方案,所以我赞成你的:-)
  • 我理解你的代码,但是你能解释一下*[i]吗?你在这里执行了什么任务??
  • 我更新了我的答案。我将列表扩展为print 函数的位置参数。检查docs.python.org/3/tutorial/…
【解决方案2】:

为了使这一切变得更容易并防止错误,您可以这样做:

n = 10
for i in range(1, n + 1):
    txt = str(i) + " " # Generate the characters with space between
    print(txt * (n + 1 - i)) # Print the characters the inverse amount of times i.e. 1 10, 10 1

它生成的文本只是数字 + 一个空格,然后打印出相反的次数(11 - 当前数字),即 1 十次,10 次。

【讨论】:

  • 好吧,我本可以尝试那种字符串方法,我一直在做一些元组问题,所以我忘记了在没有元组或列表的情况下打印时字符串输出不带 ''。
【解决方案3】:

我建议使用 2 或 4 个空格进行缩进。一起来看看吧:

a = int(input())
i = a
f = 1
while i>0:
    for j in range(i):
        print(f,end=' ')
    f += 1
    i -= 1
    print('\r')

注意内部循环中的print(f,end=' ')end=' ' 位很重要,因为print() 默认情况下会在每个调用后面附加一个尾随新行\n。使用 end=' ' 代替附加一个空格。

现在看看print('\r')。它没有指定end=' ',因此它仍然在每次调用打印后附加一个换行符。在这种情况下,您另外打印 \r 的事实是无关紧要的。你也可以只做print()

【讨论】:

  • PEP8 对此事很清楚,缩进是4个空格。 (如果使用已经在使用标签的代码,使用标签是可以的。)
【解决方案4】:

你可以这样做:

rows = 10
b = 0

for i in range(rows, 0, -1):
    b += 1
    for j in range(1, i + 1):
    print(b, end=' ')
    print('\r')

【讨论】:

    【解决方案5】:

    不需要多个循环。

    for i in range(1,11):
        # concatenate number + a space repeatedly, on the same line
        # yes, there is an extra space at the end, which you won't see ;-)
        print(f"{i} " * (11-i))
    
    

    输出:

    1 1 1 1 1 1 1 1 1 1 
    2 2 2 2 2 2 2 2 2 
    3 3 3 3 3 3 3 3 
    4 4 4 4 4 4 4 
    5 5 5 5 5 5 
    6 6 6 6 6 
    7 7 7 7 
    8 8 8 
    9 9 
    10 
    

    关于你的代码发生了什么......

    基本的 Python print 打印在一行上,这意味着它以换行结束(将其移至下一行)。

    所以,如果我相信你的话,那么当你在以下点完成时,你已经完成了所有艰苦的工作,比如第一行的 10 个空格。

    #your code
     f += 1
     i -= 1
    

    现在,到目前为止,您已经通过将end 参数更改为打印来避免换行,以便它不以换行符结束。所以你有:

    1 1 1 1 1 1 1 1 1 1

    仍然没有换行。太好了!

    但是如果您现在开始打印2 2 2 2 2 2 2 2 2 ,它只会被添加到...上一行的末尾,没有换行符。

    所以要强制换行,你 * 打印任何你想要的东西,但没有设置 end 参数,所以现在打印 结束 使用它默认使用的换行。

    例子:

    #without line feed
    print("1 " * 3, end=' ')
    print("2 " * 2, end=' ')
    
    

    输出:

    1 1 1  2 2
    

    让我们尝试打印一些东西,任何东西,没有end = ' ')

    print("1 " * 3, end=' ')
    #now add a line by a print that is NOT using `end = ' '`
    print("!")
    print("2 " * 2, end=' ')
    
    

    输出:

    1 1 1  !
    2 2
    

    好的,所以现在我们在! 之后有一个换行符,所以在打印 2s 时可以跳到下一行。但是你不想在 1 之后看到任何东西。

    简单,打印任何不可见的东西。

    print("1 " * 3, end=' ')
    #now add a line by a print, but using a non-visible character.
    #or an empty string.  Tabs, spaces, etc... they will all work
    print(" ")
    print("2 " * 2, end=' ')
    
    

    输出:

    1 1 1
    2 2
    

    这也可以:

    print("1 " * 3, end=' ')
    #we could also print a linefeed and end without one...
    print("\n", end="")
    print("2 " * 2, end=' ')
    
    

    【讨论】:

      猜你喜欢
      • 2020-07-28
      • 1970-01-01
      • 1970-01-01
      • 2011-02-26
      • 2010-10-05
      • 2019-10-05
      • 1970-01-01
      • 2011-04-27
      • 1970-01-01
      相关资源
      最近更新 更多