簡體   English   中英

Python函數式編程列表理解功能組成和while循環

[英]Python functional programming list comprehension with function composition and while loop

我正在嘗試強化學習,嘗試使用函數式編程實現簡單的環境。

我有功能step: State, Action -> Stateaction_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)), ...] ,但沒有不必要的評估。

提前致謝。

在這種情況下無法理解,但是您可以創建一個生成器。 在此之前,我還建議您以這樣的方式定義beststep函數:每當最后一個( action )參數為falsy時,它們就會返回falsy(例如FalseNone )。 它將簡化您的代碼。

然后,您可以定義此生成器:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM