【问题标题】:'For loop' not outputting correctly (always using 'else' of argument)'For循环'没有正确输出(总是使用'​​else'的参数)
【发布时间】:2021-03-22 00:14:07
【问题描述】:

我正在创建一个程序来重新创建 Pokemon TV/Anime 系列中的 Pokedex(以训练自己如何使用 Classes 和 tkinter 模块),但即使用户输入在 Pokedex 的数据库中。 意思是,如果用户的输入是 7,那么它应该使用类中的“显示”功能来显示 Pokedex 中的条目 7(这将是 Squirtle);像这样:“这是一只 Squirtle。Squirtle 高 0.5m,重 9kg。Squirtle 是水型,对 Grass & Electric 较弱。”但它并没有这样做,它只是总是打印“Pokedex 上找不到口袋妖怪”的错误消息。

如果我删除“for”循环的后半部分,搜索功能就会起作用,这意味着返回错误消息并允许用户输入另一个数字进行搜索。但是当我重新添加循环的错误消息部分时,即使它应该工作,它也总是显示错误消息。

代码如下:

class Pokemon:
    'Class base for all Pokemon inside the Pokedex'

    def __init__(self, pkdx_num, name, height, weight, type, weaknesses):
        self.pkdx_num = pkdx_num
        self.name = name
        self.height = height
        self.weight = weight
        self.type = type
        self.weaknesses = weaknesses

    def display(self):
        print(f"This is a {self.name}.")
        print(f"The {self.name} is {self.height} tall and weighs {self.weight}.")
        print(f"The {self.name} is a {self.type} type and is weak against {self.weaknesses}.")

#Pokedex Database
pkdx_1 = Pokemon(1, "Bulbasaur", "0.7m", "6.9kg", "Grass" "Poison", "Fire, Psychic, Flying & Ice")
pkdx_2 = Pokemon(2, "Ivysaur", "1m", "13kg", "Grass" "Poison", "Fire" "Psychic" "Flying" "Ice")
pkdx_3 = Pokemon(3, "Venusaur", "2m", "100kg", "Grass" "Poison", "Fire" "Psychic" "Flying" "Ice")
pkdx_4 = Pokemon(4, "Charmander", "0.6m", "8.5kg", "Fire", "Water, Ground & Rock")
pkdx_5 = Pokemon(5, "Charmeleon", "1.1m", "19kg", "Fire", "Water, Ground & Rock")
pkdx_6 = Pokemon(6, "Charizard", "1.7m", "90.5kg", "Fire", "Water, Ground & Rock")
pkdx_7 = Pokemon(7, "Squirtle", "0.5m", "9kg", "Water", "Grass & Electric")
pkdx_8 = Pokemon(8, "Wartortle", "1m", "22.5kg", "Water", "Grass & Electric")
pkdx_9 = Pokemon(9, "Blastoise", "1.6m", "85.5kg", "Water", "Grass & Electric")
pokedex = [pkdx_1, pkdx_2, pkdx_3, pkdx_4, pkdx_5, pkdx_6, pkdx_7, pkdx_8, pkdx_9]


#-Pokedex Search Debugging
#Pokemon.display(pkdx_7)
#pkdx_search = "7" #-Pokedex Search Function Debugger/Tester

pkdx_search = int(input("What Number in the Pokedex do you want to search? "))

for Pokemon in pokedex:
    if Pokemon.pkdx_num == pkdx_search:
        Pokemon.display()
        break
    else:
        print("Pokemon not found on Pokedex")
        break

【问题讨论】:

  • 你可以试试for p in pokedex,因为Pokemon(类)和Pokemon(迭代器)之间存在名称冲突
  • 老实说,这看起来像是字典的工作。

标签: python for-loop if-statement


【解决方案1】:

在代码中覆盖现有值/内置值(例如 typePokemon)是不好的。请审查。此外,您的else 中有一个break,它在第一个未找到的口袋妖怪后停止。删除 break 应该可以修复它。

另外,使用dict 代替列表将是一种更好的数据结构,您可以在这里使用:

pokedex = {p.pkdx_num: p for p in [pkdx_1, pkdx_2, pkdx_3, pkdx_4, pkdx_5, pkdx_6, pkdx_7, pkdx_8, pkdx_9]}

pkdx_search = int(input("What Number in the Pokedex do you want to search? "))

found_pokemon = pokedex.get(pxdx_search)

if found_pokemon:
    found_pokemon.display()
else:
    print("Pokemon not found on Pokedex")

【讨论】:

  • 当我删除第二个中断时,循环似乎会遍历每个类条目。所以如果我输入 7,那么它会打印 6 次“Pokemon not found”然后运行“显示”类函数?另外,我现在已将类中的“类型”更改为“元素类型”,因为我认为这就是您覆盖值的意思?
【解决方案2】:

对于 pokedex 中的 pokemon 从 pokemon 1bulbasur 开始。由于 pokemon 1bulbasor 不是 7(输入数字),所以执行 else。打印没有口袋妖怪,退出循环。

你想要的是:

poke_match = [pokemon for pokemon in pokedex if pokemon.pkdx_num==input]
#This are all pokemons that matched the search
if poke_match == []:
     #No pokemon found
else:
     poke_match[0] #is the pokemon match

【讨论】:

    【解决方案3】:

    这个任务看起来更适合字典,在 pokedex 中针对每个 pokemon 保留它们的位置似乎不正确,因为这不是 pokemon 本身的属性。

    pokedex={}    
    pokedex[1] = Pokemon("Bulbasaur", "0.7m", "6.9kg", "Grass" "Poison", "Fire, Psychic, Flying & Ice")
    pokedex[2] = Pokemon("Ivysaur", "1m", "13kg", "Grass" "Poison", "Fire" "Psychic" "Flying" "Ice")
    pokedex[3] = Pokemon("Venusaur", "2m", "100kg", "Grass" "Poison", "Fire" "Psychic" "Flying" "Ice")
    pokedex[4] = Pokemon("Charmander", "0.6m", "8.5kg", "Fire", "Water, Ground & Rock")
    pokedex[5] = Pokemon("Charmeleon", "1.1m", "19kg", "Fire", "Water, Ground & Rock")
    pokedex[6] = Pokemon("Charizard", "1.7m", "90.5kg", "Fire", "Water, Ground & Rock")
    pokedex[7] = Pokemon("Squirtle", "0.5m", "9kg", "Water", "Grass & Electric")
    pokedex[8] = Pokemon("Wartortle", "1m", "22.5kg", "Water", "Grass & Electric")
    pokedex[9] = Pokemon("Blastoise", "1.6m", "85.5kg", "Water", "Grass & Electric")
    
    pkdx_search = int(input("What Number in the Pokedex do you want to search? "))
    
    if pkdx_search in pokedex:
        pokedex[pkdx_search].display()
    
    

    【讨论】:

    • 会试一试。仍然是新事物,正在学习如何将所有这些东西混合成可用的程序。我想稍后添加用于从其他属性进行排序/搜索的功能,例如查找 Pokedex 中的每个“草”类型或所有 1m 高以下的口袋妖怪,我想我可以用字典来构建它?
    • 给口袋妖怪一个“属性”字典将是一个选项 {"Name":"Bulbasaur","height":0.4, etc.} 然后您可以动态查找属性。
    猜你喜欢
    • 1970-01-01
    • 2016-10-28
    • 1970-01-01
    • 2021-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-16
    相关资源
    最近更新 更多