在列表理解中遇到生成器问题

Having trouble with generator in list comprehension

我正在尝试在 codefights 中完成一项挑战,但我似乎被困在了:

SyntaxError: Generator expression must be parenthesized if not sole argument

当我执行

def magicNumber(n):
    return [i for i in itertools.takewhile
                       (lambda x: x % d for d in [3,5,7] == 0, range(0,n))]

挑战是:考虑唯一的质因数是 3、5 和 7。编写程序找出其中第 n 大的数。

示例输出:

我知道我离解决这个问题还很远,我只是想知道这里的问题是什么。

您需要添加括号:

takewhile(lambda x: (x % d for d in [3,5,7] == 0), range(0,n))

请注意,您的原始代码被解析为:

takewhile((lambda x: x % d) for d in [3,5,7] == 0, range(0,n))

即解析器认为你正在创建一个生成器,生成 lambdas 作为 takewhile 的第一个参数。你正在用两个参数对 takewhile 进行函数调用,这需要在生成器周围加上括号,所以如果你真的想这样做,你必须写:

takewhile(((lambda x: x % d) for d in [3,5,7] == 0), range(0,n))

您需要将生成器表达式放在 lambda 函数中的括号中,我认为您还需要检查 x % d 的结果是否等于零:

lambda x: (x % d==0 for d in [3,5,7])