Python:如何在不首先创建整个列表的情况下计算列表的总和?
通常我们必须(1)声明一个列表(2)使用Python:如何在不首先创建整个列表的情况下计算列表的总和?,python,list,sum,yield,Python,List,Sum,Yield,通常我们必须(1)声明一个列表(2)使用sum() 但现在我想指定一个列表,以1开头,间隔4100个元素,如下所示: [1,5,9,13,17,21,25,29,33,37,…] 我不想讨论数学公式,所以 (1) 如何在不声明此列表的情况下获取总和 (2) 如何快速从列表的第101个元素到第200个元素求和 您可以将生成器与sum一起使用,以避免首先创建列表: result = sum(x for x in range(1, 401, 4)) 正如@Mad physician在评论中提到的,
sum()
但现在我想指定一个列表,以1开头,间隔4100个元素,如下所示:
[1,5,9,13,17,21,25,29,33,37,…]
我不想讨论数学公式,所以
(1) 如何在不声明此列表的情况下获取总和
(2) 如何快速从列表的第101个元素到第200个元素求和
您可以将生成器与
sum
一起使用,以避免首先创建列表:
result = sum(x for x in range(1, 401, 4))
正如@Mad physician在评论中提到的,您甚至不需要x for x
部分:
result = sum(range(1, 401, 4))
内置类的功能与Python 3中的功能完全相同。在Python2中,使用。相反例如:
for i in range(1, 401, 4): ...
范围
对象不包含完整列表。它只记录开始、结束和步长。迭代器还将记录当前位置
在Python2中使用xrange
非常重要,因为range函数将返回整个列表,这与您想要的正好相反
a = range(1, 401, 4)
sum(a)
将计算您想要的总和,并允许您在以后重用a
关于401号的注释
范围的末尾是独占的。有两个常用公式可以获得范围内正确的元素数<代码>开始+计数*步骤是我在这里选择的步骤,因为它最简单。它也是将
count
而不是count+1
元素赋予范围的最大数字<代码>开始+(计数-1)*步骤+1是将为您提供count
元素的最小数字的公式。由于需要100个元素,因此结束值398、399或400将得到与401相同的结果 您可以编写生成器:
def ir(start=1, end=400, step=4):
while True:
yield start
start+=step
if start>=end: break
或者,如果需要特定数量的元素:
def ir(start=1, n=100, step=4):
cnt=0
while True:
yield start
cnt+=1
start+=step
if cnt>=n: break
然后求和:
>>> sum(ir())
19900
只需使用获取计数器和所需数量的元素(您可以迭代这些实例,但它们不会创建列表!):
islice
还支持启动/停止:
>>> sum(islice(count(1, step=4), 101, 200)) # 101st element to 200th
59499
这不是一个列表,通过范围本身是好的。没问题。另一个答案见我的评论<代码>x代表x英寸代码>几乎从来都不是必需的。从技术上讲,它被称为生成器表达式,而不是理解:为什么要重新发明轮子?因为你可以在自定义函数中包含更多的内容,比如skip ever 20或simulate the,将Python 3的
范围
对象描述为生成器并不准确。它是一个序列对象,不是迭代器。除了重用它之外,您还可以执行len(range(…)
和range(…)[index\u或\u slice]
之类的操作,并且可以正常工作。这在发电机上是不可能的。@Blckknght。如果生成器定义了适当的方法,则绝对是这样。但您是对的,range不是生成器,因为您不能对它调用next。您不能在生成器对象上定义方法。您可以通过调用生成器函数(其中包含yield
表达式的函数)或使用生成器表达式来创建一个。您可以编写自己的迭代器类,但这与生成器不同。如果你想拥有\uu len\uuuuuu
和\uuuu getitem\uuuuu
方法,你可能希望你的类型是一个序列(比如range
is),而不是一个迭代器。@Blckknght如果你用\uuu调用方法定义一个类,它会产生,我们很清楚,我将修正我的答案,因为我基本上同意你的观点。只是在手机上超慢
>>> sum(islice(count(1, step=4), 101, 200)) # 101st element to 200th
59499