我正在编写一个循环遍历数字列表的函数,并返回每个数字的除数之和的列表。我试图稍微削减我的功能,同时学习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()
。
答案 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()
,并希望通过将函数应用于每个元素,将其转换为另一个相同长度的序列。
你仍然可以用它来找到除数的总和,但我认为它不是最合适的工具。
相反,让我向您展示如何通过从稍微不同的角度查看问题来应用map
和lambda
。
首先,让我们重写你的函数以使用列表理解:
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]