30

次のコードで何も出力されないのはなぜですか:

#!/usr/bin/python3
class test:
    def do_someting(self,value):
        print(value)
        return value

    def fun1(self):
        map(self.do_someting,range(10))

if __name__=="__main__":
    t = test()
    t.fun1()

上記のコードをPython 3で実行しています。非常に基本的なものが欠けていると思いますが、それを理解することはできません。

4

3 に答える 3

56

map()iteratorを返し、要求されるまで要素を処理しません。

これをリストに変換して、すべての要素を強制的に処理します。

list(map(self.do_someting,range(10)))

またはcollections.deque()、長さを 0 に設定して使用し、マップ出力が必要ない場合はリストを作成しません。

from collections import deque

deque(map(self.do_someting, range(10)))

ただし、単純にforループを使用する方が、コードの将来のメンテナーにとってはるかに読みやすいことに注意してください。

for i in range(10):
    self.do_someting(i)
于 2012-11-29T10:28:07.527 に答える
7

Python 3 より前では、 map() はイテレータではなくリストを返しました。したがって、あなたの例は Python 2.7 で動作します。

list() は、引数を反復処理して新しいリストを作成します。( list() は、たとえばタプルからリストへの単なる型変換ではありません。したがって、 list(list((1,2))) は [1,2] を返します。) したがって、 list(map(...)) は後方互換性がありますパイソン 2.7。

于 2013-10-05T11:37:15.707 に答える