【Python入門】基礎構文for編|初心者向けに徹底解説



Python基礎構文for

for文はプログラミングの中でif文と並んで基礎の処理です。

日本語で言うと「○○の処理を△△の間実行」

Pythonのfor文は他の言語に比べ非常に読みやすいのが特徴です。

というのも、他の言語と違い、余計な記号で囲む必要がなく、カッコの付け忘れによるエラーなど起きる余地がありません。

また、Pythonのスタンダードなfor文は、他の言語で言うところfor each文に近い挙動をします。

他の言語をすでに習得している方ほど、Pythonのfor文を見ればきっと「Pythonめっちゃ分かりやすいじゃん」ってなると思います。

サンプルコードも沢山載せていきますので、是非コピペして色々試してみてください。

Python for文の前提知識

Pythonのfor文には他の言語とは少し違った、最初に抑えておくべき基本的なルールが存在します。

a = 0
for i in range(10):
    a += i
print(a)

>>>46

いかがでしょうか?
非常に読みやすくないですか?

特徴というのはfor文の次の行の開始部分のインデントです。

for文の評価行の「次の行」は必ずタブインデントが使われている必要があります。

forの実行行はコード上でfor文開始行のスタート位置より一段階インデントされている必要があります。

多重階層的なfor処理(for処理の中でのfor処理)も、全てこのインデントで表記していきます。

他の言語と違い、Pythonのインデントは構文上の意味を持っており、インデントがなければエラーとなり、プログラム自体が動きません。

これをオフサイドルールと言います。for同様、if文など、階層的処理の場合は必ずこのインデントが必要となります。

覚えておいてください。

forの評価行の末尾は:(コロン)でくくります。

スクリプト中の空白は必ず半角である必要があります。

他の言語のfor文との違い

Pythonのfor文は「イテレータ」の要素全てにアクセスを繰り返す、というのが基本動作になります。

「イテレータってなんやねん?」ってなりますよね。

ものすごく雑に説明すると、似たようなものがいっぱい並んで詰まってるオブジェクトの事です。

他の言語で言うところの配列(Pythonではリスト)なんかがイメージしやすいと思います。

難しくとらえず、何はともあれ、実践してみましょう。

回数を明示して繰り返す処理

回数を明示して繰り返す処理

最も一般的なfor処理ですが、Pythonのfor文処理は他言語の for each に近い処理がスタンダードになっています。

そのため、明示的な回数指定をするためには回数を「イテレータ」としてfor文に渡してやる必要があります。

range()関数

明示的な回数の処理はrange()関数を使って行うのが一般的です。

for i in range(5):
    print(i)
>>>0
>>>1
>>>2
>>>3
>>>4

range()関数は整数型の数字を受け取るとrangeオブジェクトを返します。

for文中の変数 i がこのrangeオブジェクトに繰り返しアクセスし、現在のrangeオブジェクトの値が格納されるイメージです。

変数 i はrangeオブジェクトの数全てを順番に受け取りそれが出力されています。

range()に変数渡す

これも問題なく可能です。

a = 5
for i in range(a):
    print(i)

>>>0
>>>1
>>>2
>>>3
>>>4

つまり不確定な回数の繰り返し処理もrange()関数で可能です。

リスト(list)の各要素へのアクセスを繰り返す処理

リスト(list)の各要素へのアクセスを繰り返す処理

単純なリスト(list)の各要素への繰り返しアクセス

for文にイテレータとしてリストを渡すと変数で全ての要素に繰り返しアクセスします。

country = ['JP','US','UK','RF','KR','CH']
for a in country:
    print(a)

>>>JP
>>>US
>>>UK
>>>RF
>>>KR
>>>CH

この場合変数 a はリスト内に格納されている「要素」を受け取ります。

リスト(list)のインデックス(index)を取得しながら繰り返しアクセス

listをenumerate()関数に入れて渡すとリストの要素の「index」を抽出することができます。

country = ['JP','US','UK','RF','KR','CH']
for i,a in enumerate(country):
    print(i,a)

>>>0 JP
>>>1 US
>>>2 UK
>>>3 RF
>>>4 KR
>>>5 CH

enumerate()での処理はfor文直後の変数を二つ用意する必要があります。

最初の変数 i がindexを受け取り変数 a は要素そのものを受け取ります。

for i in enumerate(country):
    print(i)

>>>(0, 'JP')
>>>(1, 'US')
>>>(2, 'UK')
>>>(3, 'RF')
>>>(4, 'KR')
>>>(5, 'CH')

変数を一つしか渡さなくても動きますが、その場合変数に格納されるのは「indexと各要素本体のタプル」となります。

辞書(dict)の各要素へのアクセスを繰り返す処理

辞書(dict)の各要素へのアクセスを繰り返す処理

単純な辞書(dict)の各要素への繰り返しアクセス

country = {'JP':'Tokyo','US':'Washington','UK':'London','RF':'Moscow','KR':'Seoul','CH':'Beijing'}

for k in country:
    print(k)

