リスト内包表記を作成するための map、reduce、filter 関数があります。
これらの各関数に引数を渡すこととxrange
引数を渡すことの違いは何ですか?
例えば:range
map(someFunc, range(1,11))
また
map(someFunc,xrange(1,11))
Python 2 ではrange
、実際のリストをxrange
返し、反復可能な生成関数を返します。シーケンスを反復することのみを気にするため、メモリの使用量は少なくなりますmap
が、両方を適用できます。xrange
Python 3 では がxrange
置き換えrange
られるため、唯一のオプションは を使用range
して生成関数を返すことです。([i for i in range(10)]
必要に応じて、実際の範囲を生成するために使用できます。)
モジュラス演算子は0
、偶数に対して誤った値である を返します: 2 mod 2 は 0 です。そのため、偶数は除外されます。
実際にはmap
、 、reduce
、およびfilter
関数はリスト内包表記の代わりになります。「リスト内包表記」という用語は、特定の構文構造を指します。リスト内包表記のように見えないものは、必ずしもリスト内包表記ではありません。
それらは実際にはリスト内包表記よりも前から存在し、他の言語から借用されています。しかし、これらの言語のほとんどには、Python よりも強力な無名関数を構築する方法があるlambda
ため、これらのような関数はより自然です。リスト内包表記は、Python により自然に適合すると考えられています。
range
との違いはxrange
、range
範囲を形成する数値を含むリストを実際に構築するのに対し、 anxrange
はそのエンドポイントを認識し、メモリ内の値の完全なリストを実際に構築することなく、それ自体を反復処理できるオブジェクトです。 999 要素のリストを生成するのに対し、xrange(1,1000)
は より多くのスペースを占有しません。xrange(1,5)
range(1,1000)
とを 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