10

スクリプトを実行しようとすると、この奇妙なエラーが発生します。コードは正しいように見えますが、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'

最後の 4 行を 1 行にまとめようとしましたが、python は同じエラーを返します。

4

4 に答える 4

33

これは、Python 2 とは異なり、Python 3rangeが a を返さないためlistです。このコードは Python 2 用に書かれています。

このコードは次のように変更する必要があります。

range(-30,0) + range(1,30)

次のように変更する必要があります。

[*range(-30,0), *range(1,30)]

Python 3.5 (2015, PEP 448 - Additional Unpacking Generalizations ) より前では、リスト内で使用することはできず*、代わりに次のように記述する必要があります (または、これを好む場合があります)。

list(range(-30,0)) + list(range(1,30))
于 2012-11-10T00:49:56.480 に答える
1

他の人が指摘しているように、問題は Python 3 ではrange()、Python 2 のようにリストではなくイテレータを返すことです。

1 つの回避策: 次の関数のようなものを追加します。

def non_zero_range(lower, upper):
    ret = list(range(lower, upper))
    ret.remove(0)
    return ret

次に、2 番目のRacional()呼び出し引数を次のように変更します。

coeff(choice(range(-30,0)+range(1,30)))

簡単に:

coeff(choice(non_zero_range(-30,30)))

Python 2 と 3 の両方で動作するものがあります。

于 2012-11-10T03:32:36.567 に答える
0

他の答えが言ったようrange()に、イテレータであることはあなたの問題ですが、より簡単な(私の見解では)解決策は、それを回避するのではなく、リストを生成してから削除すること-30です300

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

当然のことながら、範囲がさらにばらばらである場合、これは扱いにくくなる可能性があります。

于 2012-11-10T00:55:29.920 に答える
0

表現の途中でrange(-30,0) + range(1,30). range()Python 3では、Python 2.x のようなリストではなくイテレータを返すため、これがエラーの原因となっています。

これを機能させる 1 つの方法は、追加する前に各範囲をリストに変換することです。

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が含まれていません。それが問題かどうかはわかりません)。

于 2012-11-10T00:50:05.680 に答える