>>>JP
>>>US
>>>UK
>>>RF
>>>KR
>>>CH

単純に辞書にアクセスすると変数は辞書のKeyのみを受け取ることになります。Valueにはアクセスできません。

for文から辞書の値(Value)へのアクセス

for文で辞書の値が欲しい時はvalues()メソッドを使います。

country = {'JP':'Tokyo','US':'Washington','UK':'London','RF':'Moscow','KR':'Seoul','CH':'Beijing'}

for v in country.values():
    print(v)

>>>Tokyo
>>>Washington
>>>London
>>>Moscow
>>>Seoul
>>>Beijing

Value側にアクセスしたいときはdictオブジェクトのvalues()メソッドをfor文に渡す必要があります。

for文から辞書のKeyへのアクセス

ちなみに一応keys()メソッドというのも用意されています。
ただfor文の場合省略してもKeyにアクセスすることになるのでほとんど意味はありません。

country = {'JP':'Tokyo','US':'Washington','UK':'London','RF':'Moscow','KR':'Seoul','CH':'Beijing'}

for k in country.keys():
    print(k)

挙動は.keys()を省略した場合と同じです。

for文を処理途中で抜ける

for文を処理途中で抜ける

Pythonのfor文は渡したオブジェクトのすべての要素にアクセスするのが基本動作です。

しかし、目的を達成した後は、for処理を抜けたいという場合があります。

この場合break文を使って処理途中のfor文を抜けることができます。

break文

country = ['JP','US','UK','RF','KR','CH']
for i,a in enumerate(country):
    if a == 'UK':
        print('UK発見')
        break
    print(i)

>>>0
>>>1
>>>UK発見

このように'UK'という文字列に行き当たったら、以後のfor文は処理をしないという様な処理がbreak文となります。

for文を次のステップ処理に移す

for文を次のステップ処理に移す
Processed with VSCO with f2 preset

break文ではforの処理自体を完全に抜けてしまい、以降変数iに格納されたindex番号は出力されませんでした。

continue文では、その次のイテレータにアクセス(処理)を移す、という処理が可能になります。

continue文

country = ['JP','US','UK','RF','KR','CH']
for i,a in enumerate(country):
    if a == 'UK':
        print('UK発見')
        continue
    print(i)

>>>0
>>>1
>>>UK発見
>>>3
>>>4
>>>5

先ほどのコードのbreakをcontinueに変えただけのコードです。

breakでは'UK'に行き当たって以降indexは出力されませんでしたが、continueの場合、出力されていないindexはUKに該当する2番のみです。

このようにcontinue文ではfor文の処理を次の回に移すということが可能です。

for文が最後まで行き着いたときのみ処理を行う

for文が最後まで行き着いたときのみ処理を行う

for文の処理が最後の要素まで行き着いたときのみ行いたい処理は、elseを使うと実現できます。

for else文

country = {'JP':'Tokyo','US':'Washington','UK':'London','RF':'Moscow','KR':'Seoul','CH':'Beijing'}

for v in country.values():
    if v == 'Jakarta':
        break
else:
    print('Jakartaは発見できませんでした')

breakとセットで使うのが基本です。

for文を一行で書く

for文を一行で書く

Pythonには独特の「リスト内法表記」という記述式が存在します。

for文で行う処理を一行で書くことができ、処理結果はリスト形式として返されます。

初めて見たときは非常に取っつきにくい記述法です。

しかし、住めば都というヤツで、使っているうちに、どれだけ難解な処理をリスト内法表記で書けるかにチャレンジしたい衝動を抑えられなくなります。(笑)

実用上のメリットもあり、リスト内法表記で記述したコードはメモリへのアクセス回数が抑制されるため、階層式で書いたfor文より、処理速度がアップする可能性がある、という特徴もあります。

初心者の方には少し難しいかもしれませんが、ここではリスト内法表記の記述法を少し紹介します。

リスト内法表記(基本)

[式 for 変数 in イテレータ]

これが基本的な記述です。「式」の部分が最終的なリストとして返ってきます。

以下は単純な例。

[i for i in range(10)]
>>>[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

変数 i がrangeオブジェクト各項目にアクセスしますが、その変数 i をそのまま取出すパターンです。

リスト内法表記(応用)

変数 i を演算して加工を加えることもできます。

#10番目までの「偶数」をリストで取得
a = 2
[a*(i+1) for i in range(10)]

>>> [2, 4, 6, 8, 10, 12, 14, 16, 18, 20]

もちろん文字列も扱えますし、ifも使えます。

#首都が'Moscow'の「国」を取得
country = {'JP':'Tokyo','US':'Washington','UK':'London','RF':'Moscow','KR':'Seoul','CH':'Beijing'}

[k for k in country if country[k] == 'Moscow'][0]
>>>'RF'

最終的に取出す要素が一個と決まっているなら[0]を加えると文字列として取り出すことも可能です。

Python for まとめ

内法表記は少し慣れが必要ですがマスターできれば癖になる楽しさがあります。

ぜひ挑戦してみてください!