如何用更简洁的内容替换所有这些“if...elif...else”语句?

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)

FLA*_*OSO 7

我建议您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)


Sam*_*ord 6

这段代码中有如此多冗余的根本原因是您必须管理大量变量。

每当你有一堆单独的变量都保存相同类型的数据时,比如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)