【问题标题】:Python code skips if and elif down to elsePython 代码跳过 if 和 elif 到 else
【发布时间】:2016-08-26 13:58:04
【问题描述】:

每次编译这段代码时,我都希望它遍历每个“if,elif”,直到找到匹配项。所以它可以继续在屏幕上打印出给定的列表。

但令我惊讶的是,即使您输入“步枪”,它所做的只是给您“else”语句。

这是我在 Stackoverflow 上的第一篇文章,如有错误请见谅。

非常感谢任何帮助,在此先感谢。

rifles = ["Ak47", "M4A1", "Aug", "Famas", "Galil"]
pistols = ["Glock", "USP", "Deagle", "P250", "Five-7", "Tec-9"]
shotguns = ["Buckshot", "Benelli", "M1319", "Sawed-Off"]
snipers = ["AWP", "SSG", "Cheytac", "Barret", "M24"]
grenades = ["Smoke", "High-Explosive", "Flash", "Concussion", "Molotov", "Incendiary"]
knives = ["Bayonette", "Karambit", "Machete", "Butterfly", "Katana"]
equipment = ["Kevlar", "Helmet", "Tactical-Shield", "Boots", "Nightvision"]

raw_input = input("Search: ")


def search():

    if raw_input == "Rifles":
        for ri in rifles:

            print(ri)
            break
    elif raw_input is "Pistols":
        for pi in pistols:

            print(pi)
            break
    elif raw_input is "Shotguns":
        for sho in shotguns:

            print(sho)
            break
    elif raw_input is "Snipers":
        for sni in snipers:

            print(sni)
            break
    elif raw_input is "Grenades":
        for gre in grenades:

            print(gre)
            break
    elif raw_input is "Knives":
        for kni in knives:

            print(kni)

    elif raw_input is "Equipment":
        for equ in equipment:

            print(equ)
    else:

        print("Try again...")
    return
search()

【问题讨论】:

  • 你为什么改用is而不是==
  • 如果您输入“步枪”,它所做的只是给您“else”语句。 -- 这是因为代码需要“步枪”,而不是“步枪”
  • 我尝试同时输入“步枪”和“步枪”,== 和 is 相同(均未成功)
  • 你可能想看看Difference between is and ==
  • 完成了,再次感谢板球!

标签: python python-3.5


【解决方案1】:

您的代码可以用更简洁和“pythonic”的方式表达:

guns = {
    "rifles"   : ["Ak47", "M4A1", "Aug", "Famas", "Galil"],
    "pistols"  : ["Glock", "USP", "Deagle", "P250", "Five-7", "Tec-9"],
    "shotguns" : ["Buckshot", "Benelli", "M1319", "Sawed-Off"],
    "snipers"  : ["AWP", "SSG", "Cheytac", "Barret", "M24"],
    "grenades" : ["Smoke", "High-Explosive", "Flash", "Concussion", "Molotov", "Incendiary"],
    "knives"   : ["Bayonette", "Karambit", "Machete", "Butterfly", "Katana"],
    "equipment": ["Kevlar", "Helmet", "Tactical-Shield", "Boots", "Nightvision"],
}

gun = raw_input("Search: ")
gun = gun.lower()

try:
    print guns[gun]
except KeyError:
    print "No gun of type %s" % gun

【讨论】:

  • 这看起来很有趣,应该补充一下,我用的是3.5 Python。
  • 要使用 Python 3.5 中的代码,您只需更改 input 即可获得 raw_inputprint (x),而不是 print x
  • 太棒了,我得到了编译,它确实看起来比以前使用的方法简单得多。但是,我希望拥有与之前相同的输出布局,其中 for 循环让所有字符串相互叠加。知道如何完成这项工作吗?
  • print guns[gun] 更改为for x in guns[gun]: print (x) 甚至print ("\n".join(guns[gun]))
  • Pablo 太棒了,这真是大开眼界!
【解决方案2】:

您只打印一个元素后就打破了每个循环。

if raw_input == "Rifles":
    for ri in rifles:
        print(ri)
        break

你真的不需要休息,所以当你输入“步枪”时摆脱它和it will work

【讨论】:

    【解决方案3】:

    但令我惊讶的是,即使您输入“步枪”,它所做的只是给您“else”语句。

    您的代码检查"Rifles",而不是"rifles"。如果希望两者比较相等,则需要对字母大小写进行规范化,例如,像这样:

    if raw_input.lower() == "rifles":
        for ri in rifles:
            ...
    

    【讨论】:

      猜你喜欢
      • 2017-05-03
      • 1970-01-01
      • 1970-01-01
      • 2017-07-03
      • 1970-01-01
      • 2017-11-27
      • 1970-01-01
      • 1970-01-01
      • 2022-01-25
      相关资源
      最近更新 更多