2015-08-26 129 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 !.我喜欢多种解决方案来解决一个问题。 –

相关问题