Python 仅从用户获取整数

Python 仅从用户获取整数,python,python-3.x,Python,Python 3.x,我正在看CS50的python讲座。David J Malan编写了一个程序,从用户那里获取一个正整数。在这里,他使用CS50 python库中编写的一个名为get_int()的函数。 我正在努力模仿他 def main(): num = get_int("Enter an integer") print(num) def get_int(prompt): i =(input(prompt)) try: i = int(i) i

我正在看CS50的python讲座。David J Malan编写了一个程序,从用户那里获取一个正整数。在这里,他使用CS50 python库中编写的一个名为get_int()的函数。 我正在努力模仿他

def main():
    num = get_int("Enter an integer")
    print(num)


def get_int(prompt):
    i =(input(prompt))
    try:
        i = int(i)
        if type(i) == int:                      
            return i
    except ValueError:
        return "not an integer"


if __name__ == "__main__":
    main()
我必须使用程序中返回的值获取正整数

 from get_int import get_int   

 def main():
     i = get_positive_int("Positive integer please")
     print(i)

 def get_positive_int(prompt):
     while True:
         n = get_int(prompt)
         if(n>=1):      # problem here if user enters anything else than int
             break
      return n


 if __name__ == "__main__":
     main()
因此,如何编写更好的get_int(),以避免出现错误:

TypeError: '>=' not supported between instances of 'str' and 'int'

您可以大大简化该代码。另外,
None
通常用于表示缺少/失败的值,因此您应该返回该值,而不是字符串“nota integer”。下面是一个实现方法的示例:

def get_int(s):
    try:
        return int(s)
    except ValueError:
        return None       # Can also just use pass to signify an empty block

i = get_int(s)
if i is not None:
    print('Successful')

由于我希望在这个特定场景中使用get_positive_int程序中的get_int()方法,因此我添加了try块来get_positive_int.python。 同样在get_int()中,我添加了none,而不是返回“nota integer”

get_int.python 获取_正数_int.python
我不熟悉Python版本的CS50库,但至少C版本的
get_int()
到目前为止还没有找到答案:在输入无效的情况下,
get_int()
重新向用户询问另一个输入,反复循环,直到给出有效的输入

因此,要真正模仿这种行为:

def get_int(提示):
尽管如此:
尝试:
返回int(输入(提示))
除值错误外:
通过
无需将
int(input())
赋值给
i
或任何对象。如果它没有引发异常,那么值是一个有效的整数,可以立即返回。不需要存在
i
,也不需要对
None
中的任何条件进行测试

我们所需要做的就是查看它是否引发了
ValueError
类型的异常,并且仅限于该类型,让其他异常冒泡到调用方


如果我们抓住了这个例外?只需
pass
,循环将重新开始并再次请求输入。

与其返回字符串“not a integer”,不如返回None(或不返回任何暗示返回None的内容),以表示某些代码失败。请说明原因,以便我从错误中吸取教训。我是python编程新手如果你用
returnnone
而不是
pass
,你就不需要解释性的注释了。我同意,但是使用pass感觉更好,而不是不必要地将returnnone指定为方法中的最后一行。虽然那只是我太挑剔了。无论哪种方法,使用pass隐式返回None,而不是实际使用
返回None
都是非常可怕的。我甚至认为让ValueError从函数中传播出去更好。我不认为这一讨论的范围对任何“非常可怕”的事情都没有任何意义,但如果人们对此有如此强烈的意见,我只会更新答案我同意@TomDalton:检查返回值是非常愚蠢的。要么某个操作正常,您的值已返回,要么发生了其他操作,引发了异常。要么处理异常(例如,重新提示问题),要么让它冒泡。但是不要隐藏异常并用无效的返回值替换它。函数值不应为状态或错误条件!这个
get_int
(从文件名开始,
.python
?)有一些问题。使用
int(i)
后,无需检查
i
的类型-它将是
int
,否则将引发异常。如果
失败,
是不可能的(如果失败了,你会返回什么?)而且,在Python中,我们很少需要检查类型。在少数情况下(这里没有),它没有使用
type
,最好使用
isinstance(obj,type)
,就像你的例子中的
如果isinstance(i,int)
def get_int(prompt):
    i =(input(prompt))
    try:
        i = int(i)
        if type(i) == int:                       
            return i
    except ValueError:
        return None
def get_positive_int(prompt):
    while True:
        n = get_int(prompt)
        try:
            if(n>=1):
                break
        except:
            print("not an integer")

   return n