【问题标题】:Clashing Strings and Integers冲突的字符串和整数
【发布时间】:2012-09-07 15:17:57
【问题描述】:

我遇到了一些麻烦,我已经完成了程序的这一部分,它按计划工作,它存储变量并成功检查所有验证,但我需要它来验证,以便只能输入数字.只要你按下一个字母键,程序就会崩溃。

我知道我需要在某个地方使用 selection.isdigit,我已经在几个不同的地方尝试过,但是当我把它放在看起来正确的地方时,程序崩溃了,因为 isdigit 只适用于字符串,并且给定程序中的数字验证,当他们尝试使用字符串时程序崩溃。有人可以帮帮我吗?

while True:
    if amountwanted > 0:                                                                               
        selection = int(input("What flavour pizza would you like? (1-12): "))                           
        if selection < 1 or selection > 12:                                                             
            print("You must enter a pizza between 1 and 12")                                            
            print("")
        else:
            if selection <= 7:                                                                          
                orderedstandardpizzas.append(selection)
            else:
                orderedgourmetpizzas.append(selection)                                                  
            amountwanted = amountwanted - 1                                                             
    else:                                                                                         
        break  

【问题讨论】:

  • 啊混蛋。我的代码似乎没有正确格式化。
  • 在任何代码行前添加 4 个空格
  • 我认为输入在这里是错误的功能;使用 raw_input,因为它不会 eval() 您输入的字符串

标签: string variables python-3.x integer digit


【解决方案1】:

您使用int() 会引发错误,因为它只接受可以被解释为数字的字符串。

您可以捕获异常而不是检查输入中的每个字符:

try:
    selection = int(input("What flavour pizza would you like? (1-12): "))
except ValueError:
    print "You must enter a number!"
    break

上面的 sn-p 替换了旧的 selection = ... 行,该行已缩进 4 个空格以匹配我插入的新 try/except 块。完整的代码如下:

while True:
    if amountwanted > 0:
        try:
            selection = int(input("What flavour pizza would you like? (1-12): "))
        except ValueError:
            print "You must enter a number!"
            break
        if selection < 1 or selection > 12:
            print("You must enter a pizza between 1 and 12")
            print("")
        else:
            if selection <= 7:
                orderedstandardpizzas.append(selection)
            else:
                orderedgourmetpizzas.append(selection)
            amountwanted = amountwanted - 1
     else:
        break

【讨论】:

  • 程序现在不存储任何内容,在放入 alpha 时给出错误消息,并跳到下一个模块/步骤。我是不是写错了?
  • @DanielNitschke:可能,是的。 :-) 我在这里只给你一个例子,替换你的selection = int(input(...)) 行。检查缩进,但最重要的是,阅读 Python 中的异常处理(try/except)。 :-)
【解决方案2】:

试试这个:

selection = raw_input("What flavour pizza would you like? (1-12): ");
if (selection.isdigit())
    numSelection = int(selection);
    if (numSelection < 1 or numSelection > 12:
        // carry on
    else:
        // else case
else:
    //print error message. Break out of loop here if required.

【讨论】:

  • 这是有效的,但是当输入不正确的字符时,如何让它给出错误消息?它只是重复了这个问题。
  • 任何人都可以扩展遗嘱点吗?这是迄今为止最好的。验证时出现错误消息?
  • @DanielNitschke 我在回答中添加了一些内容。
【解决方案3】:

考虑线

        selection = int(input("What flavour pizza would you like? (1-12): "))                

input(...) 函数根据用户的输入返回一个字符串;然后通过int(...) 将其转换为整数。 [正如其他人所指出的,3.x 中的 input 相当于 2.x 中的 raw_input。]

所以你基本上有两个选择。首先,您可以将非数字输入视为实际的错误,您可以捕获它,并在出现错误时使用continue 回到循环的开头:

try:
    selection = int(input("What flavour pizza would you like? (1-12): "))
except ValueError:
    print "Error message"
    continue

这可能是最合适的和 Pythonic 的策略。

相反,您可以检查输入是否确实由数字组成,尽管它比这更复杂一些,因为当前版本允许前后有空格,因此您可以执行类似的操作

    string_selection = input("What flavour pizza would you like? (1-12): ")
    if not string_selection.strip().isdigit():
        continue
    selection = int(string_selection)

但这更复杂!

【讨论】:

  • 不是 的原始输入
  • 哎呀,是的。 (我通常使用 2.x,而且几乎从不使用 input 或 raw_input!)
猜你喜欢
  • 2012-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多