どの言語であっても、プログラミングをしていて必ず使わなければならないfor文。
非常に便利なのですが、初心者の方にとってはやや難しく感じる部分もあるのではないでしょうか?
私自身も最初は書き方に戸惑ったりしました。
そこで今回はPythonでのfor文の書き方を基礎から解説していきます!
この記事では、
- Pythonでのfor文の書き方の基礎を理解する
- for文で使える関数を知る
について解説していきます!
では見ていきましょう。
for文の書き方の基本
pythonのfor文は他のプログラミング言語とやや異なります。
例えば、javaなどの言語では、
for(int i = 0; i < 10; i++)
{
処理
}
といったように記述しますが、Pythonでは
for 変数名 in オブジェクト:
処理
といったように記述します。ここで、オブジェクトとは、配列など要素の数を数えることができるものを指します。
Pythonではカウンタ変数(上記ではi)を用いないのが特徴です。
また、for文の中身の処理部分はインデントで決まるので、javaのように{ }で括る必要はありません。
他の言語を知っている方であれば、foreach文に相当するものがPythonのfor文だと思ってください。
実際の例を見てみましょう。
countries_list = ["Japan", "US", "UK", "China"]
for country in countries_list:
print(country)
といったように書くと
Japan
US
UK
China
のように出力されます。
countries_listの要素の数だけ繰り返し、countryにはその要素がそのまま入ります。
これがPythonでのfor文の基本の書き方です。
breakとcontinue
条件によってfor文の途中で処理をやめたいときや、要素をスキップしたいときは、breakやcontinueを使います。
条件に応じてfor文を途中で終了する:break
for文の途中で処理を終了させたいときはbreakを使います。
for文の中で条件分岐を行い、指定の条件に当てはまれば処理を終了するといった流れです。
先ほどの例を使って、”UK”が来たら処理を終了してみましょう。
countries_list = ["Japan", "US", "UK", "China"]
for country in countries_list:
#UKがきたら処理を終了する
if country == "UK":
break
print(country)
結果は
Japan
US
となり、途中で処理が終了します。
特定の要素をスキップする:continue
breakではfor文を強制終了しましたが、その要素だけをスキップしたいときはcontinueを使います。
for country in countries_list:
if country == "UK":
print("-----")
continue
print(country)
Japan
US
-----
China
“UK”の処理はスキップされますが、その後の要素の処理は継続されています。
for文で使える便利な関数
ここからは、pythonのfor文で使える便利な関数をいくつか紹介します。
組み合わせて使う場合もあるので要チェックです^^
カウンタを取得する:range()
先ほどの例では、for文内で各要素を取得していました。
しかし、カウンタ(何番目の要素か)を取得したい場合もあります。そんなときはrange()関数を使います。
for i in range(3):
print(i)
0
1
2
このように3番目までのカウンタを取得することができます。
範囲指定でカウンタを取得する
0からではなく特定の範囲を指定したいときは、range(7, 11)のように指定します。
for i in range(7, 11):
print(i)
7
8
9
10
任意の増分を指定したい場合
これまでは1ずつ増やして値を取得していましたが、増分を指定して値を取得することもできます。
range(開始, 終了, 増分)のように記述すると
for i in range(7, 15, 2):
print(i)
7
9
11
13
2ずつ増やした値を取得することができます^^
配列などの要素数を取得したいとき
配列の要素数を取得したい!
というときは、len()関数と組み合わせます。
len()関数は、配列やデータフレームの要素数をカウントしてくれる関数です。
countries_list = ["Japan", "US", "UK", "China"]
len(countries_list)
4
しかしこれだけでは、for文には使えません。
for i in len(countries_list):
print(i)
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-11-6729f30075c7> in <module>
----> 1 for i in len(countries_list):
2 print(i)
TypeError: 'int' object is not iterable
エラーが出てしまいます💦
どうしてrange()は使えて、len()はダメなんでしょうか?
range()とlen()の中身を比較してみましょう。
*range()は中身がわかりやすいように配列に変換しています。また、中の変数は違いますが気にしないでください。
len(countries_list)
# 4
list(range(4))
# [0, 1, 2, 3]
len()では”4”だけが入っていますが、range()では0~3の連番が格納されています。
for文のオブジェクトとして用いるには、range()の中身のような構成が求められるのです。
これを基にして、改めて配列の要素数をfor文に与えてみましょう。
for i in range(len(countries_list)):
print(i)
0
1
2
3
無事、実行することができました^^
配列要素とカウンタを取得する:enumerate()
配列のカウンタを取得したいときはrange()とlen()を組み合わせればいいと説明しました。
しかし、時には欲が出て、配列の要素とカウンタの両方を取得したいといった場面に出くわします。そんな時に便利なのが、enumerate()関数です。
配列の要素とカウンタを取得するので、for文の変数を2つ宣言しましょう。
1つ目がカウンタ、2つ目が要素です。
for i, country in enumerate(countries_list):
print(i)
print(country)
0
Japan
1
US
2
UK
3
China
こんな感じで取得できました^^
複数の配列の要素を同時に取得する:zip()
for文内で複数の配列の要素を使いたいときに便利なのがzip()関数です。
例を見てみましょう。
countries_list = ["Japan", "US", "UK", "China"]
countries_number = [10, 11, 13, 43]
for country, number in zip(countries_list, countries_number):
print(country)
print(number)
Japan
10
US
11
UK
13
China
43
2つの配列をzip()関数を使ってfor文に与えました。結果を見ると、両配列の要素が取得できています。
3つ以上の配列でも可能です。
countries_list = ["Japan", "US", "UK", "China"]
countries_number = [10, 11, 13, 43]
name_list = ["Akira", "James", "Mike", "Xi"]
for country, number, name in zip(countries_list, countries_number, name_list):
print(country)
print(number)
print(name)
print("")
Japan
10
Akira
US
11
James
UK
13
Mike
China
43
Xi
配列の要素数が異なる場合
この例ではすべての配列の要素数が同じですが、配列の要素数が異なる場合はどうなるのでしょうか?
この場合、配列の要素数が多いほうの余剰分が無視されます。
countries_numberの要素数を3つにして実行してみます。
countries_list = ["Japan", "US", "UK", "China"]
countries_number = [10, 11, 13]
for country, number in zip(countries_list, countries_number):
print(country)
print(number)
print("")
Japan
10
US
11
UK
13
countries_listの4つ目の要素である”China”が無視されています。
zip()を使ってカウンタも取得する
さらに欲張りなパターンです。
zip()で複数の配列の要素を取得したいうえに、カウンタも欲しい場合も時にはあります。
そんな時は、zip()とenumerate()を組み合わせましょう。
enumerate()の中にzip()を入れればOKです^^
for i, (country, number) in enumerate(zip(countries_list, countries_number)):
print(i)
print(country)
print(number)
print("")
0
Japan
10
1
US
11
2
UK
13
ここで注意してほしいのが、変数宣言の部分です。
zip()で取得する要素は()で括ってあげないといけません。
ここでは(country, number)といったようになっています。
まとめ
pythonでのfor文の書き方を解説してきました。
この記事の内容で、大体のfor文は書くことができると思います。
あとは、これをどのように活かしていくかです。
経験を積んで、わかりやすいfor文の記述を目指したいものです(自戒)
ではでは👋