【问题标题】:Validating whether raw input is an integer and greater than zero simultaneously in Python在 Python 中同时验证原始输入是否为整数且大于零
【发布时间】:2016-12-26 04:52:10
【问题描述】:

我正在尝试完成一个程序,该程序将确定一个数字是否是素数。我正在尝试添加一段代码来验证用户输入是否既是整数,如果是,它是否是正整数。我希望它同时检查这两个,就像以前我先检查它是否是整数,然后检查数字是否为正数,但如果有人在第二次尝试时输入了一个字符串,则会导致错误。我的代码如下:

import math

def is_prime(integer):
    if integer < 2:
        return False
    elif integer == 2:
        return True
    elif not integer & 1:
        return False
    for x in range(3, int(integer**0.5) + 1, 2):
        if integer % x == 0:
            return False
    return True

while True:
    value = input("Please enter a positive integer: ")
    try:
        integer = int(value)
        if integer >= 0:
            break
        else:
            print("The integer must be positive, try again.")
    except ValueError:
        print("This is not an integer, try again.")

if is_prime(integer) == False:
    print "%d is not a prime number." % integer
if is_prime(integer) == True:
    print "%d is a prime number!" % integer

我正在尝试使用 while 循环告诉用户他们的输入无效,然后再次请求输入。有任何想法吗?谢谢!

编辑:如果我输入一个字符串,我会得到以下信息:

>>> python ex19.1.py
Please enter a positive integer: abcd
Traceback (most recent call last):
  File "ex19.1.py", line 16, in <module>
    value = input("Please enter a positive integer: ")
  File "<string>", line 1, in <module>
NameError: name 'abcd' is not defined

【问题讨论】:

  • 什么错误?始终在问题中添加 FULL 错误消息(Traceback)。可能我们可以解决仅看到错误消息的问题,但现在我们不能。 (而且我们懒得运行这段代码)。
  • 您的做法是绝对正确的,其他所有方法都只能归结为这一点。除此之外,最好将 if is_prime(integer) == False 替换为 if is_prime(integer) 并使用 if-else 而不是两个 if。

标签: python


【解决方案1】:

您必须使用raw_input() 而不是input(),因为Python 2 中的input() 尝试将输入的文本作为Python 代码执行。当您输入abcd 时,它会尝试在您的代码中查找变量abcd,但您会收到错误。

【讨论】:

    【解决方案2】:
    if not value.isdigit():
        print("This is not an integer, try again.")
    elif int(value) < 0:
        print("The integer must be positive, try again.")
    else:
        break
    

    【讨论】:

    • isnumeric() 不是仅适用于 Python 3 且仅适用于 Unicode 字符串吗?
    • @Ken 抱歉,我修好了
    • 另外,这个问题没有python-2.x标签,他使用的是input函数而不是raw_input函数。
    【解决方案3】:

    使用 raw_input()

    no  = raw_input("Enter a positive integer number")
    if no.isdigit() and int(no) >= 0:
        print "positive no"
    

    使用输入()

    no = input("Enter a positive integer number")
    if str(no).isdigit() and no >= 0:
        print "positive no"
    

    【讨论】:

      【解决方案4】:

      您可以使用函数isdigit 来检查字符串。该函数返回True是否仅由数字组成:

      >>> '123'.isdigit()
      True
      >>> '123qwe'.isdigit()
      False
      

      【讨论】:

        猜你喜欢
        • 2020-04-15
        • 1970-01-01
        • 2013-10-26
        • 2017-11-25
        • 2015-08-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多