请问如何用 Python 实现如下计算功能 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
talentl
V2EX    Python

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

  •  1
     
  •   talentl 2019-01-03 10:11:17 +08:00 4039 次点击
    这是一个创建于 2475 天前的主题,其中的信息可能已经有所发展或是发生改变。
    对于列表中的所有数,计算 2 的 i 次幂的和
    比如
    range (1,5)
    sum= 2^1+2^2+2^3+2^4+2^5

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

    d = list(range(1, 5))
    print(list(map(lambda x: 2 ** x, d)))
    hflyf123
        4
    hflyf123  
       2019-01-03 10:17:09 +08:00
    res = 0
    for i in range(1, 5):
    res += 2 ** i
    print(res)
    你问的时候心里应该就有答案了
    aijam
        5
    aijam  
       2019-01-03 10:20:15 +08:00
    sum(2**x for x in range(1,6))
    xpresslink
        6
    xpresslink  
       2019-01-03 10:30:17 +08:00   1
    >>> from functools import reduce
    >>> reduce(lambda x,y: x+2**y, range(1,6), 0)
    62
    talentl
        7
    talentl  
    OP
       2019-01-03 10:47:35 +08:00
    @Trim21 您这个方法只能打印计算次幂的结果,没有相加
    talentl
        8
    talentl  
    OP
       2019-01-03 10:48:43 +08:00
    @metaquant
    @aijam
    @xpresslink
    可以的,谢谢解答
    talentl
        9
    talentl  
    OP
       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
        10
    shoujiaxin  
       2019-01-03 10:53:18 +08:00 via iPhone
    等比数列求和公式?
    ModerRAS
        11
    ModerRAS  
       2019-01-03 10:54:07 +08:00
    @talentl 其实是他这一行忘记加四个空格了
    hflyf123
        12
    hflyf123  
       2019-01-03 10:55:52 +08:00
    @talentl 复制进来的时候缩进不对啦,自己注意下
    HuahuaWang
        13
    HuahuaWang  
       2019-01-03 10:58:48 +08:00
    2^(i+1)-1
    talentl
        14
    talentl  
    OP
       2019-01-03 11:01:30 +08:00
    @hflyf123
    @ModerRAS
    我加了缩进以后可以执行成功,不过
    range 是( 1,5 )的时候,得到的结果是 30,实际上应该是 2+4+8+16+32=62 才对
    这要怎么理解呢?
    talentl
        15
    talentl  
    OP
       2019-01-03 11:07:12 +08:00
    @talentl
    @hflyf123
    @ModerRAS
    我又翻了手册,(1,5)=(1,2,3,4)
    没有问题了,多谢耐心解答
    Cooky
        16
    Cooky  
       2019-01-03 11:23:20 +08:00 via Android
    @HuahuaWang 是 2^(i+1)-2
    talentl
        17
    talentl  
    OP
       2019-01-03 15:09:30 +08:00
    @HuahuaWang
    @Cooky
    这个写法好像只对从 1 开始的连续数列有效,不能适应其他变化
    ivamp
        18
    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
        19
    czhuyu  
       2019-01-03 15:41:32 +08:00
    为啥不用位运算呢
    talentl
        20
    talentl  
    OP
       2019-01-03 15:46:50 +08:00
    @czhuyu 请问是怎么用的?
    hahastudio
        21
    hahastudio  
       2019-01-03 15:53:31 +08:00
    range(a, b): 2 ** (b + 1) - 2 ** a
    talentl
        22
    talentl  
    OP
       2019-01-03 16:04:52 +08:00
    @hahastudio 如果(a,b)不是连续数列你这个方法就不行了
    Xiaobaixiao
        23
    Xiaobaixiao  
       2019-01-03 16:23:00 +08:00
    sum([2<<i for i in 你的列表])/2
    talentl
        24
    talentl  
    OP
       2019-01-03 16:29:16 +08:00
    @Xiaobaixiao 不对呢亲
    sum([2<<i for i in (1,6)])/2
    Out: 66
    YvesX
        25
    YvesX  
       2019-01-03 16:32:31 +08:00   1
    楼主还在会搞错缩进的阶段,你们秀什么位运算……
    帮助新人要像 4L 好同志学习……
    hflyf123
        26
    hflyf123  
       2019-01-03 16:33:51 +08:00
    @YvesX 哈哈楼里高手很多啊,辣么大表达式都用上,可是新手接触这个太早了
    msg7086
        27
    msg7086  
       2019-01-03 16:40:20 +08:00   1
    求 1 到 5 范围的话 (1<<6)-1 就行了
    Azone
        28
    Azone  
       2019-01-03 17:14:37 +08:00
    reduce(lambda x, y: x + 2 ** y, range(1, 6))
    Azone
        29
    Azone  
       2019-01-03 17:20:18 +08:00
    reduce(lambda x, y: x + 2 ** y, range(1, 6), 0)
    NB40B938mff85mtq
        30
    NB40B938mff85mtq  
       2019-01-03 17:25:59 +08:00
    @hflyf123 我竟然没想到可以这么写
    Cooky
        31
    Cooky  
       2019-01-03 17:52:30 +08:00 via Android
    @talentl 等差数列都没学过吗?
    Cooky
        32
    Cooky  
       2019-01-03 17:54:32 +08:00 via Android
    @talentl 啊不对不是等差,反正有公式
    HuahuaWang
        33
       2019-01-03 18:42:34 +08:00
    @talentl 两个相减不就行了吗。。。
    alvin666
        34
    alvin666  
       2019-01-03 18:44:38 +08:00 via Android
    lz 缩进都不会楼上就别为难 lz 了...
    talentl
        35
    talentl  
    OP
       2019-01-04 09:53:43 +08:00
    @Cooky
    @HuahuaWang
    如果不是有规律数列呢,公式也能套用吗?
    AlexMercerZ
        36
    AlexMercerZ  
       2019-01-04 16:06:50 +08:00
    sum([2**i for i in range(1, 5)]) 列表推导式 最 python 的用法
    talentl
        37
    talentl  
    OP
       2019-01-04 16:12:04 +08:00
    @AlexMercerZ
    这是最符合我水平的答案,谢谢
    AlexMercerZ
        38
    AlexMercerZ  
       2019-01-04 16:33:23 +08:00
    @talentl py 的精髓就是简单 易用 复杂,晦涩的不可取 越简单越好 个人觉得
    a226679594
        39
    a226679594  
       2019-01-07 08:34:06 +08:00
    这好像我初中做的数学题
    talentl
        40
    talentl  
    OP
       2019-01-07 09:58:25 +08:00
    @a226679594
    求通项公式是不
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5570 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 46ms UTC 07:27 PVG 15:27 LAX 00:27 JFK 03:27
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86