在尝试使用字典在 python 中实现类似于 switch case 的场景时,我遇到了一个问题。
pos=(0,0)
move={'up':(pos[0],pos[1]+1),'dn':(pos[0],pos[1]-1)}
newpos=move['up']
pos=newpos
这正如预期的那样工作。但是当我做这样的事情时。
pos=(0,0)
move={'up':(pos[0],pos[1]+1),'dn':(pos[0],pos[1]-1)}
moves_list=['up','up','dn','dn']#or anything else for that matter
for mo in moves_list:
pos=move[mo]
print pos
这段代码应该给我最终的位置(0,0) 但是我得到 (0,-1)
我理解这是因为 move['up'] 和 move['down'] 的值是根据字典的定义计算的。 如果是这种情况,每当我需要定义计算密集型算法来查找下一个位置时,我都会浪费时间计算可能永远不会使用的移动。 例如。如果 move_list 只是 ['up,'up'] 则不需要计算 'dn'。
我的问题
有什么方法可以阻止这些值的计算,直到它们被实际调用为止?
在 python 中是否有更优雅的 switch-case 方法?
最佳答案
您通常会为各种“switch case”构建匿名函数。
匿名函数是使用lambda
创建的,并遵循语法lambda args: return_value
。
例如,这个函数接受一个数字作为输入并返回该数字加 1:
add_one = lambda x: x + 1
像这样的东西会起作用:
moves = {
'up': lambda (x,y): (x, y+1),
'dn': lambda (x,y): (x, y-1),
}
然后你可以采取行动:
pos = moves[move](pos)
请注意,将显式参数带入 lambda 函数通常是一个更好的主意。这允许更清晰和更可重用的代码。
关于Python 字典和选择大小写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25049523/