Cri*_*ian 1 python if-statement list python-3.x
有没有办法减少elif我的陈述中的内容?在另一个问题中,我问有人说我的代码存在冗余,而且确实如此。我对 python 和编码还比较陌生,当我查找内容时,它总是有点难以理解。
这是我正在讨论的代码块:
(如果需要的话我可以发布其余的代码)
if (random_mon_name.lower()=='normal'):
rangen_mon_name = random.choice(mon_name_type_NORMAL)
break
elif (random_mon_name.lower()=='fire'):
rangen_mon_name = random.choice(mon_name_type_FIRE)
break
elif (random_mon_name.lower()=='water'):
rangen_mon_name = random.choice(mon_name_type_WATER)
break
elif (random_mon_name.lower()=='grass'):
rangen_mon_name = random.choice(mon_name_type_GRASS)
break
elif (random_mon_name.lower()=='electric'):
rangen_mon_name = random.choice(mon_name_type_ELECTRIC)
break
elif (random_mon_name.lower()=='ice'):
rangen_mon_name = random.choice(mon_name_type_ICE)
break
elif (random_mon_name.lower()=='fighting'):
rangen_mon_name = random.choice(mon_name_type_FIGHTING)
break
elif (random_mon_name.lower()=='poison'):
rangen_mon_name = random.choice(mon_name_type_POISON)
break
elif (random_mon_name.lower()=='ground'):
rangen_mon_name = random.choice(mon_name_type_GROUND)
break
elif (random_mon_name.lower()=='flying'):
rangen_mon_name = random.choice(mon_name_type_FLYING)
break
elif (random_mon_name.lower()=='psychic'):
rangen_mon_name = random.choice(mon_name_type_PSYCHIC)
break
elif (random_mon_name.lower()=='bug'):
rangen_mon_name = random.choice(mon_name_type_BUG)
break
elif (random_mon_name.lower()=='ghost'):
rangen_mon_name = random.choice(mon_name_type_GHOST)
break
elif (random_mon_name.lower()=='rock'):
rangen_mon_name = random.choice(mon_name_type_ROCK)
break
elif (random_mon_name.lower()=='dark'):
rangen_mon_name = random.choice(mon_name_type_DARK)
break
elif (random_mon_name.lower()=='dragon'):
rangen_mon_name = random.choice(mon_name_type_DRAGON)
break
elif (random_mon_name.lower()=='steel'):
rangen_mon_name = random.choice(mon_name_type_STEEL)
break
elif (random_mon_name.lower()=='fairy'):
rangen_mon_name = random.choice(mon_name_type_FAIRY)
break
else:
print("You didn't actually enter a type.\nTry Again.")
Run Code Online (Sandbox Code Playgroud)
我建议您dict这样创建一个:
myDict = {}
myDict['ice'] = mon_name_type_ICE
# ...and so on
Run Code Online (Sandbox Code Playgroud)
这样您就可以使用一小段代码来访问它:
rangen_mon_name = random.choice(myDict[random_mon_name.lower()])
Run Code Online (Sandbox Code Playgroud)
您还可以添加try/except块来模拟您的else:
try:
rangen_mon_name = random.choice(myDict[random_mon_name.lower()])
except KeyError:
print("You didn't actually enter a type.\nTry Again.")
Run Code Online (Sandbox Code Playgroud)
这段代码中有如此多冗余的根本原因是您必须管理大量变量。
每当你有一堆单独的变量都保存相同类型的数据时,比如mon_name_type_FIREand mon_name_type_WATER(我假设这些是与该攻击类型相关的名称列表),这是一个强有力的线索,你应该将它们放入一个集合中,比如字典或列表。这不仅减少了代码中需要跟踪的变量数量,而且还可以动态访问这些值,而无需使用大量复制+粘贴代码。
例如,如果您将所有不同的mons 放入dict由攻击类型键入的 s 中,而不是创建所有mon_name_type_WHATEVER变量:
mon_by_type = {
"fire": ["charmander", "charmeleon", "charizard"],
"water": ["squirtle", "wartortle", "blastoise"],
# etc
}
Run Code Online (Sandbox Code Playgroud)
您现在可以用单个字典查找替换您的巨型if/链:elif
try:
random_mon = random.choice(mon_by_type[random_mon_name.lower()])
except KeyError:
print("You didn't actually enter a type. Try again.")
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
599 次 |
| 最近记录: |