TypeError:%支持的操作数类型:'范围'和' int'

时间:2018-05-20 07:18:14

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

编写一个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'

5 个答案:

答案 0 :(得分:2)

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

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

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

PS:我做x % 35 == 0因为“divisble by”和“multiples of”意思相同,因此35来自7*5

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

答案 1 :(得分:1)

你的老师喜欢它扭曲。可被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]

它可能要快得多,因为它只使用一个分区&amp;乘法,然后只有加法。

答案 2 :(得分:1)

我认为使用列表推导对于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]

答案 3 :(得分:0)

你要做的是将x定义为一系列数字,但这会使x成为一个数字列表,你仍然需要通过每个数字来检查它。因为&#34; for循环&#34;不允许使用while循环或从下限开始递归调用函数直到passable参数达到上限。

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

答案 4 :(得分:0)

我刚遇到一个非常相似的问题。如此相似,实际上,我想知道OP是否将问题写错了。在我的阅读中,挑战在于找到可以被7整除而不是被5整除的所有数字。这与简单地将问题减少到x%35有很大的不同。答案仍然是创建列表理解。这是对我有用的东西:

x =范围(2000,3201) num = [如果n%7 == 0且n%5!= 0,则x中的n为n]

完成后,只需打印(num)就可以得到答案。