通常我们必须(1)声明一个列表(2)使用sum()
Python:如何先计算一个列表的总和而不先创建整个列表?
计算该列表的总和但现在我希望指定列表从1开始和间隔4,100个元件,这样:
[1,5,9,13,17,21,25,29,33,37,…]
我不想进化得只剩数学公式,所以
(1)如何获得,甚至没有宣布这个名单的总和?
(2)如何快速从列表中的第101个元素到第200个元素求和?
通常我们必须(1)声明一个列表(2)使用sum()
Python:如何先计算一个列表的总和而不先创建整个列表?
计算该列表的总和但现在我希望指定列表从1开始和间隔4,100个元件,这样:
[1,5,9,13,17,21,25,29,33,37,…]
我不想进化得只剩数学公式,所以
(1)如何获得,甚至没有宣布这个名单的总和?
(2)如何快速从列表中的第101个元素到第200个元素求和?
只需使用itertools.count
得到一个计数器和itertools.islice
以获得所需数量的元素(你可以ite评价这些情况,但他们没有创建一个列表):
>>> from itertools import count, islice
>>> sum(islice(count(1, step=4), 100)) # get the first 100 elements and sum them
19900
的islice
还支持启动/停止:
>>> sum(islice(count(1, step=4), 101, 200)) # 101st element to 200th
59499
您可以使用发电机,sum
,以避免造成在第一的列表:
result = sum(x for x in range(1, 401, 4))
由于@Mad物理学家在评论中提到,你甚至都不需要x for x
部分:
result = sum(range(1, 401, 4))
内建类range
的确如您在Python 3中所做的那样。在Python 2中,使用xrange
。代替。例如:
for i in range(1, 401, 4): ...
range
对象不包含完整列表。它只记录开始,结束和步长。迭代器还将记录当前位置。
在Python 2中使用xrange
是很重要的,因为范围函数将返回整个列表,这与您想要的完全相反。
a = range(1, 401, 4)
sum(a)
将计算出您想要的总和并允许您在之后重新使用a
。
上的数字401
的范围的端部的说明是排他性的。有几个常用公式可以获得范围内正确数量的元素。 start + count * step
是我在这里选择的,因为它是最简单的。它也是count
而不是count + 1
元素的最大数字。 start + (count - 1) * step + 1
是将给你count
元素的最小数字的公式。由于您需要100个元素,因此398,399或400的最终值会给出与401相同的结果。
这不是真的准确将Python 3的'range'对象描述为一个生成器。它是一个序列对象,而不是迭代器。除了重用它之外,你可以像'len(range(...))'和'range(...)[index_or_slice]'这样的东西来工作。这对发电机来说是不可能的。 – Blckknght
@Blckknght。它绝对是如果生成器定义了适当的方法。但是你是对的,范围不是发电机,因为你不能在旁边打电话。 –
您无法在生成器对象上定义方法。你可以通过调用一个生成器函数(一个函数中带有'yield'表达式)或者使用生成器表达式来创建一个函数。你可以编写自己的迭代器类,但这与生成器不一样。如果你想拥有'__len__'和'__getitem__'方法,你可能希望你的类型是一个序列(比如'range'),而不是迭代器。 – Blckknght
你可以写一个发电机:
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
为什么要重新发明轮子? –
因为您可以在自定义函数中包含更多内容,例如跳过第20个或模拟[Gregorian Calendar](https://en.wikipedia.org/wiki/Leap_year) – dawg
这不是一个列表中理解和范围传递本身是好的。 –
没问题。请参阅我为其他答案所做的评论。 'x for x in ...'几乎没有必要。 –
它在技术上被称为生成器表达式,而不是理解:http://stackoverflow.com/documentation/python/292/generators#t=201609020956268959493 –