2015-08-26 167 views
-2

我正在做在線教程,並且找到了python程序,它返回一個帶有2元組的列表。每個元組都由一個訂單號和價格pere項目和數量的乘積組成。如果訂單的價值小於100.00,產品應增加10.00定義函數名稱而不是lambda

爲了我自己的理解,我希望通過用函數名稱重新定義程序進行復制。

orders = [ ["34587","Learning Python, Mark Lutz", 4, 40.95], 
      ["98762","Programming Python, Mark Lutz", 5, 56.80], 
       ["77226","Head First Python, Paul Barry",3,32.95]] 

min_order = 100 
invoice_totals = list(map(lambda x: x if x[1] >= min_order else (x[0], x[1] + 10) , 
       map(lambda x: (x[0],x[2] * x[3]), orders))) 

print(invoice_totals) 

這就是我到目前爲止所得到的結果。

def get_order(L): 
    invoice_totals= [] 
    for item in range(len(L)): 
     ordernum = L[item][0], 
     if (L[item][2] * L[item][3])>= min_order: 
      invoice_totals= ordernum, (L[item][2] * L[item][3]) 
     else: 
      invoice_totals= ordernum, (L[item][2] * L[item][3]) + 10 
     print(invoice_totals  ) 


if __name__ == '__main__': 
    get_order(orders) 
+7

問題是什麼? –

+0

如果您要通過定義函數名稱複製上述lambda解決方案,您將如何接近替代方案 –

回答

0

我會被 「點名」 的匿名函數開始:

min_order = 100 

l1 = lambda x: x if x[1] >= min_order else (x[0], x[1] + 10) 
l2 = lambda x: (x[0], x[2] * x[3]) 

invoice_totals = list(map(l1, map(l2, orders))) 

map(l1, map(l2, orders))基本上是map(l1 of l2, orders),其中l1 of l2是函數組合。您的最終功能是兩個剛剛組成:

min_order = 100 

l1 = lambda x: x if x[1] >= min_order else (x[0], x[1] + 10) 
l2 = lambda x: (x[0], x[2] * x[3]) 
l3 = lambda x: l1(l2(x)) 

invoice_totals = list(map(l3, orders)) 

或者:

def l1(x): 
    if x[1] >= min_order: 
     return x # you could also say `return (x[0], x[1])` 
    else: 
     return (x[0], x[1] + 10) 

def l2(x): 
    return (x[0], x[2] * x[3]) 

def l3(x): 
    return l1(l2(x)) 

因此,您的最終功能是:

def l3(x): 
    if x[2] * x[3] >= min_order: 
     return (x[0], x[2] * x[3]) 
    else: 
     return (x[0], x[2] * x[3] + 10) 

這基本上是你所擁有的。要解決你的代碼,你需要做的幾件事情:

  • 這條線:

    ordernum = L[item][0], 
    

    等同於:

    ordernum = (L[item][0],) 
    

    這是不是真的你想要什麼ORDERNUM成爲。擺脫逗號。

  • 您可以定義invoice_totals = [],但是您會在if語句中覆蓋它。您需要將總的每個項目添加到您的列表:

    def get_order(L): 
        invoice_totals = [] 
    
        for item in range(len(L)): 
         ordernum = L[item][0] 
    
         if (L[item][2] * L[item][3])>= min_order: 
          total = L[item][2] * L[item][3] 
         else: 
          total = L[item][2] * L[item][3] + 10 
    
         invoice_totals.append((ordernum, total)) 
    
        return invoice_totals 
    
  • 在這一點上,你也可以簡化代碼:

    def compute_totals(orders): 
        totals = [] 
    
        for order, description, quantity, price in orders: 
         total = quantity * price 
    
         if total < min_order: 
          total += 10 
    
         totals.append((order, total)) 
    
        return totals 
    
+0

非常感謝Blender !.我喜歡多種解決方案來解決一個問題。 –

相關問題