据我所知,列表生成器比使用.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
)。
答案 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)]