Python中对range对象取余触发TypeError错误的原因是什么?
报错原因
range是Python内置的惰性序列类型,本身仅存储起始值、终止值、步长三个核心参数,不会预先生成所有序列元素,官方没有为该类型定义和整数执行取余(%)运算的逻辑,因此直接对整个range对象和整数做取余操作会触发类型不支持的报错。- 你代码中
(range(1,n))%2!=0的写法是想直接过滤出range里的奇数,这个语法不成立,运算符不能跨不支持的类型执行运算。
正确实现方式
有两种常见的修改方案:
方案1:调整range步长(性能最优)
直接把range的步长设为2,从1开始就可以直接生成所有奇数序列,不需要额外过滤:
n = int(input()) for x in range(1, n, 2): if x % 3 == 0 and x % 5 == 0: print("SoloLearn") elif x % 3 == 0: print("Solo") elif x % 5 == 0: print("Learn")
方案2:用生成器表达式自定义过滤
如果过滤规则更复杂,可以遍历range的每个元素做判断筛选:
n = int(input()) for x in (i for i in range(1, n) if i % 2 != 0): if x % 3 == 0 and x % 5 == 0: print("SoloLearn") elif x % 3 == 0: print("Solo") elif x % 5 == 0: print("Learn")
内容的提问来源于stack exchange,提问作者Musa Khan
相关产品推荐
相关产品推荐

