cols_upper = map(str.upper, "a,B,c".split(",")) cols_lower = map(str.lower, cols_upper) for c in cols_lower: print(c) for c in cols_upper: print(c)
python2 だと動く。
A B C a b c
python3だと動かない。
A B C
python3では戻り値がイテレータに変わっているため。
Return an iterator that applies function to every item of iterable, yielding the results.
Built-in Functions — Python 3.7.2 documentation
Apply function to every item of iterable and return a list of the results.
list
でラップすることで、今までの挙動と同じにできる。
map
や filter
はリストに対する操作であるという印象が強いので、この仕様には面食らった。特に、イテレータはリストと違って内部に状態を持つミュータブルな値だということに、厳しみを感じる。
そんなわけで(?)、2019年もよろしくお願い致します。