2014-09-05 67 views
0

我正在Python 3.4.1中製作一個Tic Tac Toe程序。 我的代碼如下:(Python 3.x)如何在打印函數中的第一個變量之前添加一個空格?

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 

是擁有我希望的輸出的唯一方法是將以下內容:

print(end =「」)

在董事會和我目前的印刷聲明之間?如果可能的話,我希望在一個印刷品中使用它。

+0

幾分鐘閱讀[格式函數](https://docs.python.org/3.3/library/functions.html#format)將幫助很多 – wnnmaw 2014-09-05 20:38:40

+0

從[文檔](https:/ /docs.python.org/3/library/functions.html#print):「所有非關鍵字參數都會轉換爲像str()那樣的字符串並寫入流中,並由sep分隔,然後以end結尾。」嘗試[str.format()](https://docs.python.org/2/library/string.html#format-string-syntax)。 – Celeo 2014-09-05 20:39:50

+4

作弊:'print(「,board [0],..)'。但如果不依靠此分隔符自動插入,會更好(稍後更容易處理)。 – user2864740 2014-09-05 20:42:22

回答

5

爲什麼不使用.format

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

在這裏,說明符:^3手段,使寬度爲3的字段並且如果可能的話將文本居中。

3

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也提出了一個很好的解決方案(我upvoted它),並讓我再次看看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} \ n ---------- \ n

由於OP沒有注意到輸出中的問題,我將提供最後一次編輯代碼,這些代碼更具動態性,可以放入擴展的f中聯合來生成電路板。

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))) 
+0

只有你的結尾選擇有問題,它會導致第一行有兩個空格,並有一組額外的' - '。感謝您的回答,我會做大量的格式化工作。 – xdflames 2014-09-05 23:36:26

+1

是的,你很正確。它確實增加了一條額外的線。我將停止編輯,因爲它提供了一個大概的想法。然而,既然您指出了這種差異,我確實有一些我之前寫過的代碼幾乎產生了幾乎相似(但不完全)的輸出。在某種程度上,我認爲這種差異是一個小小的代碼改進。我將添加該代碼作爲我最後的編輯。它也讓你指定行和列,字段和列說明符等。 – 2014-09-05 23:58:47

相關問題