我是 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】:

它会查找存在XO 的索引,具体取决于您如何称呼它。

让我们说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

这里发生的事情是 yi 正在设置为 ('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 新手,我偶然发现了一个函数/变量?我不知道它是做啥的,有人可以解释一下吗? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如果我不在 Javascript 函数中传递参数会怎样?

如何确保在从 Mongoose 中的函数返回之前执行异步调用?

如何修复python中不一致的return语句?

页面中文字增多,字号会突然变大

模块函数 vs 静态方法 vs 类方法 vs 无装饰器:哪个成语更 Pythonic?

JS做深度学习1——偶然发现与入门