我猜這個問題會被否決,但我真的可以使用幫助。出于研究目的,我在 oTree 中撰寫了一個游戲,下面的代碼完全符合我的意圖。問題是有些游戲有超過 100 輪,所以你可以看到代碼是如何變得荒謬的長。對于將來要使用此代碼的人來說,目前的形式實際上是不可讀的。關于如何將其濃縮為更簡單的 if 陳述句的任何想法?
如果您不熟悉 oTree,“參與者”能指本質上是一種跨輪傳遞資料的方式。“玩家”反映了特定于一個回合數的參與者。所以每一輪我都需要保存他們當前的回合回報(player.r#)并呼叫所有過去回合的回報(participant.r#-1)。
if subsession.round_number == 1:
participant = player.participant
participant.r1 = round(100 * asset, 3) 100
player.r1 = participant.r1
elif subsession.round_number == 2:
participant = player.participant
participant.r2 = round(participant.r1 * asset, 3) participant.r1
player.r1 = participant.r1
player.r2 = participant.r2
elif subsession.round_number == 3:
participant = player.participant
participant.r3 = round(participant.r2 * asset, 3) participant.r2
player.r1 = participant.r1
player.r2 = participant.r2
player.r3 = participant.r3
elif subsession.round_number == 4:
participant = player.participant
participant.r4 = round(participant.r3 * asset, 3) participant.r3
player.r1 = participant.r1
player.r2 = participant.r2
player.r3 = participant.r3
player.r4 = participant.r4
elif subsession.round_number == 5:
participant = player.participant
participant.r5 = round(participant.r4 * asset, 3) participant.r4
player.r1 = participant.r1
player.r2 = participant.r2
player.r3 = participant.r3
player.r4 = participant.r4
player.r5 = participant.r5
uj5u.com熱心網友回復:
你可以使用getattrandsetattr來避免 ifs。
getattr(self, name) # equal to: self.name
setattr(self, name, value) # equal to: self.name = value
最終代碼將類似于:
r_n = subsession.round_number
participant = player.participant
setattr(participant, 'r' str(r_n), round(getattr(participant, 'r' str(r_n - 1)) * asset, 3) getattr(participant, 'r' str(r_n - 1))
for i in range(1, r_n 1):
player_id = 'r' str(i)
setattr(player, player_id, getattr(participant, 'r' str(player_id)))
UPD:不要忘記為 r1 添加條件。如果我們試圖避免,就會突然出現:D
uj5u.com熱心網友回復:
我知道字典經常使用 switch 陳述句,所以需要研究一下。如果你不知道什么是 switch 陳述句;它們類似于 if 陳述句,它們是條件代碼塊。但不是檢查布林值,而是檢查某個變數是否是某種情況。Python 沒有 switch 陳述句,但可以使用字典作為替代。
uj5u.com熱心網友回復:
if這是一個與您的陳述句中的代碼執行相同操作的函式。它使用 Python 負索引參考最后兩輪(以將第一輪作為特殊情況處理的方式)。對于給定的一輪,它只需要呼叫一次。
def update(player, asset, round_number):
attrs = tuple(f'r{i}' for i in range(1, round_number 1)) # ('r1', 'r2', 'r3', ...)
if len(attrs) < 2:
participant = player.participant
participant.r1 = round(100 * asset, 3) 100
player.r1 = participant.r1
else:
participant = player.participant
prev_particpant = getattr(participant, attrs[-2])
setattr(participant, attrs[-1], round(prev_particpant*asset, 3) prev_particpant
for attr in attrs:
setattr(player, attr, getattr(participant, attr)
我認為最好在每個玩家中保留一個單一的回合資訊串列,而不是為每個玩家單獨命名實體屬性(即,,,,...... .r1)。如果沒有別的,它會使復制它們變得更加容易。.r2.r3
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/457683.html
