尝试映射时语法无效(lambda ..)

时间:2016-07-05 17:02:16

标签: python lambda

我正在编写一个循环遍历数字列表的函数,并返回每个数字的除数之和的列表。我试图稍微削减我的功能,同时学习map(lambda..)

def DoWork(nums):
    sums = []
    for n in nums:
        divisors = []
        map(lambda i: divisors.append(i) if not (n%i), range(1,n+1))
        sums.append(sum(divisors))
    return sums

我遇到语法错误,关于,行中的第一个map()

3 个答案:

答案 0 :(得分:2)

python lambda无法正常工作。它应该是一个简单的替代函数,它接受一个值并返回另一个值。您不能在其中隐藏if条件。

updated_range = filter(lambda x: not n%x, range(1,n+1))
map(lambda i: divisors.appens(i), updated_range)
#The above code is a bad style. See below!

注意:通常,lambdas不会修改外部状态。调用divisors.append(..)

被认为是一种不好的风格

改进版本#1:

updated_range = filter(lambda x: not n%x, range(1,n+1))
map(lambda i: divisors.append(i), updated_range)

改进版本#2(修复不修改外部状态的lambda):

updated_range = filter(lambda x: not n%x, range(1,n+1))
divisors = map(lambda i: i, updated_range)
#(lambda i: i) is an identity function: returns whatever we give it.
#Sort of useless, though.

改进版本#3(更多pythonic!):

divisors = [x for x in range(1, n+1) if not n%x]

答案 1 :(得分:2)

通常情况下,我们在有一系列事物[1]的情况下使用map(),并希望通过将函数应用于每个元素,将其转换为另一个相同长度的序列。

你仍然可以用它来找到除数的总和,但我认为它不是最合适的工具。

相反,让我向您展示如何通过从稍微不同的角度查看问题来应用maplambda

首先,让我们重写你的函数以使用列表理解:

def DoWork(nums):
    sums = []
    for n in nums:
        divisors = [i for i in range(1, n+1) if not n % i]
        sums.append(sum(divisors))
    return sums

现在观察divisors列表是不必要的并且可以消除:

def DoWork(nums):
    sums = []
    for n in nums:
        sums.append(sum(i for i in range(1, n+1) if not n % i))
    return sums

现在,我们可以轻松地将整个函数转换为map()的单个调用:

def DoWork(nums):
    return map(lambda n: sum(i for i in range(1, n+1) if not n % i), nums)

[1] map()也可用于通过在输入序列中重复应用相同的函数,将多个序列(通常具有相同的长度)转换为单个序列。

答案 2 :(得分:1)

语法错误从不完整的'if not'逻辑上升,其中需要'else'子句。

def DoWork(nums):
    sums = []
    for n in nums:
        divisors = []
        map(lambda i: divisors.append(i) if not (n%i) else 1, range(1,n+1))
        sums.append(sum(divisors))
    return sums

无错执行......

DoWork(range(0,10))
[0, 1, 3, 4, 7, 6, 12, 8, 15, 13]