Python:如何在不首先创建整个列表的情况下计算列表的总和?

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在评论中提到的,

通常我们必须(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在评论中提到的,您甚至不需要
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