在尝试使用字典在python中实现类似场景的切换案例时,我遇到了一个问题。
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)
我理解这是因为移动[' up']和移动[' down']的值是根据字典的定义计算的。 如果是这种情况,每当我需要定义用于查找下一个位置的计算密集型算法时,我将浪费时间来计算可能永远不会使用的移动。 例如。如果move_list只是[' up,' up']那么' dn'不需要计算。
我的问题
在实际调用这些值之前,有什么方法可以阻止这些值的计算吗?
在python中使用switch-case有更优雅的方法吗?
答案 0 :(得分:3)
您通常会为各种“切换案例”构建匿名函数。
使用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函数通常是个更好的主意。这样可以获得更清晰,更可重用的代码。