こちらでPythonを使ってRPGを作成しています。
この中でよく使ったり、まだ使っていないけど
便利そうで、今後使いそうな構文や関数などを(自分用に)まとめます。
今回は一番よく使ってそうなfor文についてまとめました。
まだ実際には使っていない構文もありますが
今後のために記載しておきます。
目次
準備
前提として
以下のプログラムを利用します。
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文に関して、他にも便利なものが
多くありそうなので
今後も加筆修正していこうと思います。