2013-05-17 53 views
0

我正在寫一個Python腳本,應該採取函數列表,寫成lambda表達式,並返回所有函數的撰寫,但是,我在腳本中有一個箭頭,也許因爲我使用lambda表達式的方式。這似乎即使我給返回的函數一個數字值,我回來了一個函數,而不是一個數字。這是我寫的:Python的lambda表達式組成迭代器腳本

def compose1(lst): 
    if lst == []: 
     return lambda x: x 
    else: 
     temp = (lst[len(lst)-1]) 
     for i in range(len(lst)-2,-1,-1): 
      temp = lambda x: lst[i](temp) 
     return lambda x: temp 

這是我寫的函數,它說我有一個錯誤tast。

f = compose1([lambda x: x+1, lambda x: x*2, lambda x: x-1]) 
for x in range(10): 
    assert (f(x) == 1 + (x - 1) * 2) 
f = compose1([lambda x: x-1, lambda x: x*2, lambda x: x+1]) 
for x in range(10): 
    assert (f(x) == (x + 1) * 2) - 1 

我會apreciate對這個問題的一些HALP ..這裏 謝謝:)

+0

你的第一個' assert'在表達式周圍有一些虛假的括號。如果你刪除了它們,那麼你可能會注意到第二個'assert'中的圓括號在錯誤的地方。 – Duncan

回答

1

它看起來像你的循環只是重新實現reduce做什麼。下面是你的功能組成問題的功能看看:

def compose1(fnlist): 
    if not fnlist: 
     return lambda x: x 

    # compose 1 function of x from two others 
    def compose2fns(fn1, fn2): 
     return lambda x : fn1(fn2(x)) 
    # or if you really love lambdas 
    # compose2fns = lambda fn1,fn2: lambda x: fn1(fn2(x)) 

    # use reduce to cumulatively apply compose2fns to the functions 
    # in the given list 
    return reduce(compose2fns, fnlist) 

這通過你的測試就好了。

CODE GOLF: 我忍不住了,這裏是一個班輪,甚至包括你的檢查空輸入列表:

compose1 = lambda fnlist: reduce(lambda fn1,fn2: lambda x : fn1(fn2(x)), 
            fnlist or [lambda x:x]) 
1

你的問題是你的邏輯。

for i in range(len(lst)-2,-1,-1): 
    temp = lambda x: lst[i](temp) 
return lambda x: temp 

這將設置temp爲函數。 lst是一個函數列表,lst[i]是一個函數。你稱之爲,給出一個值,然後用lambda創建一個新函數。然後你返回一個給出該函數的函數。

你的返回值是一個函數,它給出了一個函數,它給出一個值,因此是你的問題。

作爲說明,此代碼還有其他問題。例如,if lst == []:應該是if not lst:。您也不應該按照索引進行迭代,而應該按照Python的設計進行迭代。我實際上無法弄清楚你想用你的代碼實現什麼,這顯示了通過索引來讀取迭代是多麼困難。

你的代碼目前做到這一點:

  • 如果沒有值,返回返回第一個參數的函數。
  • 如果有一個值,則返回列表中的函數。
  • 如果有許多值,則返回一個函數,該函數返回一個函數,該函數返回從列表中運行第一個函數而檢索到的第一個值。

我不確定你在做什麼,但我敢肯定,不是這樣。

+0

坦克的幫助。欣賞它。肯定會使用你的服務! –

3
def compose(*funcs): 
    """ 
    compose(func[,...[, func]]) -> function 

    Return the composition of functions. 
    For example, compose(foo, bar)(5) == foo(bar(5)) 
    """ 
    if not all(callable(func) for func in funcs): 
     raise TypeError('argument must be callable') 
    funcs = funcs[::-1] 

    def composition(*args, **kwargs): 
     args = funcs[0](*args, **kwargs) 
     for func in funcs[1:]: 
      args = func(args) 
     return args 
    return composition 

f = compose(*[lambda x: x+1, lambda x: x*2, lambda x: x-1]) 
for x in range(10): 
    assert f(x) == (1 + (x - 1) * 2) 
f = compose(*[lambda x: x-1, lambda x: x*2, lambda x: x+1]) 
for x in range(10): 
    assert f(x) == ((x + 1) * 2) - 1 
+0

對,這就是目標所在。我真的無法解決這個問題,+1。 –

+0

坦克!肯定有很多要學習的腳本! –

0

我喜歡這種語法:

f = do (lambda x: x-1) (lambda x: x*2) (lambda x: x+1) 

for x in range(10): 
    assert f(x) == 1 + (x - 1) * 2 

實現是出奇的簡單:

class do(object): 
    def __init__(self, x): 
     self.fns = [x] 
    def __call__(self, x): 
     if callable(x): 
      self.fns.append(x) 
      return self 
     for f in self.fns: 
      x = f(x) 
     return x 
+0

不錯的一個!謝謝! –