Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/grails/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用列表理解创建阶乘列表_Python_List Comprehension - Fatal编程技术网

Python 使用列表理解创建阶乘列表

Python 使用列表理解创建阶乘列表,python,list-comprehension,Python,List Comprehension,我正试图建立一个前十个因子的列表 [1,1,2,6,24,120,720,5040,40320,362880] 仅使用列表理解。可能吗 我不知道生成器或lambda 这是我的尝试,但我完全知道为什么它是错误的: lst = [1] + [i for i in range(1,10)] lst[1:10] = [lst[i-1] * i for i in range(1,10)] print(lst) 您可以使用: 输出: >>> import math >>&g

我正试图建立一个前十个因子的列表

[1,1,2,6,24,120,720,5040,40320,362880]
仅使用列表理解。可能吗

我不知道生成器或
lambda

这是我的尝试,但我完全知道为什么它是错误的:

lst = [1] + [i for i in range(1,10)]
lst[1:10] = [lst[i-1] * i for i in range(1,10)]
print(lst)
您可以使用:

输出:

>>> import math
>>> 
>>> [math.factorial(n) for n in range(10)]
[1, 1, 2, 6, 24, 120, 720, 5040, 40320, 362880]
您可以使用:

输出:

>>> import math
>>> 
>>> [math.factorial(n) for n in range(10)]
[1, 1, 2, 6, 24, 120, 720, 5040, 40320, 362880]

您的尝试不起作用,因为列表理解在元素方面起作用,您不能像这样引用
lst[i-1]
。在
math
模块中有一个
factorial
函数,但是,由于您提到了生成器,您可以使用这样一个

def mygenerator():
    total = 1
    current = 1
    while True:
        total *= current
        yield total
        current += 1

factorial = mygenerator()
output = [next(factorial) for i in range(10)]

您的尝试不起作用,因为列表理解在元素方面起作用,您不能像这样引用
lst[i-1]
。在
math
模块中有一个
factorial
函数,但是,由于您提到了生成器,您可以使用这样一个

def mygenerator():
    total = 1
    current = 1
    while True:
        total *= current
        yield total
        current += 1

factorial = mygenerator()
output = [next(factorial) for i in range(10)]
只是为了好玩:

一个使用列表理解和辅助累加器(生成的列表本身)的线性mega hack可以重用以前计算的值

s=[];  s=[s[-1] for x in range(1,10) if not s.append(x*s[-1] if s else 1)]
结果:

[1, 2, 6, 24, 120, 720, 5040, 40320, 362880]
注意:
math.factorial
答案是元素随机时的答案。这里速度更快,因为我们可以重用以前的结果

还有另一个缺点:需要将所有元素存储在
列表中,因为python不允许
if
和赋值,就像C一样。因此,我们必须附加到一个列表中,并否定
None
,如果
test为
True

正如我所说:很有趣,但仍然是一个黑客。

只是为了好玩:

一个使用列表理解和辅助累加器(生成的列表本身)的线性mega hack可以重用以前计算的值

s=[];  s=[s[-1] for x in range(1,10) if not s.append(x*s[-1] if s else 1)]
结果:

[1, 2, 6, 24, 120, 720, 5040, 40320, 362880]
注意:
math.factorial
答案是元素随机时的答案。这里速度更快,因为我们可以重用以前的结果

还有另一个缺点:需要将所有元素存储在
列表中,因为python不允许
if
和赋值,就像C一样。因此,我们必须附加到一个列表中,并否定
None
,如果
test为
True


正如我所说:很有趣,但仍然是一种技巧。

我们也可以使用我们自己的功能,但是,嘿,理解列表的含义丢失了一点,但它仍然是功能性的

def factorialIte(n):
  factorial = 1
  for i in range(1,n+1):
    factorial = factorial*i
return factorial
# 10 is n_max
[factorialIte(n) for n in range(1,11)]
>>[1, 2, 6, 24, 120, 720, 5040, 40320, 362880, 3628800]

我们也可以使用我们自己的函数,但是,嘿,理解列表的含义丢失了一点,但它仍然是功能性的

def factorialIte(n):
  factorial = 1
  for i in range(1,n+1):
    factorial = factorial*i
return factorial
# 10 is n_max
[factorialIte(n) for n in range(1,11)]
>>[1, 2, 6, 24, 120, 720, 5040, 40320, 362880, 3628800]


我建议显示一些尝试编写一个函数来计算数字的阶乘(
def fact(n):…return res
),然后使用一个列表理解,如:
[fact(x)for x in range(10)]
@Ev.Kounis可能OP要求我们给他写一个不使用任何函数的列表理解;)我建议显示一些尝试编写一个函数来计算数字的阶乘(
def fact(n):…return res
),然后使用一个列表理解,如:
[fact(x)for x in range(10)]
@Ev.Kounis可能OP要求我们给他写一个不使用任何函数的列表理解;)是的,Python附带了电池:)虽然这非常简洁,但计算
n
的大值可能要慢得多,因为每次调用
math.factorial(n)
都会重新计算0的所有中间值!到(n-1)!每次调用它。是的,Python都附带电池:)虽然这非常简洁,但计算
n
的大值可能要慢得多,因为每次调用
math.factorial(n)
都会重新计算0的所有中间值!到(n-1)!每次调用它。这个时间友好吗?是的,与递归解决方案相反。它不会重新计算值。它给出了高达500的阶乘!不到一秒钟。使用递归解决方案,您无法达到20@AkinjideBankole此解决方案计算
n(n-1)已经计算过,不会再次执行。所以,是的。对于大n值,内置的
math.factorial()
对时间更友好,这应该更快?是的,与递归解决方案相比。它不会重新计算值。它给出了高达500的阶乘!不到一秒钟。使用递归解决方案,您无法达到20@AkinjideBankole此解决方案计算
n(n-1)已经计算过,不会再次执行。所以,是的。内置的
math.factorial()
用于大n值应该更快这也是我的想法☺. 3.只有2个!*3和2!是列表中到目前为止的最后一个元素,为3!即将进行计算。这并不需要同时使用
aux
s
变量,只需以这种方式编写第二部分:
aux=[aux[-1]对于范围(1,10)内的x,如果没有…
或仅使用
s
:)这也是我的想法☺. 3!只是2!*3和2!是到目前为止,当3!即将被计算时列表上的最后一个元素。这实际上并不需要
aux
s
变量,只需这样写第二部分:
aux=[aux[-1]表示范围内的x(1,10),如果没有…
,或者只使用
s
:)