@shiracamus さんに教えていただいた内包表記が
かっこよかったので自分も使って見ました。
リスト内包表記を使用しない場合
# 麻雀牌のクラス
class Tile:
def __init__(self, kind, value, pic):
self.kind = kind # 麻雀牌の種類(萬子・筒子・索子・四風牌・三元牌)
self.value = value # 麻雀牌の値(1~9 東南西北白発中)
self.pic = pic #画像ファイル名
def __repr__(self):
return f'{self.kind}, {self.value}, {self.pic}\n'
# 山牌 シャッフルされた136個のTileオブジェクトリストを返却
def create_yamahai():...
yamahai = create_yamahai() #山牌作成
haipai = [] #配牌リスト
for i in range(14):
tile = yamahai.pop(0) #山牌から一つ取り出す
haipai.append(tile) #配牌リストに加える
print(haipai) #出力!
この書き方でも配牌リストを作成するっていう目標は達成できているんですが、
forループにせずにリスト内包表記で書きたいと思います。
※ちなみにですが、Tileクラスに __repr__メソッド を作成すると
printメソッドで出力するときに各オブジェクトの__repr__メソッドの結果を
出力するみたいです。
参照:https://gammasoft.jp/blog/use-diffence-str-and-repr-python/
リスト内包表記を使用した場合
リスト内包表記を使用した場合、配牌リストを一行で作成することができます。
変更前.py
haipai = [] #配牌リスト
for i in range(14):
tile = yamahai.pop(0) #山牌から一つ取り出す
haipai.append(tile) #配牌リストに加える
変更後.py
haipai = [yamahai.pop(0) for i in range(14)] # 配牌リスト
ずいぶんスッキリしました!
yamahai.pop(0) 処理を
for i in range(14)ループ内にて実行する。
って意味になるんですね。
おまけ
PyCharmだと、リスト内包表記をforループに変換する機能があるみたいです。
これが
↓
こうなる
最近のIDEツールはほんとにいろんな機能がありますね。