【问题标题】:Error modulo between int and range?int和范围之间的错误模数?
【发布时间】:2018-12-30 15:32:55
【问题描述】:

我试图创建一个小程序来计算直到某个数字(输入)之前有多少个素数

def count_primes(num):
for i in range(num + 1):
    primes = [2]
    if i % range(2,i) != 0:
        primes.append(i)

return len(primes)

当我运行我的程序时,我得到了一个错误:

TypeError: unsupported operand type(s) for %: 'int' and 'range'

我不明白如何更正我的程序。

【问题讨论】:

  • 您认为i % range(2,i) 应该是什么?
  • 表示i % range(2,i) 没有意义。你不能用一个整数除以一个范围来找到余数。
  • 我认为您使用的是素筛分,但到目前为止不是正确的尝试。
  • ...也许你想要any(i%d for d in range(2,i))? Python 不会自动“矢量化”操作...

标签: python int range typeerror


【解决方案1】:

问题出在下面一行

i % range(2,i)

您要做的是在整数和范围之间应用模数。默认情况下未定义。

您可以通过重载__mod__(a, b) 来实现这一点。但是,默认情况下,您可以在两个 int 或 float 之间执行此操作。

【讨论】:

    【解决方案2】:

    问题从这里开始

    i % 范围(2,i)

    变量i 是一个整数。 range(2,i) 是列表还是生成器,取决于您使用的 python 版本。

    您无法获得将数字除以列表/函数的提醒。

    【讨论】:

      【解决方案3】:

      该错误告诉您不能将模运算符与 int 和 range 类型的操作数一起使用,这是有道理的。

      我认为列表理解可以帮助你,如果你不知道它是什么,维基百科可以帮助你理论 (https://en.wikipedia.org/wiki/List_comprehension) 和 Python.org 的实践 (https://docs.python.org/3/tutorial/datastructures.html#list-comprehensions)。

      你应该试试这个:

      def count_primes(num):
          primes=[]
          for i in range(2,num+1):
              if len([i%n for n in range(1,i+1) if i%n==0])==2:
                  primes.append(i)
          return len(primes)
      

      此代码使用列表推导来计算 i 的除数,如果该数字为 2,则将 i 附加到列表素数。

      【讨论】:

      • 但是,列表怎么会等于 0?怎么样?
      • 你说得对,我没有测试就回答得太快了抱歉,我刚刚编辑了我的答案,现在应该可以正常工作了,如果我的解释不清楚,请告诉我。
      猜你喜欢
      • 2016-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-01
      • 2020-02-07
      • 2019-04-05
      • 2021-03-28
      相关资源
      最近更新 更多