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 · 3405 次点击
    这是一个创建于 1912 天前的主题,其中的信息可能已经有所发展或是发生改变。
    对于列表中的所有数,计算 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)
    Gempty
        30
    Gempty  
       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
    HuahuaWang  
       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   ·   我们的愿景   ·   实用小工具   ·   2673 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 15:30 · PVG 23:30 · LAX 08:30 · JFK 11:30
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.