首先,如果你正在学习Python,要遵循PEP8规范:在这里,你应该使用snake_case
变量名,而不是CamelCase
命名方式(参见:https://www.python.org/dev/peps/pep-0008/#descriptive-naming-styles)。现在,让我重新编写代码片段:
def print_board(board):
print(board['top-L'] + '|' + board['top-M'] + '|' + board['top-R'])
print('-+-+-')
print(board['mid-L'] + '|' + board['mid-M'] + '|' + board['mid-R'])
print('-+-+-')
print(board['low-L'] + '|' + board['low-M'] + '|' + board['low-R'])
if __name__ == "__main__":
the_board = {'top-L': 'O', 'top-M': 'O', 'top-R': 'O', 'mid-L': 'X', 'mid-M':'X', 'mid-R': ' ', 'low-L': ' ', 'low-M': ' ', 'low-R': 'X'}
print_board(the_board)
你有两个不同的部分:1. 函数定义;2. 程序的主要部分。
if __name__ == "__main__":
不是必需的,但标记了该块作为程序的 入口点。看一下函数签名(在 def
关键字后面):你有函数的名称 (print_board
) 和括号之间的参数(这里是一个名为 board
的参数)。试着把函数体想象成一个只知道它的参数值和 什么都不知道 的块(如果你玩作用域,行为可能会不同,请参见 @tchainzzz 的答案)。函数体使用它的参数来打印一个棋盘。
相应的是:当你调用一个函数时,你必须给这个函数提供它期望的参数,因为函数不知道其他任何东西。在这里,the_board
是在 print_board
函数调用上的参数值。但试着传递另一个值:
>>> print_board({'top-L': ' ', 'top-M': ' ', 'top-R': 'XYZ', 'mid-L': ' ', 'mid-M':' ', 'mid-R': 'TUV', 'low-L': ' ', 'low-M': ' ', 'low-R': 'ABC'})
| |XYZ
-+-+-
| |TUV
-+-+-
| |ABC
或者没有值:
>>> print_board()
Traceback (most recent call last):
...
TypeError: print_board() missing 1 required positional argument: 'board'
或者两个值:
>>> print_board(the_board, 2)
Traceback (most recent call last):
...
TypeError: print_board() takes 1 positional argument but 2 were given
或者是完全不同的值:
>>> print_board(0)
Traceback (most recent call last):
...
TypeError: 'int' object is not subscriptable
>>> print_board([])
Traceback (most recent call last):
...
TypeError: list indices must be integers or slices, not str
我希望你能理解!这些作用域是为了帮助你理解程序中正在发生的事情。你不必读取两千行代码才能找到
board
的定义位置:当你读取函数时,你假设它已经在某个地方被定义了,就可以了。
theBoard
在函数内被称为board
。参数board
接收了theBoard
的值。