CODE Python

【独学Python】for文の使い方まとめ

更新日:

こちらでPythonを使ってRPGを作成しています。

この中でよく使ったり、まだ使っていないけど
便利そうで、今後使いそうな構文や関数などを(自分用に)まとめます。

今回は一番よく使ってそうなfor文についてまとめました。

まだ実際には使っていない構文もありますが
今後のために記載しておきます。

 

目次

  1. 準備
  2. for文
  3. 最後に

準備

前提として
以下のプログラムを利用します。

class Brave():
    def __init__(self, name):
        self.name = name
        self.maxhp = 10
        self.hp = 2

player = []
player.append(Brave("ハロ1"))
player.append(Brave("ハロ2"))
player.append(Brave("ハロ3"))
player.append(Brave("ハロ4"))

 

  

for文

とうわけで今回はfor文がメインです。

for文はよく使いますが
特にリストとのセットが多いです。

for p in player:
    print(p.name)

# 結果
# ハロ1
# ハロ2
# ハロ3
# ハロ4

 

指定したインデックスのみ繰り返す

for p in player[1:3]: # インデックス 1〜2を繰り返す
    print(p.name)

# 結果
# ハロ2
# ハロ3

for p in player[:2]: # インデックス 最初(0)〜1を繰り返す
    print(p.name)

# 結果
# ハロ1
# ハロ2

 

 

enumerate

インデックスと要素を取り出す
※draw_textはこちらで定義している自作関数です。

for i, p in enumerate(player):
    draw_text(bg, f"{p.name}", 100*i, 20, fnt, col)

結果

 

 

開始するインデックスを指定

s_list = [0, 1, 2, 3, 4]
for i, l in enumerate(s_list, 1): # 第2引数に開始するインデックスを指定
    print(f"i:{i} l:{l}")

# インデックスは1から開始
# i:1 l:0
# i:2 l:1
# i:3 l:2
# i:4 l:3
# i:5 l:4

 

リストの要素も開始するインデックスと
同じ位置から開始する

s_list = [0, 1, 2, 3, 4]
for i, l in enumerate(s_list[1:], 1):
    print(f"i:{i} l:{l}")

# インデックスも要素も1から開始
# i:1 l:1
# i:2 l:2
# i:3 l:3
# i:4 l:4

 

 

zip

複数のリストの要素をまとめて取得
(今後、使います)

x = [1, 2, 3, 4, 5]
y = [6, 7, 8, 9, 10]
for i, j in zip(x, y):
    print(f"i:{i}, j:{j}")

# 結果
# i:1, j:6
# i:2, j:7
# i:3, j:8
# i:4, j:9
# i:5, j:10

 

今は以下のようにrangeを使っていますが
結果は同じでもzipのほうが便利です。

x = [1, 2, 3, 4, 5]
y = [6, 7, 8, 9, 10]
for i in range(len(x)):
    print(f"i:{x[i]}, j:{y[i]}")

# 結果
# i:1, j:6
# i:2, j:7
# i:3, j:8
# i:4, j:9
# i:5, j:10

 

 

enumerateとzip

zipとenumerateの組み合わせ
(今後、使います)

x = [1, 2, 3, 4, 5]
y = [6, 7, 8, 9, 10]
for k, (i, j) in enumerate(zip(x, y)):
    print(f"k:{k}, i:{i}, j:{j}")


# 結果
# k:0, i:1, j:6
# k:1, i:2, j:7
# k:2, i:3, j:8
# k:3, i:4, j:9
# k:4, i:5, j:10

 

 

リスト内包表記

条件式を満たす要素を抽出
(少し使っていますが、今後もっと使います)

tmp_player = [p for p in player if p.hp > 0] # HPが1以上(生存しているオブジェクト)
if tmp_player: # 全滅していない
    print("True")
else: # 全滅(リストが空)
    print("False")

# 結果
# True

 

全ての要素をFalseにする
(今後、使います。初期化するのに便利)

flag = [True, False, True, True]
flag = [False for _ in flag]
print(flag)

# 結果
# [False, False, False, False]

 

 

break

条件を満たしたらfor文(繰り返し)を抜ける

col = "white"
for p in player:
    if p.hp < p.maxhp/4: # 最大HPの1/4未満の場合
        col = "red"
        break # for文(繰り返し)を抜ける
    elif p.hp < p.maxhp/2: # 最大HPの1/2未満の場合
        col = "yellow"
        # 条件を満たしても繰り返す
print(col)

# 結果
# red

 

 

reversed

リストの要素を逆順に取得

あまり使いませんが、
ハマってしまったバグがあるので
残しておきます。

for p in player:
    print(p.name)
# 結果
# ハロ1
# ハロ2
# ハロ3
# ハロ4

player[1].hp = 0 # ハロ2
player[2].hp = 0 # ハロ3

for p in reversed(player): # player[3],player[2],player[1],player[0]の順
    if p.hp == 0: # 生存していないオブジェクトは消す
        player.remove(p)
for p in player:
    print(p.name)

# 結果
# ハロ1
# ハロ4

 

参考

for p in player:
    print(p.name)
# 結果
# ハロ1
# ハロ2
# ハロ3
# ハロ4

player[1].hp = 0 # ハロ2
player[2].hp = 0 # ハロ3

for p in player: # player[0],player[1],player[2],player[3]の順
    if p.hp == 0:
        player.remove(p)
for p in player:
    print(p.name)

# 結果
# ハロ1
# ハロ3 ← HP=0でも消せていない
# ハロ4

 

for文の中でplayer[2](ハロ3)を確認しているのか?

for p in player:
    print(p.name)
    if p.hp == 0:
        player.remove(p)

# 結果(ハロ3を確認していない)
# ハロ1
# ハロ2
# ハロ4

for文の途中でリストから要素を削除すると
インデックスがずれる為と思われます。

reversedで逆順にすると

for p in reversed(player):
    print(p.name)
    if p.hp == 0:
        player.remove(p)

# 結果(全て確認しているので、HP=0のハロ3も削除される)
# ハロ4
# ハロ3
# ハロ2
# ハロ1

 

 

最後に

Pythonのfor文について
よく使っている・今後使いそうな構文・関数を
まとめました。

for文に関して、他にも便利なものが
多くありそうなので
今後も加筆修正していこうと思います。

 

 

-CODE, Python
-, , , , , , , , , , , , ,

Copyright© kerublog , 2022 All Rights Reserved Powered by STINGER.