Python - 如何将函数应用于字典

3

我是Python的初学者,正在学习“用Python自动化无聊的工作”

我不明白如何将新函数应用于井字棋盘中的词典。

谢谢

  1. 为什么在def printBoard(board)中需要包含参数board

  2. 为什么需要在board['top-L']之前添加board?我不明白为什么函数的作用与前一行只定义了theBoard而不是board

theBoard = {'top-L': 'O', 'top-M': 'O', 'top-R': 'O', 'mid-L': 'X', 'mid-M':'X', 'mid-R': ' ', 'low-L': ' ', 'low-M': ' ', 'low-R': 'X'}

def printBoard(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'])
printBoard(theBoard)

1
  1. 当你将某物传递给函数时,接收端应该有相应的东西来捕获它。
  2. 传递给函数的 theBoard 在函数内被称为 board。参数 board 接收了 theBoard 的值。
- Austin
谢谢。我想了解更多关于基础知识的内容。1)为什么以下函数没有接收端?```def printabc(): print('abc')printabc()```2)我们能否使用“theBoard”而不是用另一个名为“board”的参数替换它?为什么? - Zorogx
我不确定你在第一个问题上想要什么,但对于第二个问题,答案是肯定的,但这会非常令人困惑。当你有一个函数参数(例如,在这种情况下是board),你实际上是在告诉函数“我有一个对象,我们将在函数内部称之为这个特定名称。”如果你在全局范围内有一个名为“theBoard”的变量和一个在较小函数范围内称为“theBoard”的变量,你可能会感到困惑。 - chang_trenton
  1. 因为你没有向函数传递任何参数。
  2. 当然。
- Austin
2个回答

3
为了回答你的问题:
1. 我们需要在 printBoard 中包括参数 "board"。通常,字典 "theBoard" 在函数内部不保证范围(即可访问性)。为了使这个代码尽可能地通用,并允许以这种通用格式打印字典,我们需要将要打印的字典作为参数传递给函数。但是,如果你想从不同的文件/模块导入此函数,你会遇到一些问题:函数将无法找到名为 "theBoard" 的变量。在像 Python 这样的语言中,这不太清楚,如果你以上面的 "board" 替换为 "theBoard" 的引用,这样确实可以工作,因为 "theBoard" 在全局作用域中。
2. 在类似的情况下,函数定义中的 "board" 指的是你传递的参数。在这种情况下,它是字典 theBoard。要看到这一点,请注意函数调用 printBoard(theBoard) 是实际执行打印的行。所以想象一下,如果函数定义主体中每个对参数 board 的引用实际上是对字典 theBoard 的引用。
换句话说,我建议你学习和练习编程语言中作用域的概念,我相信这将使这个例子变得不那么令人困惑。

0

首先,如果你正在学习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的定义位置:当你读取函数时,你假设它已经在某个地方被定义了,就可以了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接