web-dev-qa-db-ja.com

マップインPython 3 vs Python 2

私はPython初心者が古いPython本を読んでいます。これはPython 2に基づいているので、時々少ししか得られません詳細について混乱しています。

コードがあります

_L=map(lambda x:2**x, range(7))
_

そのため、python 3のリストは返されません。グーグルで検索したところ、_list(L_)が機能することがわかりました。しかし、問題は、最初のlist(L)は正常に機能することですが、もう一度使用すると、

_list(L)

list(L)
_

2番目のものは_[ ]_を返します

誰かが私に何が起こっているのか説明できますか?

8
Septacle

mapはイテレータを返します。そのため、その出力は1回だけ使用できます。 Python 2.xと同じように、結果をリストに保存する場合は、listを使用するときにmapを呼び出すだけです。

L = list(map(lambda x:2**x, range(7)))

リストLには、何度呼び出しても結果が含まれます。

あなたが直面している問題は、mapが一度繰り返されると、それ以降の呼び出しごとに何も生成されないことです。したがって、2番目の呼び出しの空のリストが表示されます。

イテレータを使い果たすことができないが、それを2回使用したい場合の回避策の詳細な説明とアドバイスについては、 同じデータに対して2回反復できない理由 を参照してください。

5
jpp

Python 3.xは、ジェネレータオブジェクトを返します。

_$ python3 -c "print(map(lambda x: 2**x, range(7)))" 
<map object at 0x104203208>
_

list()を使用してこれらの値を抽出できますが、ジェネレーターが使い果たされる可能性があります。したがって、その後list()を使用すると、next()呼び出しでアクセスする値がなくなるため、空の_[]_になります。ジェネレーターを少し試してみることをお勧めします。または、ここを少し読んでください https://wiki.python.org/moin/Generators 。お役に立てれば

0
Dustc8ke