Pythonのループ処理に使われるfor文は基本的に複数行でコロン(:)とインデントを使って書かれますが、ときには1行で書くこともできちゃいます。
今回はその一行で書く方法と、複数行で書いた時との違いを紹介していきましょう。この記事のコードを実行するときはIDLEで試してください。
もし、for文の基本的な内容をまだ知らないのであればコチラからご確認下さい。
Pythonのループ処理に使われる構文にはfor文とwhile文があります。今回はそのfor文の使い方解説をしていきます。 for文とは for文はループ処理を行う構文です。Pythonで書く場合はコロン(:)とインデントに注[…]
for文を一行で書く方法
リストの中にfor文を1つ
構文は以下のようになります。
1 2 |
[ x for {変数} in {イテラブル}] #イテラブルにはリストやrangeなど |
一番最初に書かれているxはそのあとの変数に依存させることもできますし、独立させることもできます。
以下の例でその違いを確かめましょう。
1 2 3 4 5 6 7 8 9 |
>>> [ 2 * x for x in range(5)] #出力結果 [0, 2, 4, 6, 8] >>> ['Hello' for i in range(4)] #出力結果 ['Hello', 'Hello', 'Hello', 'Hello'] |
一つ目は、変数xが0~4の値をとるのに対して、「2 * x」となっているので2倍の数のリストを作っています。これがリストの中身を変数に依存させるタイプ。
二つ目は、変数iが0~3の値をとるのにたいして、’Hello’を4回繰り返しています。これはリストの中身と変数が関係していない(変数iの値によってリストの中身が変化しない)ので独立しているタイプといえます。
上の二つの例を一行ではなく複数行で書くと以下のようになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
>>> X = [] >>> for x in range(5): X.append(2 * x) >>> print(X) #出力結果 [0, 2, 4, 6, 8] >>> Y = [] >>> for i in range(4): Y.append('Hello') >>> print(Y) #出力結果 ['Hello', 'Hello', 'Hello', 'Hello'] |
まずは空のリストを用意して、それにappend()メソッドで要素を追加しています。一行で書くよりも複雑になっていることが分かります。
Pythonでリストをつくるときにわざわざデータを一つ一つ入力していくのはメンドウですね。そこで今回はより簡単にリストを作る方法を紹介します。 リストの中に直接for文やif文を書くことで条件付きの値をリストに格納することができます[…]
リストの中にfor文を2つ
1 2 3 4 |
>>> [(x, y) for x in range(3) for y in range(2)] #出力結果 [(0, 0), (0, 1), (1, 0), (1, 1), (2, 0), (2, 1)] |
x, yの値をそれぞれ別々のfor文を使って出力しています。「for x in range(3)」なのでxの値は0~2、「for y in range(2)」なのでyの値は0,1となります。
これを複数行で書いてみると以下のようになります。
1 2 3 4 5 6 7 8 9 |
>>> Z = [] >>> for x in range(3): for y in range(2): Z.append((x, y)) >>> print(Z) #出力結果 [(0, 0), (0, 1), (1, 0), (1, 1), (2, 0), (2, 1)] |
for文が入れ子になっていてややこしいですね。コードも長くなって見にくいので一行で書くことをお勧めします。
リストにfor文とif文を使う
リストの中に書くときはfor文とif文を合わせて使うことができます。先にfor文を書いてから、あとにif文を書きます。
1 2 3 4 |
>>> [(x, y) for x in range(3) for y in range(2) if x != y] #出力結果 [(0, 1), (1, 0), (2, 0), (2, 1)] |
上でやった例に「if x != y」を追加しています。つまり、xとyが一致しないならリストにデータを追加するということです。
出力結果を見ても分かる通り、xとyの値が異なるものだけがリストに格納されています。
このコードもfor文とif文の入れ子で書くことができます。
1 2 3 4 5 6 7 8 9 10 |
>>> Z = [] >>> for x in range(3): for y in range(2): if x != y: Z.append((x, y)) >>> print(Z) #出力結果 [(0, 1), (1, 0), (2, 0), (2, 1)] |
一行と複数行の違い
一行で書く場合とインデントを使って複数行で書く場合ではforループが終わったときの変数の状態に違いがあります。
1 2 3 4 5 6 7 8 9 10 11 12 |
>>> for i in range(3): print(i) #出力結果 0 1 2 #ループ終了時のiの値 >>> print(i) #出力結果 2 |
このように複数行で書いた場合、ループが終了したときの変数iの値は保存されます。ですから、ループ後に変数iを出力すると、ループ終了時の値である2が表示されているわけです。
ですが、一行で書いた場合は以下のように変数iの値は保存されません。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
>>> [ i for i in range(4)] #出力結果 [0, 1, 2, 3] >>> print(i) 出力結果 Traceback (most recent call last): File "<pyshell#1>", line 1, in <module> print(i) NameError: name 'i' is not defined |
プログラムによってどの書き方が最適化は変わってきますが、どの変数に何の値が保存されているのかには注意してください。
まとめ
今回はfor文を一行で書く方法を見ていきました、初めてこの方法を知ったときは感動しました。またif文とのコンボもあるので使える幅は広がりそうですね。
この記事ではリストを作るときに角括弧([])を使いましたが、list関数でも同じ処理ができます。最後にこのコードを紹介して終わりにしたいと思います。
1 2 3 4 5 6 |
>>> list( i for i in range(4)) >>> [ i for i in range(4)] #出力結果 [0, 1, 2, 3] [0, 1, 2, 3] |
参考になれば幸いです。
- ループ処理とは?for文とwhile文の解説
- while文を使う方法【インクリメントと無限ループ対処法】
- for文の使い方解説(一行・range関数・リスト)
- for文を一行で書く方法と複数行との違い
- for文でrange関数とlen関数を使う方法
- for文でリストのインデックスと要素を取り出す(enumerate)
- for文で辞書のキー・バリューを取り出す方法(enumerate・items・keys・values)
- 条件分岐とは?if文・else・elifの書き方
- for文やif文でpass・break・continueを使う方法
- while文のbreak・else・continue使い方まとめ
プログラミング言語のなかでも人気の高いPythonを学習する教材を紹介します。 最近ではプログラミングスククールがたくさんあるので迷うと思います。 ですが、まずは無料教材から始めてみましょう。苦労した分だけ力がつきます。 […]