« 教育における読み書きというアナログの重要性の記事のリンク | トップページ | 「ゼロから作るDeep Learning」を読み始める »

2020/04/25

Pythonのリスト内包表記のメモ

Pythonのリスト内包表記についてメモ。
Python初心者なので間違っていたら後で直す。

【参考】
pythonの内包表記を少し詳しく - Qiita

リスト内包表記の活用と悪用 - Qiita

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で多重継承ができるとなると、いわゆる菱形継承が問題になってくる。
どうやって解決しているのか、調べてみる。

|

« 教育における読み書きというアナログの重要性の記事のリンク | トップページ | 「ゼロから作るDeep Learning」を読み始める »

Python」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)


コメントは記事投稿者が公開するまで表示されません。



« 教育における読み書きというアナログの重要性の記事のリンク | トップページ | 「ゼロから作るDeep Learning」を読み始める »