东篱把酒黄昏 2023-01-17 15:57 采纳率: 100%
浏览 15
已结题

itertools.combinations(iterable, r)这个函数到底是如何定义的

我在看python内建模块itertools时,想要看看itertools.combinations(iterable, r)这个函数到底是如何定义的,代码的其他地方都看懂了,唯独代码的第18行,那个i为什么不会报未定义的错误,这点看不懂。能给我详细说一下吗

代码的第18行是:indices[i] += 1
具体代码如下:

def combinations(iterable, r):
    # combinations('ABCD', 2) --> AB AC AD BC BD CD
    # combinations(range(4), 3) --> 012 013 023 123
    pool = tuple(iterable)
    n = len(pool)
    if r > n:
        return
    indices = list(range(r))
    # 为什么第9行,第11行,第16行的i共用相同的内存地址,都是indices中对应元素的地址
    yield tuple(pool[i] for i in indices)
    while True:
        # 下面这个for循环是干嘛的,为什么是(n-r)+i  -> 当indices的每一项分别代表iterable的最后几项时,说明全部遍历完了
        for i in reversed(range(r)):
            if indices[i] != (n - r) + i:
                break
        else:
            return
        indices[i] += 1  # 这里的i为什么不会报未定义的错误   代码的第18行----------------------------------
        # 下面for循环作用是:固定前两位,遍历第三位,此时第三位遍历完了,那么第二位就需要前进一位,而第三位需要回到第二位的下一位
        for j in range(i+1, r):
            indices[j] = indices[j-1] + 1
        yield tuple(pool[i] for i in indices)

a = 'abcde'
print(list(combinations(a,3)))

  • 写回答

1条回答 默认 最新

  • cjh4312 2023-01-17 16:38
    关注

    这个indices[i] += 1,应该是return的,是for循环的i

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 1月25日
  • 已采纳回答 1月17日
  • 创建了问题 1月17日

悬赏问题

  • ¥15 想问一下树莓派接上显示屏后出现如图所示画面,是什么问题导致的
  • ¥100 嵌入式系统基于PIC16F882和热敏电阻的数字温度计
  • ¥15 cmd cl 0x000007b
  • ¥20 BAPI_PR_CHANGE how to add account assignment information for service line
  • ¥500 火焰左右视图、视差(基于双目相机)
  • ¥100 set_link_state
  • ¥15 虚幻5 UE美术毛发渲染
  • ¥15 CVRP 图论 物流运输优化
  • ¥15 Tableau online 嵌入ppt失败
  • ¥100 支付宝网页转账系统不识别账号