2016-12-09 99 views
-4

我有下面的代码,并试图缩短它。我试过使用while和for循环,但不能使它工作。我也在这里搜索了Stackoverflow,发现了枚举和循环循环,但不断发现错误或者一般不知道我在做什么。有什么方法可以缩短这个吗?我可以使用循环缩短我的代码吗?

我唱python 3.2 pygame兼容版本和idlex。

players = [npc1,npc2,npc3,human] # these are classes 

# sets new order of players after being mixed 
first_player = players[0] 
second_player = players[1] 
third_player = players[2] 
fourth_player = players[3] 

# sets players prey...goes one ahead in the index, wrap around at end 
first_players_prey = players[1] 
second_players_prey = players[2] 
third_players_prey = players[3] 
fourth_players_prey = players[0] 

# sets players predator, goes back one in the index, wrap around 
first_players_predator = players[3] 
second_players_predator = players[0] 
third_players_predator = players[1] 
fourth_players_predator = players[2] 

# sets players grand prey/predator while only 4 players, goes 2 ahead/back in index, wrap around 
first_players_grand_prey_predator = players[2] 
second_players_grand_prey_predator = players[3] 
third_players_grand_prey_predator = players[0] 
fourth_players_grand_prey_predator = players[1] 
+1

当你创建16个单独的变量时,没有可靠的方法可以循环缩短代码。 –

回答

0

尽管非常规,exec函数可以用来完成你以后的事情。 (我还不太擅长Python,可能有更好的方法)我在我写的一个类中使用了类似的方法。列表可以保存first的值,但可以保存到fourth,然后是不同角色的名称。这可以用来在几行内重新创建你的代码。

numbers = ['first', 'second', 'third', 'fourth'] 
roles = ['', '_prey', '_predator', '_grand_prey_predator'] 
values = [0, 1, 2, 3] 

for i in range(4): 
    for j in range(4): 
     exec(numbers[j] + '_player' + roles[i] + ' = players[' + str(values[j]) + ']') 
    values = values[1:4] + values[:1] 

我希望这能回答你的问题。

+0

我无法得到这项工作或不明白它....感谢反正 –

+0

如果你创建一个新的python文件,粘贴这个代码并更改exec打印你会看到它是如何工作的 –

+1

请记住,使用' exec'是_ [“比简单地调用常规Python代码慢得多”,并强烈要求你永远不要使用它)(https://late.am/post/2012/04/30/the-exec-statement-and-a -python-mystery.html)_。如果它曾经执行过来自用户的输入,它也可能是危险的。解释器不会检测到名称,因此所有代码都必须在整个程序中记住,而不需要自动完成。该函数应该用作最后的手段,并且_ [“您应该总是首先查看替代方法”](http://stackoverflow.com/a/701813/6486738)_。 –

0

您可以通过创建词典列表来缩短它。该列表包含玩家第一名在列表中的玩家,第四名玩家为最后一名玩家。每个玩家被定义为一个字典,其类别,猎物,大猎物和捕食者。

classes = ['npc1', 'npc2', 'npc3', 'human'] # These are classes 
players = [] 
for i in range(4): 
    players.append(
     { 
      'class': classes[i], 
      'prey': classes[(i + 1) % 4], 
      'grand prey': classes[(i + 2) % 4], 
      'predator': classes[(i + 3) % 4] 
     } 
    ) 

这甚至可以进一步缩短到两路

classes = ['npc1', 'npc2', 'npc3', 'human'] # these are classes 
players = [{'class': classes[i], 'prey': classes[(i + 1) % 4], 'grand prey': classes[(i + 2) % 4], 'predator': classes[(i + 3) % 4]} for i in range(4)] 

但可能是将其推至远。最好是将代码延伸到多行,并且可读性比反之亦然。