繁体   English   中英

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

[英]Invalid syntax when trying to map(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()行中的第一个,我遇到了语法错误。

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(..)被认为是一种不良样式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]并希望通过对每个元素应用函数将其转换为另一个具有相同长度的序列的情况下,使用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()还可以通过在输入序列上重复应用相同的函数,将多个序列(通常具有相同的长度)转换为单个序列。

语法错误是由不完整的“如果不是”逻辑引起的,其中需要一个“ 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]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM