通常我们必须(1)声明一个列表(2)使用sum()
计算此列表的总和
但现在我希望指定一个列表以1开头,间隔4,100个元素,如下所示:
[1,5,9,13,17,21,25,29,33,37,…]
我不想涉及数学公式,所以
(1)如何在没有声明此列表的情况下获得总和?
(2)如何快速从该列表的第101个元素到第200个元素求和?
答案 0 :(得分:2)
内置类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相同的结果。
答案 1 :(得分:2)
只需使用itertools.count
获取计数器,itertools.islice
即可获得所需数量的元素(您可以迭代这些实例但不创建列表!):
>>> 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
答案 2 :(得分:1)
您可以使用sum
生成器来避免首先创建列表:
result = sum(x for x in range(1, 401, 4))
正如@Mad Physicist在评论中提到的,你甚至不需要x for x
部分:
result = sum(range(1, 401, 4))
答案 3 :(得分:1)
你可以写一个发电机:
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