请问如何用 Python 实现如下计算功能

2019-01-03 10:11:17 +08:00
 talentl
对于列表中的所有数,计算 2 的 i 次幂的和
比如
range (1,5)
sum= 2^1+2^2+2^3+2^4+2^5

刚开始学习,可能问题很初级,还望不吝赐教,非常感谢
3644 次点击
所在节点    Python
40 条回复
metaquant
2019-01-03 10:14:24 +08:00
sum([x**x for x in range(1,6)])
metaquant
2019-01-03 10:15:25 +08:00
好吧,看错了,底数都是 2,那就是 sum([2**x for x in range(1,6)])
Trim21
2019-01-03 10:15:32 +08:00
用内置的 map 函数

d = list(range(1, 5))
print(list(map(lambda x: 2 ** x, d)))
hflyf123
2019-01-03 10:17:09 +08:00
res = 0
for i in range(1, 5):
res += 2 ** i
print(res)
你问的时候心里应该就有答案了
aijam
2019-01-03 10:20:15 +08:00
sum(2**x for x in range(1,6))
xpresslink
2019-01-03 10:30:17 +08:00
>>> from functools import reduce
>>> reduce(lambda x,y: x+2**y, range(1,6), 0)
62
talentl
2019-01-03 10:47:35 +08:00
@Trim21 您这个方法只能打印计算次幂的结果,没有相加
talentl
2019-01-03 10:48:43 +08:00
@metaquant
@aijam
@xpresslink
可以的,谢谢解答
talentl
2019-01-03 10:49:42 +08:00
@hflyf123
我按你的建议执行的时候这样报错,哪里不对吗:

File "<ipython-input-16-74b7a4201d82>", line 3
res += 2 ** i
^
IndentationError: expected an indented block
shoujiaxin
2019-01-03 10:53:18 +08:00
等比数列求和公式?
ModerRAS
2019-01-03 10:54:07 +08:00
@talentl 其实是他这一行忘记加四个空格了
hflyf123
2019-01-03 10:55:52 +08:00
@talentl 复制进来的时候缩进不对啦,自己注意下
HuahuaWang
2019-01-03 10:58:48 +08:00
2^(i+1)-1
talentl
2019-01-03 11:01:30 +08:00
@hflyf123
@ModerRAS
我加了缩进以后可以执行成功,不过
range 是( 1,5 )的时候,得到的结果是 30,实际上应该是 2+4+8+16+32=62 才对
这要怎么理解呢?
talentl
2019-01-03 11:07:12 +08:00
@talentl
@hflyf123
@ModerRAS
我又翻了手册,(1,5)=(1,2,3,4)
没有问题了,多谢耐心解答
Cooky
2019-01-03 11:23:20 +08:00
@HuahuaWang 是 2^(i+1)-2
talentl
2019-01-03 15:09:30 +08:00
@HuahuaWang
@Cooky
这个写法好像只对从 1 开始的连续数列有效,不能适应其他变化
ivamp
2019-01-03 15:12:03 +08:00
python3.6 版本
-------------------------------------------------
from functools import reduce

c = 0
a = range(1, 6)
print(list(a))
for x in list(a):
b = 2 ** x
c += b
print('方法 1:', c)

d = sum(list(2**x for x in range(1, 6)))
print('方法 2:', d)

e = sum([2**x for x in range(1, 6)])
print('方法 3:', e)

f = sum(map(lambda x: 2**x, range(1, 6)))
print('方法 4:', f)

g = reduce(lambda x, y: x+y, [2**x for x in range(1, 6)])
print('方法 5:', g)
----------------------------------------------------------------------------------------
下面是打印结果:
[1, 2, 3, 4, 5]
方法 1:62
方法 2:62
方法 3:62
方法 4:62
方法 5:62
czhuyu
2019-01-03 15:41:32 +08:00
为啥不用位运算呢
talentl
2019-01-03 15:46:50 +08:00
@czhuyu 请问是怎么用的?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/523355

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX