【问题标题】:How can I read inputs as numbers?如何将输入读取为数字?
【发布时间】:2021-11-17 09:21:50
【问题描述】:

为什么在下面的代码中xy 是字符串而不是整数?

(注意:在 Python 2.x 中使用 raw_input()。在 Python 3.x 中使用 input()raw_input() 在 Python 3.x 中重命名为 input()

play = True

while play:

    x = input("Enter a number: ")
    y = input("Enter a number: ")

    print(x + y)
    print(x - y)
    print(x * y)
    print(x / y)
    print(x % y)

    if input("Play again? ") == "no":
        play = False

【问题讨论】:

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


【解决方案1】:

解决方案

从 Python 3 开始,input 返回一个字符串,您必须使用int 将其显式转换为ints,就像这样

x = int(input("Enter a number: "))
y = int(input("Enter a number: "))

您可以接受任何基数并使用int 函数将它们直接转换为以 10 为基数,就像这样

>>> data = int(input("Enter a number: "), 8)
Enter a number: 777
>>> data
511
>>> data = int(input("Enter a number: "), 16)
Enter a number: FFFF
>>> data
65535
>>> data = int(input("Enter a number: "), 2)
Enter a number: 10101010101
>>> data
1365

第二个参数告诉输入数字的基数,然后它在内部理解并转换它。如果输入的数据有误会抛出ValueError

>>> data = int(input("Enter a number: "), 2)
Enter a number: 1234
Traceback (most recent call last):
  File "<input>", line 1, in <module>
ValueError: invalid literal for int() with base 2: '1234'

对于可以包含小数部分的值,类型将是 float 而不是 int

x = float(input("Enter a number:"))

Python 2 和 3 之间的区别

总结

  • Python 2 的 input 函数评估接收到的数据,将其隐式转换为整数(阅读下一节以了解其含义),但 Python 3 的 input 函数不再这样做了。
  • Python 2 与 Python 3 的 input 等效的是 raw_input 函数。

Python 2.x

有两个函数可以获取用户输入,称为inputraw_input。它们之间的区别在于,raw_input 不评估数据并按原样以字符串形式返回。但是,input 将评估您输入的任何内容并返回评估结果。例如,

>>> import sys
>>> sys.version
'2.7.6 (default, Mar 22 2014, 22:59:56) \n[GCC 4.8.2]'
>>> data = input("Enter a number: ")
Enter a number: 5 + 17
>>> data, type(data)
(22, <type 'int'>)

评估数据5 + 17,结果为22。当它计算表达式5 + 17 时,它检测到您正在添加两个数字,因此结果也将是相同的int 类型。因此,类型转换是免费完成的,22 作为input 的结果返回并存储在data 变量中。您可以将input 视为由eval 调用组成的raw_input

>>> data = eval(raw_input("Enter a number: "))
Enter a number: 5 + 17
>>> data, type(data)
(22, <type 'int'>)

注意:在 Python 2.x 中使用 input 时应小心。我在this answer 中解释了为什么使用它时要小心。

但是,raw_input 不会评估输入并按原样返回字符串。

>>> import sys
>>> sys.version
'2.7.6 (default, Mar 22 2014, 22:59:56) \n[GCC 4.8.2]'
>>> data = raw_input("Enter a number: ")
Enter a number: 5 + 17
>>> data, type(data)
('5 + 17', <type 'str'>)

Python 3.x

Python 3.x 的 input 和 Python 2.x 的 raw_input 相似,raw_input 在 Python 3.x 中不可用。

>>> import sys
>>> sys.version
'3.4.0 (default, Apr 11 2014, 13:05:11) \n[GCC 4.8.2]'
>>> data = input("Enter a number: ")
Enter a number: 5 + 17
>>> data, type(data)
('5 + 17', <class 'str'>)

【讨论】:

  • 除了显式转换为 int 之外,还有什么其他方法,比如函数或其他东西,以便我们不需要在 3.x 中转换为 int 吗??
  • @ShreyanMehta eval 可以,但除非你有紧迫的原因,否则不要这样做。
  • @thefourtheye 至少使用ast.literal_eval。它没有eval的安全问题。
【解决方案2】:

在 Python 3.x 中,raw_input 已重命名为 input,而 Python 2.x 中的 input 已被删除。

这意味着,就像raw_input 一样,Python 3.x 中的input 总是返回一个字符串对象。

要解决此问题,您需要将这些输入明确地转换为整数,将它们放入int

x = int(input("Enter a number: "))
y = int(input("Enter a number: "))

【讨论】:

    【解决方案3】:

    对于一行中的多个整数,map 可能会更好。

    arr = map(int, raw_input().split())
    

    如果数字是已知的,(比如 2 个整数),你可以使用

    num1, num2 = map(int, raw_input().split())
    

    【讨论】:

      【解决方案4】:

      input() (Python 3) 和 raw_input() (Python 2)总是返回字符串。使用int() 将结果显式转换为整数。

      x = int(input("Enter a number: "))
      y = int(input("Enter a number: "))
      

      【讨论】:

        【解决方案5】:

        多个问题需要在一行中输入多个整数。最好的方法是一行一行地输入整个数字字符串,然后将它们拆分为整数。这是 Python 3 版本:

        a = []
        p = input()
        p = p.split()      
        for i in p:
            a.append(int(i))
        

        也可以使用列表推导

        p = input().split("whatever the seperator is")
        

        要将所有输入从 string 转换为 int,我们执行以下操作

        x = [int(i) for i in p]
        print(x, end=' ')
        

        应以直线打印列表元素。

        【讨论】:

          【解决方案6】:

          转换为整数:

          my_number = int(input("enter the number"))
          

          同样适用于浮点数:

          my_decimalnumber = float(input("enter the number"))
          

          【讨论】:

            【解决方案7】:
            n=int(input())
            for i in range(n):
                n=input()
                n=int(n)
                arr1=list(map(int,input().split()))
            

            for 循环应运行“n”次。第二个“n”是数组的长度。 最后一条语句将整数映射到一个列表并以空格分隔的形式接受输入。 你也可以在 for 循环结束时返回数组。

            【讨论】:

              【解决方案8】:

              我在解决CodeChef 上的一个问题时遇到了一个整数输入问题,其中两个整数 - 用空格分隔 - 应该从一行中读取。

              虽然int(input()) 足以处理单个整数,但我没有找到输入两个整数的直接方法。我试过这个:

              num = input()
              num1 = 0
              num2 = 0
              
              for i in range(len(num)):
                  if num[i] == ' ':
                      break
              
              num1 = int(num[:i])
              num2 = int(num[i+1:])
              

              现在我使用num1num2 作为整数。

              【讨论】:

              • 这看起来很有趣。但是,退出for 循环时,i 不是被破坏了吗?
              • @hosch250 退出循环时,索引变量的值(此处为i)保持不变。我试了一下,它工作正常。
              • 对于这种输入操作,你可以num1, num2 = map(int, input().split())如果你知道你会遇到多少整数,或者nums = list(map(int, input().split()))如果你不知道。
              【解决方案9】:
              def dbz():
                  try:
                      r = raw_input("Enter number:")
                      if r.isdigit():
                          i = int(raw_input("Enter divident:"))
                          d = int(r)/i
                          print "O/p is -:",d
                      else:
                          print "Not a number"
                  except Exception ,e:
                      print "Program halted incorrect data entered",type(e)
              dbz()
              
              Or 
              
              num = input("Enter Number:")#"input" will accept only numbers
              

              【讨论】:

                【解决方案10】:

                虽然在您的示例中,int(input(...)) 在任何情况下都可以解决问题,但 python-futurebuiltins.input 值得考虑,因为这可以确保您的代码适用于 Python 2 和 3禁用 Python2 的默认行为 input 试图“聪明”地处理输入数据类型(builtins.input 基本上只是表现得像 raw_input)。

                【讨论】:

                  猜你喜欢
                  相关资源
                  最近更新 更多