我在尝试运行脚本时遇到这个奇怪的错误,代码似乎是正确的但似乎python(3)不喜欢这部分:
def function(x):
if integer:
return int(x)
else:
return x
non_nil = randrange(21)
d = dict([(randrange(101), Racional(coeff(randrange(-20,20)),
coeff(choice(range(-30,0)+\
range(1,30)))))
for k in range(non_nil)])
我收到以下错误:
for k in range(non_nil)]) unsupported operand type(s) for +: 'range' and 'range'
我已经尝试将最后四行放在一行中,但python返回相同的错误。
答案 0 :(得分:18)
这是因为Python 3 range
没有像Python 2那样返回list
。这段代码是为Python 2编写的。
此代码应更改:
range(-30,0) + range(1,30)
应该改为:
list(range(-30,0)) + list(range(1,30))
答案 1 :(得分:1)
正如其他人指出的那样,问题是在Python 3中,range()
返回的迭代器不像Python 2中那样返回列表。
这里有一个解决方法:添加类似以下功能的内容:
def non_zero_range(lower, upper):
ret = list(range(lower, upper))
ret.remove(0)
return ret
然后从:
更改第二个Racional()
调用参数
coeff(choice(range(-30,0)+range(1,30)))
简单地说:
coeff(choice(non_zero_range(-30,30)))
你将拥有适用于Python 2和3的东西。
答案 2 :(得分:0)
在表达式中间,您执行range(-30,0) + range(1,30)
。这导致错误,因为在Python 3中range()
返回迭代器,而不是Python 2.x中的列表。
实现此功能的一种方法是在添加前将每个范围转换为列表:
d = dict([(randrange(101), Racional(coeff(randrange(-20,20)),
coeff(choice(list(range(-30,0))+
list(range(1,30))))))
for k in range(non_nil)])
由于您似乎只想从0
中排除range(-30, 30)
,因此您也可以使用filter(None, range(-30, 30))
。
或者您可以使用choice((1, -1)) * choice(range(1, 30))
,相当于choice(list(range(-30, 0)) + list(range(1, 30)))
。 (编辑:实际上先前的表达式在可能性中不包括-30,不确定这是否是一个问题。)
答案 3 :(得分:0)
正如其他答案所说,range()
是一个迭代器是你的问题,但是,更简单(在我看来)解决方案是生成从-30
到30
的列表然后删除0
,而不是避免它:
choice([i for i in range(-30, 30) if i != 0])
当然,如果你的范围更加不同,这可能会变得笨拙。