リスト内包表記を推奨する記事があった。
しかし,取り上げている例が不適切なこともあり,ひいきの引き倒しになっているんじゃないかと思った。
まあ,人それぞれだから,「リスト内包表記がいいに決まってるじゃないか!」というのに,反対はしない。
その 1
full_name = "Yang Zhou"
に対して,
characters = [char for char in full_name]
# ['Y', 'a', 'n', 'g', ' ', 'Z', 'h', 'o', 'u']
が
full_name = "Yang Zhou"
characters = []
for char in full_name:
characters.append(char)
より「Pythoらしく洗練されたプログラムへの第一歩」
なるほど。この場合に限っては
list(full_name)
で十分と思いますが。(文字列の分解以外であっても,リスト内包表記以外の解があることもあるでしょう)。
その 2
Matrix = [[2, 1, 5],
[5, 99, 0],
[33, 2, 4]]
row_max = [max(row) for row in Matrix]
print(row_max)
# [5, 99, 33]
max 関数だからよかったけど,mean や std を使おうとすると,使用法を類推して使おうとしても,以下のようなものは全部だめ。(リストを対象にするから)
[mean(row) for row in Matrix]
[row.mean() for row in Matrix]
例が不味すぎるというか,以下のように numpy の array を使うとよい。応用範囲の幅が拡がる。統計計算プログラムのときなんかは特に。
import numpy as np
m = np.array(Matrix)
print(m.max(axis=1))
print(m.mean(axis=0))
print(m.std(axis=1))
その 3
> Pythonにはmap()やfilter()などの高階関数があります。高階関数の代わりにリスト内包表記をいつも使う習慣をつけると良いでしょう。
> 他の人がプログラムを読みやすくなるからです。
> map()は常に置き換えられます。
> L = map(func, iterable)
> # can be replaced to:
> L = [func(a) for a in iterable]
> filter()も置き換えられます。
> L = filter(condition_func, iterable)
> # can be converted to
> L = [a for a in iterable if condition]
「他の人」が高階関数を知らないプログラム初心者というならそうでしょう。
そうでなければ,そうでないでしょう。
高階関数を使っていると,何をしているか,すぐにわかります。
リスト内包表記は いちいち読まないといけない。
あと,二重ループのリスト内包表記を「わかりやすい」と書いてあったのには驚いた。