【问题标题】:Python - How to apply function to dictionaryPython - 如何将函数应用于字典
【发布时间】:2026-02-07 21:30:01
【问题描述】:

我是 python 的初学者,从 "Automate the Boring Stuff with 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.当您将某些东西传递给函数时,接收端应该有一些东西要捕获。 2. 传递给函数的theBoard 在函数内部调用board。参数board 接收theBoard 的值。
  • 谢谢。我想了解更多关于基础的信息。 1) 为什么我没有以下函数的接收端def printabc(): print('abc') printabc() 2) 我们可以使用“theBoard”而不是用另一个称为“board”的参数替换它吗?为什么?
  • 我不确定你在问第一个问题是什么,但对于第二个问题,答案是肯定的,但这会很混乱。当你有一个函数参数时(例如本例中的 board ),你实际上是在告诉函数“我有一个对象,我们将在函数中调用这个特定的名称。”如果您在全局范围内有一个名为“theBoard”的变量,而在较小的函数范围内有一个名为“theBoard”的变量,您可能会感到困惑。
  • 1) 因为你没有传递任何东西来运行。 2) 当然。

标签: python-3.x function dictionary


【解决方案1】:

回答您的问题:

  1. 我们需要在 printBoard 中包含参数“board”。通常,不保证字典“theBoard”在函数的范围内(又名可访问)。为了使这段代码尽可能通用,并允许它以这种通用格式打印字典,我们需要将要打印的字典作为参数传递给函数。但是,如果您想从不同的文件/模块导入此函数,您会遇到一些问题:该函数将无法找到名为“theBoard”的变量。这在 Python 这样的语言中不太清楚,如果您将上面对“board”的引用替换为“theBoard”,这确实会起作用,因为“theBoard”在全局范围内。

  2. 与此类似,函数定义中的“板”指的是作为参数传入的任何内容。在这种情况下,它是字典theBoard。要看到这一点,请注意函数调用printBoard(theBoard) 是执行打印的实际行。所以想象一下,如果函数定义体中对参数board的每个引用实际上都是对字典theBoard.的引用

换句话说,我会阅读/练习编程语言中作用域的概念,我相信这将使这个示例不那么令人困惑。

【讨论】:

    【解决方案2】:

    首先,如果您学习 Python,请坚持使用 PEP8 约定:在这里,您应该使用 snake_case 变量名称而不是 CamelCase 名称(请参阅:https://www.python.org/dev/peps/pep-0008/#descriptive-naming-styles)。现在,让我重写代码sn-p:

    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_boardprint_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 的位置:当您阅读该函数时,您会假设它是在某个地方定义的,仅此而已。

    【讨论】: