Pythonのリスト内包表記のメモ
Pythonのリスト内包表記についてメモ。
Python初心者なので間違っていたら後で直す。
Pythonリスト内包表記の使い方 | note.nkmk.me
Pythonのリスト内包表記はチューリング完全だから純LISPだって実装できる - Qiita
Pythonの習得を始めたところ、Rubyと微妙に異なる点でいくつかハマった。
個人的には過去の記事が参考になった。
【Ruby】PythonプログラマーがRubyを触って感じたこと - 歩いたら休め
(引用開始)
逆に、RubyのプログラマーがPythonを勉強したいなら、以下の3点を押さえておけば、ちゃんとしたプログラムが書けると思います。
リスト内包表記
ジェネレーター(遅延評価)
ふつうに定義した関数がオブジェクトであること
(引用終了)
確かに、リスト内包表記が一番難しく感じた。
個人的には、
[str(i) for i in [1, 2, 3]]
と書くよりも
list(map(str, [1, 2, 3]))
の方が読みやすいし理解しやすい。
[i for i in [1, 2, 3] if i % 2]
よりも
list(filter(lambda x: x % 2, [1, 2, 3]))
の方がカッコよく感じていた。
しかし、mapやfilterよりもリスト内包表記の方が高速らしいので、リスト内包表記を使うべきなのだろう。
実際、Pythonのリスト内包表記は奥が深い。
Pythonのリスト内包表記はチューリング完全だから純LISPだって実装できる - Qiita記事が面白かった。
(引用開始)
Pythonにはリスト内包表記というとても便利なものがあります。
どれくらい便利かというと、チューリング完全です。
(引用終了)
最初の印象は、for文を使いまくって手続きっぽいな、Rubyのブロックみたいに書ければ綺麗なのに、と思っていたが、Pythonはリスト内包表記があるから関数型言語の側面もあるのだ、と感じた。
Pythonで色々書いてみた気づきは色々ある。
Pythonのmap, filter, reduceは、Rubyのmap(collect), select(find_all), reduce(inject)と同じだが、文字・リスト・ハッシュ(辞書)のメソッド名が微妙に異なっている。
例えば、PythonはList.remove(要素)、RubyはArray.delete(要素)。
例えば、PythonはList.extend(要素)、RubyはArray.push(要素)。
Rubyのクロージャはブロックで簡単に書ける一方、Pythonのクロージャは、関数内関数を使う。
その時、関数内関数の外側の変数は参照できるが、更新したい時は、nonlocal宣言が必要。
その点は、何となくPerlに似ている。
Rubyではインスタンスメソッド、クラスメソッド(特異メソッド)が単純に書けるが、Pythonでは、インスタンスメソッドの第1引数にselfを明示したり、クラスメソッドにはアノテーションを付けて第1引数にclsを明示する。
その点は、Pythonは機械語により近い感じがする。
Pythonは多重継承をサポートしている部分は驚いた。
JavaもRubyも、ほとんどのプログラミング言語も多重継承はないから。
Rubyなら継承チェーンは必ずツリー構造なので、メソッド探索は単純だが、Pythonで多重継承ができるとなると、いわゆる菱形継承が問題になってくる。
どうやって解決しているのか、調べてみる。
| 固定リンク
「Python」カテゴリの記事
- 「コーディングを支える技術」は良い本だ(2022.05.26)
- Pythonで微分積分や統計の基礎を理解しよう(2022.05.15)
- Python の numpy の裏では FORTRAN のライブラリが動いているらしい(2022.02.06)
- プログラマが「何をやっているか分からない」「何が分からないか分からない」状態から脱出する記事がとても良い(2021.07.18)
- MATLABとPythonのリンク(2021.06.06)
コメント