【问题标题】:(Python 3.x) How do I add a space before the first variable in a print function?(Python 3.x) 如何在打印函数的第一个变量之前添加一个空格?
【发布时间】:2018-11-22 18:21:17
【问题描述】:

我正在 Python 3.4.1 中制作井字游戏程序。 我的代码如下:

def boardDraw():
    board = 0,0,0,\
            0,0,0,\
            0,0,0
    print(board[0] , "|" , board[1] , "|" , board[2], \
    "\n----------\n" , \
    board[3] , "|" , board[4] , "|" , board[5], \
    "\n----------\n" , \
    board[6] , "|" , board[7] , "|" , board[8])

boardDraw()

输出:

0 | 0 | 0 
----------
 0 | 0 | 0 
----------
 0 | 0 | 0

期望的输出:

 0 | 0 | 0 
----------
 0 | 0 | 0 
----------
 0 | 0 | 0

获得所需输出的唯一方法是插入以下内容:

打印(end = " ")

在董事会和我当前的印刷声明之间?如果可能的话,我想把它打印在一张纸上。

【问题讨论】:

  • format function 上阅读几分钟会有很大帮助
  • 来自the docs:“所有非关键字参数都像 str() 一样转换为字符串并写入流,以 sep 分隔,后跟 end。”试试str.format()
  • 作弊:print("", board[0], ..)。但是如果不依赖这个分隔符自动插入会更好(并且以后更容易处理)。

标签: python python-3.x


【解决方案1】:

为什么不使用.format

print ('{0:^3}|{1:^3}|{2:^3}'.format(*board))

此处的说明符:^3 表示创建宽度为 3 的字段并尽可能将文本居中。

【讨论】:

    【解决方案2】:

    user2864740 提供的快速而肮脏的方法可以解决问题。当我看到代码时,我的第一个想法是:

    print(board[0] , "|" , board[1] , "|" , board[2], \
    

    到:

    print("", board[0] , "|" , board[1] , "|" , board[2], \
    

    我真的不推荐这种格式化方式,它变得很难阅读。这可以更容易阅读和维护。您可以使用 Python 的格式,然后使用 % 将数据作为参数提供。

    所以我会使用类似的东西:

    boardsep = "-" * 10
    boardline =  "%s | %s | %s\n%s"
    print(boardline % (board[0], board[1], board[2], boardsep))
    print(boardline % (board[3], board[4], board[5], boardsep))
    print(boardline % (board[6], board[7], board[8], boardsep))
    

    boardsep 只是获取字符串中的内容并将其复制多次(在本例中为 10 次)的便捷方式。由于您打印boardline 的方式对于每一行都是相同的,因此我会将其分配给一个变量,以便可以重复使用。您可以阅读这些print formatting docs 以更好地了解参数和格式字符串如何协同工作。

    mgilson 还提出了一个很好的解决方案(我赞成)并让我再次查看 OP 的问题。对于 Python3,您可以做一些事情,例如字符串的新格式方法、切片和扩展。

    boardsep = '-' * 10
    boardline = '{0:^3}|{1:^3}|{2:^3}\n{sep}''
    print (boardline.format(*board[0:3], sep=boardsep))
    print (boardline.format(*board[3:6], sep=boardsep))
    print (boardline.format(*board[6:9], sep=boardsep))
    

    但是您可以更进一步,将其简化为一条复杂的线。如果您对上述基础知识有透彻的了解,可以试试这个:

    print ((('{:^3}|{:^3}|{:^3}\n'+('-'*10)+'\n') * 3).format(*board))
    

    如果您要打印生成板的扩展格式说明符,它将如下所示:

    {:^3}|{:^3}|{:^3}\n----------\n{:^3}|{:^3}|{:^3 }\n----------\n{:^3}|{:^3}|{:^3}\n----------\n

    由于 OP 确实注意到了输出中的问题,我将为代码提供最后一次编辑,该代码更具动态性,可以放入扩展函数中以生成板。

    linesepchar = '-'
    colsepchar = '|'
    numrows = 3
    numcols = 3
    fieldwidth = 3
    linesep = '\n{linesepchar:{linesepchar}^{linewidth}}\n'
    fieldspec = '{:^{fieldwidth}}'
    lineformat = (fieldspec+'{colsepchar}')*(numcols-1)+fieldspec
    boardstr = (((lineformat+linesep)*(numrows-1)+lineformat).format( \
                      *board,linesepchar=linesepchar, colsepchar=colsepchar, \
                      fieldwidth=fieldwidth, linewidth=((fieldwidth+1)*numcols-1)))
    

    【讨论】:

    • 结束选择的唯一问题是它会导致第一行有两个空格和一组额外的“-”。感谢您的回答,我将大量研究格式化。
    • 是的,你说得很对。它确实增加了一行。我打算停止编辑,因为它提供了一个总体思路。但是,由于您指出了差异,我确实有一些我之前编写的代码几乎产生了几乎相似(但不完全)的输出。在某种程度上,我认为差异是对代码的微小改进。我将添加该代码作为我的最后一次编辑。它还允许您指定行和列、字段和列说明符等。
    【解决方案3】:

    如果你想要的话,这里是我之前展示井字棋盘的方式:

    def __init__(self):
        self.game_list = [
            ['a', 'b', 'c'],
            ['d', 'e', 'f'],
            ['g', 'h', 'i']
        ]
    
    def print_game_board(self):
        for list in self.game_list:
            print(" | ".join(list))
            print("--------")
    

    【讨论】:

      猜你喜欢
      • 2012-04-15
      • 1970-01-01
      • 2023-01-31
      • 1970-01-01
      • 2019-08-08
      • 2021-07-27
      • 2020-11-14
      • 2021-06-15
      • 1970-01-01
      相关资源
      最近更新 更多