【问题标题】:TypeError: unsupported operand type(s) for %: 'range' and 'int'类型错误:不支持的操作数类型为 %:'range' 和 'int'
【发布时间】:2018-05-20 07:18:13
【问题描述】:

编写一个 Python 程序来查找 120 到 200 之间可以被 7 和 5 的倍数整除的数字,而无需使用“for 循环”。

我试着用这种方式解决它......

x = range(120, 200)
if x % 7 == 0 and x % 5 == 0:
    print(x)

但我确实得到了这个错误。我会错过什么?

Traceback (most recent call last):
File "C:\Users\User\Desktop\skillshare-code\if else statements\4.py", line 
    11, in <module>
if x % 7 == 0 and x % 5 == 0:
TypeError: unsupported operand type(s) for %: 'range' and 'int'

【问题讨论】:

  • 您需要遍历x 中的所有值,但不允许使用for 构造
  • “我会错过什么?” % 仅适用于单个数字,您正在尝试将其用于一系列数字。
  • 如果你给它们一个可迭代的对象,大多数操作不会自动循环。
  • “可以被 7 和 5 的倍数整除”:你的老师很有幽默感(和头脑风暴 :))
  • @Jean-FrançoisFabre 我盯着这个问题想了很久,他的意思是 35 岁吗?哈哈

标签: python python-3.x if-statement range


【解决方案1】:

由于不允许使用 for 构造,您可以使用 filter 方法完成此操作:

valid_nums = filter(lambda x: x % 35 == 0, range(120, 200))

请注意,问题不是要求您打印数字,而是“找到”它们,这意味着创建某种形式的列表或有效值的集合

PS:我之所以选择x % 35 == 0,是因为“除数”和“倍数”的含义相同,所以 35 来自 7*5

PPS:filter 返回一个过滤器对象,它是一个生成器。如果您想通过list(valid_nums) 查看列表,则需要将其转换为列表。如果您只需要遍历值并将它们用于其他用途,则无需进行转换,因为生成器可以正常工作

【讨论】:

  • 这可能是(邪恶的)老师的想法。您可以解释 35,并注意 filter 需要在 python 3 中迭代(例如将其包装到 list),否则它只会返回一个生成器。
【解决方案2】:

你的老师喜欢扭曲。能被 7 和 5 的倍数整除意味着能被 7 和 5 整除,所以 35...

您的原始代码需要一个循环。但是 python 有内置函数,可以在没有 forwhile 语句的情况下生成循环(它们比 forwhile 快​​得多,因为它们通常使用本机编译的 C 代码)

sshashank124 给出了一个很好的答案,但可以通过以下方式进一步简化:

  • 通过在下一个 35 的倍数上“对齐”120 来选择正确的 range 起点
  • range 中使用 35 步

像这样:

>>> list(range(((120//35)+1)*35,200,35))
[140, 175]

它可能更快,因为它只使用一次除法和乘法,然后只使用加法。

【讨论】:

    【解决方案3】:

    我认为对于 Python,使用列表推导比 filter 更惯用(当然,如果你被允许的话)。

    x = range(120, 200)
    valid_nums = [num for num in x if num % 35 == 0]
    

    或在创作时:

    valid_nums = [num for num in range(120, 200) if num % 35 == 0]
    

    【讨论】:

    • 但它使用for 循环inside列表理解。
    • @Jean-FrançoisFabre 不是 Python for 循环。内部过滤器也使用循环。
    【解决方案4】:

    您要做的是将 x 定义为一个数字范围,但这会使 x 成为一个数字列表,您仍然需要检查每个数字来检查它。由于不允许“for循环”,因此可以使用while循环或从下限开始递归调用函数,直到可传递参数达到上限。

    def func(x):
           if (condition satisfied):
                print(x)
           if x<upper_limit:
                func(x+1)
           return
    

    【讨论】:

      【解决方案5】:

      我的阅读挑战之一是找到一个范围内可以被 7 整除但不能被 5 整除的所有数字。

      这与简单地将问题简化为x % 35 非常不同。尽管如此,创建一个列表理解是答案。

      这对我有用:

      x = range(2000, 3201)
      num = [n for n in x if n % 7 == 0 and n % 5 != 0]
      

      完成后,只需 print(num) 即可获得答案。

      【讨论】:

        猜你喜欢
        • 2022-11-14
        • 2018-09-01
        • 2013-10-04
        • 2021-06-16
        • 2014-06-16
        • 2014-03-16
        • 2020-08-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多