【问题标题】:Python white space in this program此程序中的 Python 空白
【发布时间】:2017-03-22 18:27:43
【问题描述】:
#/usr/bin/python2.4 -tt

import sys

def mult_table(x,y):
  for i in range(1,y+1):
    for n in range(1,x+1):
      if n == 1:
        print i*n,
      elif n == x:
        print repr(i*n).rjust(3)
      else:
        print repr(i*n).rjust(3),

mult_table(12,3)
sys.exit(0)

我将此短程序提交给CodeEval。它唯一的工作就是制作一个乘法表。问题是它不应该有任何尾随空格,当我提交它时,最后一行在 36 之后有一个空格。我测试了自己,我没有这个问题。怎么回事?

【问题讨论】:

  • 不确定你想要什么。你能澄清一下吗?
  • "whitespace" 通常用于包含空格和换行符(以及制表符等)。因此,如果说明说“没有尾随空格”,那么他们可能不希望在最后一行之后换行。因此,您可以尝试将 n==x 更改为 n==x and i!=y 看看是否会让人满意。
  • @karlcow 我不明白为什么我的乘法表的最后一行有空格。

标签: python whitespace removing-whitespace


【解决方案1】:

您的代码为mult_table(1,1) 添加了一个空格,而不是为mult_table(12,3) 添加了一个空格。

因此,您需要修复您的 if n == 1 案例(同时检查 n == x,就像您稍后在代码中所做的那样)。

我会做一些不同的事情,所以mult_table 的核心是这样的:

      if n == 1:
        print i*n,
      else:
        print repr(i*n).rjust(3),

然后在外部 for 循环中只需 print 换行即可。

带回家:测试您的边界条件! :-)

【讨论】:

【解决方案2】:

由于换行符本身是空格,因此您的程序在设计上具有尾随空格。如果你想做一个特殊的情况,你可以禁止表格的末尾写一个换行符。

当我测试你的程序时,我在最后一个值之后没有看到空格(ASCII 0x20):

$ ~/src/test/x.py | xxd
0000000: 3120 2020 3220 2020 3320 2020 3420 2020  1   2   3   4
0000010: 3520 2020 3620 2020 3720 2020 3820 2020  5   6   7   8
0000020: 3920 2031 3020 2031 3120 2031 320a 3220  9  10  11  12.2
0000030: 2020 3420 2020 3620 2020 3820 2031 3020    4   6   8  10
0000040: 2031 3220 2031 3420 2031 3620 2031 3820   12  14  16  18
0000050: 2032 3020 2032 3220 2032 340a 3320 2020   20  22  24.3
0000060: 3620 2020 3920 2031 3220 2031 3520 2031  6   9  12  15  1
0000070: 3820 2032 3120 2032 3420 2032 3720 2033  8  21  24  27  3
0000080: 3020 2033 3320 2033 360a                 0  33  36.

【讨论】:

    【解决方案3】:

    我运行了这个(输出到文件),但在结果文件中没有发现任何额外的空白

    import sys
    
    def mult_table(x,y):
        with open('data.txt', 'w') as f:
            for i in range(1,y+1):
                for n in range(1,x+1):
                    if n == 1:
                        print i*n,
                        print >> f,  i*n,
                    elif n == x:
                        print repr(i*n).rjust(3)
                        print >> f, repr(i*n).rjust(3)
                    else:
                        print repr(i*n).rjust(3),
                        print >> f, repr(i*n).rjust(3),
    
    mult_table(12,3)
    sys.exit(0)
    

    有一个0a - 36 之后的换行符,但我认为这很正常,这对你来说是个问题吗?

    【讨论】:

    • 是的。起初我不认为这是个问题,但现在我想这就是为什么我的解决方案没有得到认可。
    【解决方案4】:

    嗯,我喜欢我之前的回答,因为它发现了您的程序发出空白空间的情况。

    但是,我在 CodeEval 上查看了问题,发现挑战要求您打印出 12x12 的表格,而不是 12x3。

    挑战描述只为您提供正确输出的前三行

    现在,当您检查 CodeEval 的程序输出报告时,是的,有一个额外的空间。 (我尝试过这个)。但这是一个 CodeEval 错误,不是你的。你的程序没有发出那个。

    红鲱鱼汤有人吗?

    带回家:仔细阅读问题。 :-)

    【讨论】:

      【解决方案5】:

      当您在一个环境中生成结果并在另一个环境中显示时,可能会导致问题。

      0000000: 3120 2020 3220 2020 3320 2020 3420 2020  1   2   3   4
      0000010: 3520 2020 3620 2020 3720 2020 3820 2020  5   6   7   8
      0000020: 3920 2031 3020 2031 3120 2031 320D 0A32  9  10  11  12..2
      0000030: 2020 2034 2020 2036 2020 2038 2020 3130     4   6   8  10
      0000040: 2020 3132 2020 3134 2020 3136 2020 3138    12  14  16  18
      0000050: 2020 3230 2020 3232 2020 3234 0D0A 3320    20  22  24..3
      0000060: 2020 3620 2020 3920 2031 3220 2031 3520    6   9  12  15
      0000070: 2031 3820 2032 3120 2032 3420 2032 3720   18  21  24  27
      0000080: 2033 3020 2033 3320 2033 360D 0A          30  33  36..
      

      我的 Windows 7 系统的输出中有 0D0A (CRLF),使用标准输出到文件运行您的代码。也许这在您的情况下被解释为空白?

      您可能需要澄清您的代码如何运行以及它如何输出结果,以及以何种格式输出。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-07-20
        • 1970-01-01
        • 2019-02-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多