如何正确组合函数和列表生成器?

时间:2019-09-23 13:22:40

标签: python

据我所知,列表生成器比使用.append()快一点。因此,我只是很感兴趣如何使用该生成器来实现此代码。重要的是,我需要最后获得清单。

这是原始脚本:

x=4
def factorial(n):
    f=1
    list = []
    for n in range(1, n+1):
        f = f * n
        list.append(f)
    return list
testList = factorial (x)
for i in range(x): print(testList[i], end = ' ')

我已经尝试过了:

f=1
n=4
def fun(n):
    f=f*n
    return f
testList = [fun(f) for n in range(1, n+1)]

,这绝对不是做到这一点的方法(程序说未声明函数f中的内容。总的来说……只是尝试进行此测试) 也尝试过这个:

testList = [lambda f : f*n for n in range(1, n+1)]

但是我通过这种方式得到的只是函数列表。我可以得到阶乘,但不是应该的样子。

这对我来说有点问题,因为有一个缓冲区变量(原始脚本中为f)。

3 个答案:

答案 0 :(得分:3)

您可以使用global关键字以这种方式实现它:

f = 1
n = 4

def fun(n):
    global f
    f = f * n
    return f

testList = [fun(n) for n in range(1, 10+1)]
print(testList)

# [1, 2, 6, 24, 120, 720, 5040, 40320, 362880, 3628800]

答案 1 :(得分:3)

在计划于下个月发布的即将发布的Python 3.8中,新的赋值运算符:=使得可以使用列表理解来生成序列:

p = 1
output = [(p := p * i) for i in range(1, n + 1)]

答案 2 :(得分:1)

您的第一个示例就在附近,您只需要进行两个调整:

  • 您需要将n而不是f传递给fun
  • 您需要使用global来确保您在函数中引用的f是在函数外部声明的f。否则,f将不会在列表生成器的每次迭代中更新。
    f=1
    n=4
    def fun(n):
        global f
        f=f*n
        return f
    testList = [fun(n) for n in range(1, n+1)]