我是 python 新手,我偶然发现了一个函数/变量?我不知道它是做啥的,有人可以解释一下吗? [复制]
Posted
技术标签:
【中文标题】我是 python 新手,我偶然发现了一个函数/变量?我不知道它是做啥的,有人可以解释一下吗? [复制]【英文标题】:I am new to python, and I stumbled onto a function/variable? and I dont know what it does, can somebody explain please? [duplicate]我是 python 新手,我偶然发现了一个函数/变量?我不知道它是做什么的,有人可以解释一下吗? [复制] 【发布时间】:2021-07-15 17:43:56 【问题描述】:代码如下:
get_indexes = lambda x, xs: [i for (y, i) in zip(xs, range(len(xs))) if x == y]
它是在一个tik tac toe程序的上下文中,如果你想看它,这里是:
starting_message = 'Greetings, X Shall Go First And O Shall Go Second. '
prompt = 'Shall We Begin?(Y Or N) '
instructions = 'Pick A Number(1-9)'
box = ["1", "2", "3", "4", "5", "6", "7", "8" ,"9"]
print(starting_message)
get_indexes = lambda x, xs: [i for (y, i) in zip(xs, range(len(xs))) if x == y]
player_begin = raw_input(prompt)
if player_begin == 'Y':
print(instructions)
else:
if player_begin == 'N':
quit()
player = 'X'
def is_winner(boxes):
if 6 in boxes and 7 in boxes and 8 in boxes:
return True
elif 5 in boxes and 4 in boxes and 3 in boxes:
return True
elif 2 in boxes and 1 in boxes and 0 in boxes:
return True
elif 0 in boxes and 4 in boxes and 8 in boxes:
return True
elif 1 in boxes and 4 in boxes and 7 in boxes:
return True
elif 0 in boxes and 3 in boxes and 6 in boxes:
return True
elif 2 in boxes and 5 in boxes and 8 in boxes:
return True
elif 2 in boxes and 4 in boxes and 6 in boxes:
return True
else:
return False
def is_tie(boxes):
if all boxes == 'X' or 'O'
and is_winner(boxes) is false:
return True
else return False
def is_occupied(index,boxes):
return boxes[index - 1] == 'X' or boxes[index - 1] == 'O'
while True:
if player == 'X':
print('Your Turn X')
else:
print('Your Turn O')
board = ''' ___________________
| | | |
| '''+box[0]+''' | '''+box[1]+''' | '''+box[2]+''' |
| | | |
|-----------------|
| | | |
| '''+box[3]+''' | '''+box[4]+''' | '''+box[5]+''' |
| | | |
|-----------------|
| | | |
| '''+box[6]+''' | '''+box[7]+''' | '''+box[8]+''' |
| | | |
___________________ '''
player_board = raw_input(board)
if is_occupied(int(player_board), box):
print('This Box Is Not Avaliable')
else:
if player == 'X':
box[int(player_board) - 1] = "X"
player = 'O' #False
else:
box[int(player_board) - 1] = "O"
player = 'X' #True
if is_winnerX(get_indexes('X', box)):
print('X WINS!!')
quit()
elif is_winnerX(get_indexes('O', box)):
print('O WINS!!')
quit()
elif is_tie(boxes):
print()
quit()
else:
'return'
【问题讨论】:
你应该看看lambda
是如何使用/理解它的。例如:w3schools.com/python/python_lambda.asp
请参阅文档中的Lambda Expressions。
引用Style Guide for Python Code:“始终使用 def 语句而不是将 lambda 表达式直接绑定到标识符的赋值语句”
顺便说一句,根据 raw_input
的用法,这是 Python 2 的代码,即使 print
使用括号。自 2020 年初以来,Python 2 就已经死了,而且这个死讯是在 10 多年前宣布的。切换到 Python 3。现在!
【参考方案1】:
它会查找存在X
或O
的索引,具体取决于您如何称呼它。
让我们说box = ['1', '2', 'X', 'O', '5', 'X', '7', '8', 'O']
。现在,您调用 get_indexes,传递 'X'
,这意味着您要查找所有 X 的索引,并传入框,如下所示:get_indexes('X', box)
。
首先发生的是zip
。要查看发生了什么,让我们将其打印出来:
print([i for i in zip(box, range(len(box)))])
# and we get:
[('1', 0), ('2', 1), ('X', 2), ('O', 3), ('5', 4), ('X', 5), ('7', 6), ('8', 7), ('O', 8)]
让我们看看第一个元组('1', 0)
。那么,'1'
是从哪里来的?好吧,如果您查看box
,您会发现它是第一个索引。这意味着0
必须是'1'
的索引!
下一部分在这里:
lambda x, xs: [i for (y, i) in zip(xs, range(len(xs))) if x == y]
# this part ---> (y, i) <--- this part
这里发生的事情是 y
和 i
正在设置为 ('1', 0)
。所以y
被设置为'1'
,i
被设置为0
。
现在我们来到if x == y
。如果你从一开始就记得,x = 'X'
。嗯,y 等于 '1'
而不是 'X'
,所以 i
或 '1'
的索引不会附加到列表中。
跳到第三个元组('X', 2)
。 y
设置为 'X'
。 if x == y
将返回 True
,并且 y 的索引 (i
) 将附加到列表中。所以在遍历所有元组之后,get_indexes
将返回[2, 5]
。
您也可以使用enumerate(xs)
而不是使用zip(xs, range(len(xs)))
来完成同样的事情。像这样:
get_indexes = lambda x, xs: [idx for idx, ele in enumerate(xs) if ele == x]
# idx is the index, and ele is current item/element
【讨论】:
以上是关于我是 python 新手,我偶然发现了一个函数/变量?我不知道它是做啥的,有人可以解释一下吗? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
如何确保在从 Mongoose 中的函数返回之前执行异步调用?