Python-不支持的类型:范围和范围

Python-不支持的类型:范围和范围,python,range,operand,Python,Range,Operand,我在尝试运行脚本时遇到了一个奇怪的错误,代码似乎是正确的,但python(3)似乎不喜欢这一部分: def function(x): if integer: return int(x) else: return x non_nil = randrange(21) d = dict([(

我在尝试运行脚本时遇到了一个奇怪的错误,代码似乎是正确的,但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返回相同的错误。

这是因为python 3
范围
与python 2不同,它不返回
列表。这段代码是为Python2编写的

应更改此代码:

range(-30,0) + range(1,30)
应改为:

[*range(-30,0), *range(1,30)]
在Python 3.5(2015)之前,您不能在列表中使用
*
,必须以这种方式编写(或者您可能更喜欢这种方式):


在表达式中间执行
range(-30,0)+range(1,30)
。这导致了错误,因为在Python3中
range()
返回一个迭代器,而不是像Python2.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
范围(-30,30)
中排除,因此也可以使用
过滤器(无,范围(-30,30))


或者,您可以使用
choice((1,-1))*choice(范围(1,30))
,这相当于
choice(列表(范围(-30,0))+list(范围(1,30))
。(edit:实际上前面的表达式在可能性中不包含-30,不确定这是否是一个问题)。

正如其他答案所说,
range()
作为迭代器是您的问题,但是,在我看来更简单解决方案是将列表从
-30
生成到
30
,然后删除
0
,而不是避开它:

choice([i for i in range(-30, 30) if i != 0])

当然,如果您的范围更不相同,这可能会变得很麻烦。

正如其他人指出的,问题是在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)))

您将拥有在Python2和Python3中都能工作的东西。

范围(-30,0)+范围(1,30)
的意图是什么?为什么不
范围(-30,30)
?@Lattyware:范围显然不应该包括0。我怎么没看到呢?那就不管了。
coeff(choice(non_zero_range(-30,30)))