pythonのリスト内包表現

pythonには内包表現が用意されてます。

オライリー「入門 Python 3」にも内包表現を使えるかが初心者レベルを卒業できているかの目印になると紹介されています。

内包表現とは、pythonのデータ構造をシンプルな構文で作成できるものです。

[expression for item in iterable]

具体的には、リストで

[1, 2, 3, 4, 5]

を作りたい時に素で記述すると以下のようになります。

number_list = []
number_list.append(1)
number_list.append(2)
number_list.append(3)
number_list.append(4)
number_list.append(5)
number_list
# [1, 2, 3, 4, 5]

for文で書くと、以下のようになる。

for number in range(1, 6):
    number_list.append(number)
number_list
# [1, 2, 3, 4, 5]

これを内包表現を使って表記すると、

number_list = [number for number in range(1, 6)]
number_list
#  [1, 2, 3, 4, 5]

と非常に簡略化して書くことが出来ます。

しかもこちらの表記方法の方が、for文ようりも高速に動作するらしいです。

この内包表現は以下の様に理解できます。

最初のnumber:numberの処理
次のnumber:for文で一時的に値を格納する。
range(1, 6):リストの値の範囲

ここで最初のnumberはfor文の中の処理と同じ動作と考えて良さそうです。
要するに処理した値がappendでリストに格納されていくイメージです。

最初のnumberを仮にxxxxとしたら、正常に作動しません。

number_list = []
number_list = [xxxx for number in range(1, 6)]
number_list
# Error

2つ目のnumberをyyyyとした場合も、正常に作動しません。

number_list = []
number_list = [number for yyyy in range(1, 6)]
number_list
# [5, 5, 5, 5, 5]

こちらの場合は、要素の数が出力されているように見えますが、いずれにせよ正常に作動していません。

つまりforの中で指定した第二引数は、第一引数で利用するという条件があるようです。