1

リスト内包表記を作成するための map、reduce、filter 関数があります。

これらの各関数に引数を渡すこととxrange引数を渡すことの違いは何ですか? 例えば:range

map(someFunc, range(1,11))

また

map(someFunc,xrange(1,11))
4

3 に答える 3

4

Python 2 ではrange、実際のリストをxrange返し、反復可能な生成関数を返します。シーケンスを反復することのみを気にするため、メモリの使用量は少なくなりますmapが、両方を適用できます。xrangePython 3 では がxrange置き換えrangeられるため、唯一のオプションは を使用rangeして生成関数を返すことです。([i for i in range(10)]必要に応じて、実際の範囲を生成するために使用できます。)

モジュラス演算子は0、偶数に対して誤った値である を返します: 2 mod 2 は 0 です。そのため、偶数は除外されます。

于 2012-11-24T01:52:44.197 に答える
2

実際にはmap、 、reduce、およびfilter関数はリスト内包表記の代わりになります。「リスト内包表記」という用語は、特定の構文構造を指します。リスト内包表記のように見えないものは、必ずしもリスト内包表記ではありません。

それらは実際にはリスト内包表記よりも前から存在し、他の言語から借用されています。しかし、これらの言語のほとんどには、Python よりも強力な無名関数を構築する方法があるlambdaため、これらのような関数はより自然です。リスト内包表記は、Python により自然に適合すると考えられています。

rangeとの違いはxrangerange範囲を形成する数値を含むリストを実際に構築するのに対し、 anxrangeはそのエンドポイントを認識し、メモリ内の値の完全なリストを実際に構築することなく、それ自体を反復処理できるオブジェクトです。 999 要素のリストを生成するのに対し、xrange(1,1000)は より多くのスペースを占有しません。xrange(1,5)range(1,1000)

于 2012-11-24T01:56:01.673 に答える
2

とを Python 言語で実装するrange()xrange()、次のようになります。

def xrange(start, stop=None, step=1):
    if stop is None: stop, start = start, 0
    i = start
    while i < stop:
        yield i
        i += step

def range(start, stop=None, step=1):
    if stop is None: stop, start = start, 0
    acc, i = [], start
    while i < stop:
        acc.append(i)
        i += step
    return acc

ご覧のとおりrange()、リストを作成して返しますが、xrange()必要に応じて範囲内の値を遅延生成します。xrange()これには、値を格納したり、リスト オブジェクトを作成したりしないため、リストを作成するためのオーバーヘッドが回避されるという利点があります。ほとんどの場合、最終結果に違いはありません。

明らかな違いの 1 つは、xrange()スライスがサポートされていないことです。

>>> range(10)[2:5]
[2, 3, 4]
>>> xrange(10)[2:5]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: sequence index must be integer, not 'slice'
>>> 

ただし、インデックス作成はサポートしています。

>>> xrange(11)[10]
10
于 2012-11-24T02:07:26.277 に答える