越来越多我意识到我的代码充满了if / else语句。最后,我开始编写单行(x = 'this' if y > 0 else 'that'
),在某些情况下,如果测试通常是真的,我认为它是从一开始的,只有在没有的情况下才会改变。例如:
从此
def increase_score(self, side)
if self.player.side == side:
self.enemy.score += 1
else:
self.player.score += 1
我会这样做
def increase_score(self, side)
# assume player.side is side
last_enemy_score = self.enemy.score
self.enemy.score += 1
# only change if player.side isn't side
if self.player.side != side:
self.enemy.score = last_enemy_score
self.player.score += 1
除了这两种方法之外,逐行if / else语句有哪些有趣的替代方法?
答案 0 :(得分:4)
我认为你忽略了一个简单的大逻辑。在这两种情况下,如果玩家player.side
与side
不同,则玩家“获胜”,否则敌人“获胜”。
为什么不使用它:
if self.player.side == side:
self.enemy.score += 1
else:
self.player.score += 1
编辑:下面的聪明选项
既然您要求替代方案,这里有一些也可以使用。但请注意,通常简单的可预测代码优于聪明的代码。
将二进制文件转换为整数(仅当您要添加0或1时才有效):
self.enemy.score += int(self.player.side == side)
self.player.score += int(self.player.side != side)
使用二进制文件从数组调用(仅适用于2个选项)。
winner = [self.player,self.enemy][self.player.side == side]
winner.score += 1
通过字典从字典中调用 - 如果您上下添加或希望某些播放器选项始终获胜,这将有效。
challenge = { ('left','left') : self.enemy,
('left','right') : self.player,
('right','right') : self.enemy,
('right','left') : self.player }
winner = challenge[(self.player.side,side)]
# OR safely assuming the enemy is the defualt winner
winner = challenge.get((self.player.side,side), self.enemy)
答案 1 :(得分:3)
使用dict
删除低级if
语句。
score = dict(left=0, right=0)
players = dict(left='Jack', right='Jill')
def increase_score(self, side):
score[side] += 1
查询任何玩家的得分非常容易,并找到他们当前的一方,当然增加得分现在是微不足道的。
再考虑一下这个问题,我们如何处理类似循环赛的事情,那里有很多竞争对手,但同时发生的游戏较少?在这里,我宁愿用玩家名称键入score
dict,然后在函数内部进行查找:
score = {'Jack':0, 'Jill':0, 'Jane':0}
current_players = dict(left='Jane', right='Jill')
def increase_score(self, side):
player_name = current_players[side]
score[player_name] += 1
词典仍然运作良好。
答案 2 :(得分:0)
我会认为你的第二种方法很危险!没有人(包括你在两个月内)将获得逻辑并理解你的代码。
有时,逻辑AND可以成为你的朋友:
if (self.player.side == 'left') and (side == 'left'): self.enemy.score += 1
if (self.player.side == 'left') and (side == 'right'): self.player.score += 1
if (self.player.side == 'right') and (side == 'left'): self.player.score += 1
if (self.player.side == 'right') and (side == 'right'): self.enemy.score += 1
看起来更整洁,逻辑清晰。