LoginSignup
0
2

More than 1 year has passed since last update.

Pythonのfor文まとめ

Last updated at Posted at 2021-11-11

はじめに

Pythonのfor文は(C言語などの記法を参照している多くの言語とは異なり)少し特殊なため,様々なPythonのfor文をまとめてみます。

※ 本記事は,Python初心者の方にPythonicなコードを知ってもらいたいという目的で書いています。それなりにPythonに詳しい方には新たな発見はないかと思います。予めご了承ください。

一番基本

Pythonのforは他の言語で言うforeachのような感じで,リスト(など)から要素を一つずつ取り出して処理するイメージです。

例えば

for i in [0, 1, 2, 3, 4]:
  print(i)

実行結果:

0
1
2
3
4

まあこれなら普通は

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

と書きますね

インデックスと要素を同時に取得する

例えば,

s = 'spam'
for i in range(len(s)):
  print(i, s[i])

のようなコードは,組込み関数enumerateを使って

s = 'spam'
for i, c in enumerate(s):
  print(i, c)

というように書くことができます。

実行結果:

0 s
1 p
2 a
3 m

複数のリストを扱う

複数のリストを同時にイテレートする

同じインデックスで複数のリストを同時にイテレートする場合には,zipを使って

for i, j in zip(range(5), range(10, 15)):
  print(i, j)

という書き方ができます。

実行結果:

0 10
1 11
2 12
3 13
4 14

直積を利用する

リストの直積集合を利用したい場合には,for文をネストする代わりに,itertools.productを使って

from itertools import product

for i, j in product(range(3), range(10, 13)):
  print(i, j)

と書くことができます。

実行結果:

0 10
0 11
0 12
1 10
1 11
1 12
2 10
2 11
2 12

要素を使用しない場合

複数回同じ処理をしたいが要素は要らないという場合には,アンダースコアを使って

for _ in range(100):
  print('spam')

と書くことで要素を捨てることができます。

dictを回す

辞書のデータのキーだけ,値だけ,あるいは両方を順番に取得したい場合はよくありますが,この場合はそれぞれ

menu = {
  1: 'spam',
  2: 'ham',
  3: 'egg'
}

# キーだけ
for num in menu.keys():
  print(num)

# 値だけ
for item in menu.values():
  print(item)

# 両方
for num, item in menu.items():
  print(num, item)

と書けます。

実行結果:

1
2
3
spam
ham
egg
1 spam
2 ham
3 egg

イテレータを実装する

自分で実装したクラスをイテレータとして利用したい場合には,__next__()__iter__()を実装します。
例として,指定された個数だけフィボナッチ数列を返すクラスを示します。

class Fibonacci():
  def __init__(self, cnt):
    self.n0 = 0
    self.n1 = 1
    self.cnt = cnt

  def __iter__(self):
    return self

  def __next__(self):
    if self.cnt == 0:
      raise StopIteration()

    self.n0, self.n1 = self.n1, self.n0+self.n1
    self.cnt -= 1
    return self.n0

for f in Fibonacci(5):
  print(f)

実行結果:

1
1
2
3
5

for-else

私もいまいち遣いどころを把握していないのですが,

for item in items:
  # なんか処理1
else:
  # なんか処理2

という構文を紹介します。
「なんか処理1」は通常のfor文のように処理され,この中でbreakが使用されるとすべて終了します。
しかし,breakが使われずにループが終了した場合には「なんか処理2」が実行されます。

簡単な具体例を挙げると

def is_prime(n):
  for i in range(1, n):
    if n % i == 0:
      print(f'{n}は合成数です')
      break
  else:
    print(f'{n}は素数です')

みたいな感じですかね
(この場合は早期リターンでいいので例として微妙ですが,文法の説明ということでご容赦ください)

さいごに

『エキスパートPythonプログラミング』を読みましょう。

0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2