1

我越来越意识到我的代码充满了 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 语句?

4

3 回答 3

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) 
于 2013-09-17T23:20:10.353 回答
3

使用 adict摆脱低级if语句。

score = dict(left=0, right=0)
players = dict(left='Jack', right='Jill')

def increase_score(self, side):
    score[side] += 1

查询任何球员的得分非常容易,并找到他们当前的球队,当然增加得分现在是微不足道的。

再想一想,我们将如何处理像循环赛这样的比赛,其中有很多竞争对手,但在任何时候发生的比赛都很少?在这里,我宁愿score按玩家名称键入字典,然后在函数内部进行查找:

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

字典仍然很好用。

于 2013-09-17T23:31:27.503 回答
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

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

于 2013-09-17T23:36:11.707 回答