【问题标题】:How to accept something like '2.0' as an integer but eg '2.1' as float? Python如何接受像'2.0'这样的整数,但例如'2.1'作为浮点数? Python
【发布时间】:2014-10-18 05:30:44
【问题描述】:

我试图让用户在输入字母或非整数数字时收到一条错误消息,并且当输入整数时,程序将继续显示该整数的平方和立方。我的老师不希望代码中有任何“中断”或任何 ValueErrors。

print("Squaring and cubing integer program has started") #Introduction of program for user
UserNumber=input("Enter an integer to be raised to the power of 2 and 3: ") #Asks user to input an integer, that will then be raised to the power of 2 and 3
while '.' in UserNumber or UserNumber.isalpha(): #Error-trap to test if input contained letters of the alphabet or contains decimal point
  print("You have not entered an integer. Try again and enter an integer!") #Alert for user to inform that their entry was invalid (not an integer)
  UserNumber=input("Enter an integer to be raised to the power of 2 and 3: ")  #Asks user again to enter an integer, if they did not previously.
print(int(UserNumber), " is the integer you entered.") #Displays to user their inital integer
print(int(UserNumber), " squared is ", int(UserNumber)**2) #Displays to user their input integer squared
print(int(UserNumber), " cubed is ", int(UserNumber) **3 ) #Displays to user their input integer cubed
print("Calculations are now finished.") #Output to show program has ended

【问题讨论】:

  • 你的老师不希望你做pythonic的事情(try/except"EAFP" programming)并强迫你使用C风格的“LBYL”编码技术?这是一所什么样的学校?
  • 不,因为我们还没有学会它
  • 这个问题有 Python 2.7 和 Python 3.x 的标签。你用的是哪个版本?
  • 对不起最新的?哪个是我真的不知道。

标签: python python-2.7 python-3.x


【解决方案1】:

2.0 不是整数;它是一个浮动。 Python 中的float 类似于精度有限的标准 IEEE 754 浮点(如果平台支持 IEEE 754 浮点,那么 Python 可能会使用它)。 Python 中的整数具有无限精度(直到内存不足):

>>> i = 123456789012345678901234567890
>>> i ==  123456789012345678901234567890
True
>>> f = i * 1.0 # make it a float
>>> f.is_integer() # check whether it is a whole number
True
>>> f ==  123456789012345678901234567890
False

切勿混合使用 float 和 int ,除非您知道它不会改变您的情况下的结果,例如 2 == 2.0 但如示例所示,对于较大的数字它可能是错误的。

您的老师可能希望您找到.is_integer() 方法:

>>> 2.0 .is_integer()
True
>>> 2.1 .is_integer()
False

另请参阅,How to check if a float value is a whole number

要将'2.0' 转换为浮点数,您可以调用float() 函数:

#!/usr/bin/env python3
while True:
    try:
         f = float(input('Enter a number: '))
    except ValueError:
         print('Try again')
    else:
         break # got a number

这是在 Python 中从 stdin 获取数字的正确方法。如果您的老师禁止使用ValueErrorbreak,那么您可以使用正则表达式:
if re.match("^[+-]? *(\d+(\.\d*)?|\.\d+)([eE][+-]?\d+)?$", input_string):,它接受20e-1 == 2.0 == 2。见Extract float/double value

要测试输入是否不为空且仅包含十进制数字,即检查它是否为非负整数,如果调用int(input_string) 并捕获@987654339,则可以使用input_string.isdecimal() 方法@ 禁止。见How do I check if a string is a number in Python?

【讨论】:

    【解决方案2】:

    A) 我不想删除任何数字 B) 我想检查用户输入的不是整数、字母和小数(不是像 2.0、1.0 这样的小数,因为它们分别等于 2,1)

    根据你的描述,你可以使用re模块来实现你的工作:

    import re
    
    
    def is_integer(num):
        s = str(num)
        return re.match('^(-?\d+)(\.[0]*)?$', s) is not None
    
    
    print is_integer(1123123)  # True
    print is_integer(1123123.)  # True
    print is_integer(1123123.00000)  # True
    print is_integer(1123123.00100)  # False
    

    【讨论】:

      【解决方案3】:

      OP 的问题基于课堂作业。这个答案假设解决方案必须符合老师决定的规则。

      只需去掉尾随的零,然后去掉最后的小数点:

      UserNumber = UserNumber.rstrip('0').rstrip('.')
      

      将此行放在input 语句之后但在执行测试之前:

      print("Squaring and cubing integer program has started") #Introduction of program for user
      UserNumber=input("Enter an integer to be raised to the power of 2 and 3: ") #Asks user to input an integer, that will then be raised to the power of 2 and 3
      UserNumber = UserNumber.rstrip('0').rstrip('.')
      while '.' in UserNumber or UserNumber.isalpha(): #Error-trap to test if input contained letters of the alphabet or contains decimal point
          print("You have not entered an integer. Try again and enter an integer!") #Alert for user to inform that their entry was invalid (not an integer)
          UserNumber=input("Enter an integer to be raised to the power of 2 and 3: ")  #Asks user again to enter an integer, if they did not previously.
          UserNumber = UserNumber.rstrip('0').rstrip('.')
      print(int(UserNumber), " is the integer you entered.") #Displays to user their inital integer
      print(int(UserNumber), " squared is ", int(UserNumber)**2) #Displays to user their input integer squared
      print(int(UserNumber), " cubed is ", int(UserNumber) **3 ) #Displays to user their input integer cubed
      print("Calculations are now finished.") #Output to show program has ended
      

      【讨论】:

      • 你能把它合并到我的代码中吗?我对 python 还很陌生,所以不太了解......对此感到抱歉
      • 实际上由于某种原因在我输入例如一个字母之后,然后我在 2.0 中写入后,它说它不是整数。我该如何解决这个问题?
      • 我想知道是否有类似 .isfloat 代码的东西?
      • (A) 是否要删除所有字母?还是只是数字前面的字母? (B) 你想让isfloat 测试什么样的对象?测试数字看它们是浮点数还是整数?
      • A) 我不想删除任何数字 B) 我想检查用户输入的不是整数、字母和小数(不是像 2.0、1.0 这样的小数,因为它们等于 2 ,1 分别)。如果它是一个整数,输出将打印输入平方和立方的整数。但是如果用户输入字母或十进制数字,则会出现错误以输入整数,然后由他们决定是否输入整数。如果他们这样做,它将进行输出。如果他们不输入整数,错误将再次出现。希望这足够清楚
      【解决方案4】:
      x = 2.0
      try:
          x = int(x)
      except ValueError:
          pass
      return x
      

      这是 Python 中唯一可接受的方式,如果你的老师不理解异常,他就不应该教 Python 编程(老实说,他根本不应该教编程)

      【讨论】:

      • 我们还没学会。但是无论如何不使用 try/except 吗?
      • if x != int(x): print('Not an integer')
      • 不正确。它只是截断浮点数:int(2.1) == 2。如果您的意思是x = '2.0',那么为什么它会忽略异常并原样返回x
      猜你喜欢
      • 1970-01-01
      • 2015-09-17
      • 2011-04-24
      • 1970-01-01
      • 1970-01-01
      • 2020-03-31
      • 1970-01-01
      • 2021-10-20
      • 1970-01-01
      相关资源
      最近更新 更多