如何查找输入数据的数据类型

时间:2019-01-17 07:37:20

标签: python python-3.x

我是python的新手,我的程序是一个简单的加法程序,它可以添加用户输入的任何数字(int或float),并且循环在输入q时停止。现在的问题是,每次输入一些数字然后输入q停止时,我都会不断得到"ValueError"

我已经使用eval()函数来确定输入的输入数据的数据类型。而且我在无限的while循环中添加了加法,该循环在输入q时中断。

这是我的代码:

sum,sum_i,c=0,0,0
sum_f=0.0

print("Enter q/Q to stop entering numbers.")
while True:
    a=input("Enter number: ")
    try:
        t= eval(a)
        print(type(t))
    except (NameError, ValueError):
        pass

    if(type(t)==int):
        sum_i=sum_i+int(a)
        c=c+1

    elif(type(t)==float):
        sum_f=sum_f+float(a)
        c=c+1

    elif (type(t)==str):
        if (a=='q'or a=='Q'):
            break

    else:
            print("Invalid data entered. Please enter a number to add or q/Q to quit. ")

sum= sum_i+ sum_f
print("You have entered ",c," numbers and their sum is: ",sum)

我的输出应该提供输入q时输入的数字的总和,但这就是我得到的:

Enter q/Q to stop entering numbers.
Enter number: 3
<class 'int'>
Enter number: 5.5
<class 'float'>
Enter number: 12
<class 'int'>
Enter number: q
Traceback (most recent call last):
  File "/home/netvarth/py test/sum.py", line 14, in <module>
    sum_i=sum_i+int(a)
ValueError: invalid literal for int() with base 10: 'q'

3 个答案:

答案 0 :(得分:2)

这是使用嵌套#!/usr/bin/env python3 nums = list() while True: # Usability tweak: Trim surrounding whitespace a = input("Enter number: ").strip() try: t = int(a) except ValueError: try: t = float(a) except ValueError: if a in ('q', 'Q'): break print("Invalid data entered. Please enter a number or q/Q to quit.") continue nums.append(t) print("You have entered {0} numbers and their sum is {1}".format( len(nums), sum(nums))) 进行的重构,它可以更简洁,更Python化地解决该问题。

image.file.attach best_photo.file.blob

答案 1 :(得分:1)

两件事:首先要检查某种类型的东西,它更像是pythonian

   isinstance(t, int)

但是第二件事是您的代码失败了。

如果您评估文字,则很可能会出现名称错误,因为该变量未在任何地方定义。但是,例如,如果您输入“ c”,您将得到完全奇怪的东西。由于定义了变量c,因此不会出现名称错误,但是在将文字'c'转换为int时仍然会失败。

您可以使用正则表达式检查输入的内容是否为数字

例如这样的

    if re.match('(\d+(\.\d+)?)', a):
        try:
            t = eval(a)
            print(type(t))
        except (NameError, ValueError):
            pass
    elif a == 'q' or a == 'Q':
        break
    else:
        continue

    if isinstance(t, int):
        sum_i = sum_i + int(a)
        c = c + 1

    elif isinstance(t, float):
        sum_f = sum_f + float(a)
        c = c + 1
    else:
        print("Invalid data entered. Please enter a number to add or q/Q to quit. ")

答案 2 :(得分:0)

您的问题是使用eval。如果它不能将字符串解析为变量,它将失败,但是在您的情况下,名称空间中已经有一个t浮动。 t保持它的旧身份为int类型,但随后您尝试将a(字符串)添加到数字中。

此代码应该有效:

sum,sum_i,c=0,0,0
sum_f=0.0

print("Enter q/Q to stop entering numbers.")
while True:
    a=input("Enter number: ")
    try:
        t = int(a)
        sum_i=sum_i+int(a)
        c=c+1
        print(type(t))
        continue
    except ValueError:
        pass

    try:
        t = float(a)
        sum_f=sum_f+int(a)
        c=c+1
        print(type(t))
        continue
    except ValueError:
        pass

    try:
        if (a=='q'or a=='Q'):
            break
        else:
            print("Invalid data entered. Please enter a number to add or q/Q to quit. ")
            continue
    except ValueError:
        pass
sum= sum_i+ sum_f
print("You have entered ",c," numbers and their sum is: ",sum)