Python井字棋项目中for (i, spot)搭配enumerate的语法疑问
代码功能总览
这段代码是井字棋项目里用来获取当前所有合法落子位置的方法,最终会返回一个装满可用位置编号的列表。
语法部分讲解
1. enumerate() 内置函数
enumerate() 是Python自带的工具,专门用来遍历列表、元组这类可迭代对象,特点是遍历的时候可以同时拿到「元素的位置索引」和「元素本身的值」。
你代码里的self.board就是存储棋盘状态的列表,通常是长度为9的列表(对应3×3井字棋的9个格子),每个元素的值是' '(空)、'X'或者'O'。
2. for (i, spot) 元组解包
enumerate() 每次迭代都会返回一个格式为(索引, 元素值)的元组,这里的(i, spot)就是把这个元组直接拆成两个变量:
i接收当前格子的位置编号(比如0对应第一行第一格,8对应第三行第三格)spot接收当前格子的状态(是空、是X还是O)
这里的括号可以省略,直接写for i, spot in enumerate(self.board)效果完全一样,加括号只是更直观体现是元组解包。
逻辑部分拆解
整段方法的执行逻辑非常清晰:
- 首先初始化一个空列表
moves,用来存所有可以落子的位置编号 - 遍历棋盘的每一个格子:
- 如果当前格子的状态是
' '(也就是还没人落子),就把这个格子的编号i加到moves列表里
- 如果当前格子的状态是
- 遍历完成后,把存了所有合法落子位的
moves列表返回
举个实际例子方便理解:如果当前棋盘状态是:self.board = ['X', ' ', 'O', ' ', 'X', ' ', ' ', ' ', 'O']
调用这个方法后返回的moves就是[1, 3, 5, 6, 7],对应棋盘上所有还空着的位置编号。
内容的提问来源于stack exchange,提问作者black fire
相关产品推荐
相关产品推荐

