[英]Python functional programming list comprehension with function composition and while loop
我正在嘗試強化學習,嘗試使用函數式編程實現簡單的環境。
我有功能step: State, Action -> State
和action_space: State -> [Action, ...]
。
我在尋找實現的功能迭代組成的函數式編程的方式step
在初始State
s = State()
e = [s]
while action_space(s):
a = best(action_space(s))
s = step(s, a)
e.append(s)
所以我想我需要的是創建理解[f(x) and c(x), f(f(x)) and c(f(x)), f(f(f(x))) and c(f(f(x)), ...]
,但沒有不必要的評估。
提前致謝。
在這種情況下無法理解,但是您可以創建一個生成器。 在此之前,我還建議您以這樣的方式定義best和step函數:每當最后一個( action )參數為falsy時,它們就會返回falsy(例如False
或None
)。 它將簡化您的代碼。
然后,您可以定義此生成器:
def unfold(s):
while s:
yield s
s = step(s, best(action_space(s)))
這具有懶惰的優勢。 您可以像這樣使用它:
e = [s for s in unfold(State())]
要不就:
e = list(unfold(State()))
一種更實用的編程方法可以是以下遞歸函數:
def unfold(s):
return [s] + unfold(step(s, best(action_space(s)))) if s else []
e = unfold(State())
如果您發現煩人的命名函數的需要,可以嘗試以下技巧:
e = (lambda unfold:lambda s:unfold(unfold,s))(
lambda unfold, s: [s] + unfold(unfold, step(s, best(action_space(s)))) if s else []
)(State())
但是,這是相當模糊的。 立即調用第一個函數,並用另一個函數作為參數(第二行中的那個):實際的展開函數,它的名稱是第一個函數的參數名。
然后,第一個函數返回另一個函數( lambda s:unfold(unfold,s)
),該函數接受state參數,並使用它調用unfold 。 我們還立即調用該函數,並向其傳遞初始值State()
。
請注意, 展開本身也將自身傳遞到遞歸樹下,以使其保持在范圍內。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.