< YouTubeの著作権クレーム | らむ太語録 >
2013/07/05
Python、恐ろしい子…
zip(*[iter(range(15))]*3)
が [(0, 1, 2), (3, 4, 5), (6, 7, 8), (9, 10, 11), (12, 13, 14)]
になる、という話。
- リストをn個ずつのサブリストに分割 (Python)
- http://stackoverflow.com/questions/2233204/how-does-zipitersn-work-in-python
何じゃこりゃ、と思ったけど、zipがジェネレータ(イテレータ)を進める順序に依存してるわけね。
まあ評価順序は仕様で明示されてるのかもしれないけど、「見えない副作用の順序に依存するコード」って恐ろしくて書けないなあ。
Gaucheでもシーケンスを扱う関数がgeneratorを取ったら暗黙にシーケンスに変換するようにしようかと考えたことはあったのだけれど、意図せずにそのgeneratorを複数箇所で使ってしまうと恐ろしいことが起こると思ってやめた。lazy sequenceならどういう順序で何回参照しようが結果は変わらないのでその心配はない。
まあこういうのも程度問題で、純粋関数型から見たら普通のSchemeプログラムも「モナドの外で状態を変更するなんて!」「禁断の魔術だ!」ってなふうに見えるのかもしれん。
(なお元の話題のリスト分割については、Gaucheならslicesが使える)
Post a comment