【问题标题】:Python - i can't understand this errorPython - 我无法理解这个错误
【发布时间】:2014-04-18 13:33:12
【问题描述】:

我正在尝试编写一个程序,要求用户输入 4 个整数并打印输入的最大奇数。代码如下:

a = raw_input("Enter an int: ")
b = raw_input("Enter an int: ")
c = raw_input("Enter an int: ")
d = raw_input("Enter an int: ")

numbers = [a, b, c, d]
odd_numbers = []
print numbers
for i in numbers:
    if i%2!=0:
        odd_numbers.append(i)
    else:
        print "This is not an odd number."


for nums in odd_numbers:
    max_num = max(odd_numbers)
    print max_num

这是我收到的错误:

line 10, in <module>
  if i%2!=0:
TypeError: not all arguments converted during string formatting

我做错了什么?

【问题讨论】:

  • 试试这个 - a = input("输入一个整数:")
  • @TanveerAlam NO。永远不要在没有充分理由并且没有明确描述所有问题(如安全漏洞和性能问题)的情况下向初学者推荐 python2 的input。尤其是当有更好的替代方案没有任何这些问题时。这里正确的做法当然是简单的做int(raw_input("..."))
  • 您还应该解释为什么这与使用 raw_input @TanveerAlam 不同并将其作为答案,尽管我应该认为这是 stackoverflow.com/questions/4915361/… 的副本
  • 感谢 l4mpi 和 Paul。
  • 谢谢!将输入转换为 int 就可以了!

标签: python string formatting


【解决方案1】:

raw_input() 返回一个字符串。结果,numbers 列表变成了字符串列表。 % 操作行为取决于变量类型,如果是字符串,则为 string formatting 操作:

>>> s = "3"
>>> s % 2
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: not all arguments converted during string formatting

如果是int,它会给你一个division remainder

>>> n = 3
>>> n % 2
1

您需要将所有输入转换为int

a = int(raw_input("Enter an int: "))
b = int(raw_input("Enter an int: "))
c = int(raw_input("Enter an int: "))
d = int(raw_input("Enter an int: "))

为避免出现冗余代码,您可以使用list comprehension 简化填充numbers 列表:

numbers = [int(raw_input("Enter an int: ")) for _ in xrange(4)]

【讨论】:

    【解决方案2】:

    因为您输入的是string 将其转换为int

    >>> a =raw_input("Enter an int: ")
    Enter an int: 10
    >>> type(a)
    <type 'str'> 
    

    试试这个:

    a =int(raw_input("Enter an int: "))
    b = int(raw_input("Enter an int: "))
    c = int(raw_input("Enter an int: "))
    d = int(raw_input("Enter an int: "))
    

    for i in numbers:
        if int(i)%2!=0:
                 odd_numbers.append(i)
    

    你的输出应该是这样的:

    >>> 
    Enter an int: 10
    Enter an int: 20
    Enter an int: 20
    Enter an int: 50
    [10, 20, 20, 50]
    This is not an odd number.
    This is not an odd number.
    This is not an odd number.
    This is not an odd number.
    

    【讨论】:

      【解决方案3】:

      raw_input 将返回一个字符串。所以,numbers 中的每个元素都是类似字符串的

      numbers = ["1", "2", "3", "4"]
      

      当您尝试i%2 时,python 将% 评估为string formatting operator,但在字符串中找不到任何用于格式化的占位符并引发错误。所以你必须将你的输入解析为int

      a = int(raw_input("Enter an int: "))
      

      或者您可以使用input,它会将您的输入评估为正确的类型(在您的情况下为int)

      a = input("Enter an int: ")
      

      但是如果你没有使用input的经验,不推荐使用eval,因为它states in the docs

      等效于 eval(raw_input(prompt))。

      此函数不会捕获用户错误。如果输入在语法上无效,则会引发 SyntaxError。如果评估期间出现错误,可能会引发其他异常。

      如果 readline 模块已加载,则 input() 将使用它来提供精细的行编辑和历史记录功能。

      考虑将 raw_input() 函数用于用户的一般输入。

      【讨论】:

        【解决方案4】:

        您输入字符串,但需要使用整数进行计算。 我你做print type(a) 例如你会看到你实际上有一个字符串作为输入。将其解析为 int 的方法是使用内置函数 int()

        a = raw_input("Enter an int: ")
        b = raw_input("Enter an int: ")
        c = raw_input("Enter an int: ")
        d = raw_input("Enter an int: ")
        
        numbers = [a, b, c, d]
        odd_numbers = []
        print numbers
        for i in numbers:
            value = int(i)
            if value%2!=0:
                odd_numbers.append(value)
            else:
                print "This is not an odd number."
        
        
        for nums in odd_numbers:
            max_num = max(odd_numbers)
            print max_num
        

        【讨论】:

          猜你喜欢
          • 2019-09-20
          • 2012-12-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-09-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多