逐行if / else语句有哪些有趣的替代方案?

时间:2013-09-17 23:13:05

标签: python if-statement

越来越多我意识到我的代码充满了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语句有哪些有趣的替代方法?

3 个答案:

答案 0 :(得分:4)

我认为你忽略了一个简单的大逻辑。在这两种情况下,如果玩家player.sideside不同,则玩家“获胜”,否则敌人“获胜”。

为什么不使用它:

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

看起来更整洁,逻辑清晰。