将代码存储在列表或字典中?

时间:2015-08-15 21:31:29

标签: python events dictionary

有没有一种方法可以将代码存储在if..elif或要运行的字典中,而不是长list?类似的东西:

my_dict = {'up': 'y=y+1', 'down': 'y=y-1', 'left': 'x=x-1', 'right': x=x+1'}

然后您将选项与dict匹配并运行结果?

或者是条件表达式传统if..elif链的下一个最佳选择:

x = x+1 if choice == 'right' else x-1 if choice == 'left' else x
y = y+1 if choice == 'up' else y-1 if choice == 'down' else y

除了纯粹的好奇之外,我要问的部分原因是我在Pygame中编写游戏以帮助学习Python编码。我有12个按键,我正在检查是否被按下了,而且我正在使用一个非常长且笨拙的if..elif结构,这让我觉得必须有一个更漂亮的方式来做。基本上我的看法是这样的:

for event in pygame.event.get():
        if event.type == pygame.QUIT:
            crashed = True
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_t:
                red += 10
            elif event.key == pygame.K_g:
                red -= 10
            elif event.key == pygame.K_5:
                red += 1
            elif event.key == pygame.K_b:
                red -= 1
            elif event.key == pygame.K_y:
                green += 10
            elif event.key == pygame.K_h:
                green -= 10
            elif event.key == pygame.K_6:
                green += 1
            elif event.key == pygame.K_n:
                green -= 1
            elif event.key == pygame.K_u:
                blue += 10
            elif event.key == pygame.K_j:
                blue -= 10
            elif event.key == pygame.K_7:
                blue += 1
            elif event.key == pygame.K_m:
                blue -= 1

这是我的Python代码应该的样子吗?或者有更多的Pythonic方法来编码吗?

1 个答案:

答案 0 :(得分:1)

是的,有一种方法,但通过使用功能:

def up():
    y=y+1

def down():
    y=y-1

def left():
    x=x-1

def right():
    x=x+1


d = {'up': up, 'down': down, 'left': left, 'right': right};

然后将其称为d['up']()

为避免使用全局变量,您可以使用OOP方法:

class player:
    def __init__(self, x=0, y=0):
       self.x = x
       self.y = y

    def up(self):
        self.y += 1

    def down(self):
        self.y -= 1

    def left(self):
        self.x -= 1

    def right(self):
        self.x += 1

    def move(self, direction):
        # call the appropriate method that corresponds to given direction
        getattr(self, direction)()

使用示例:

p = player(0,0)
p.move('up') # and so on..