在python中重构生成器的第一次迭代

Han*_*Sun 1 python refactoring loops

我想知道是否有办法重构以下代码

 first_run = True
 for i in gen:
        if first_run:
            last_head = i[1]
            last_tail = i[2]
            last_chrom = i[0]
            first_run = False
        else:
            func(i[1], last_head)
            func(i[1], last_tail)
            last_head = i[1]
            last_tail = i[2]
            last_chrom = i[0]
Run Code Online (Sandbox Code Playgroud)

Dav*_*d Z 5

循环的基本点似乎是对迭代的连续元素对执行某些操作.所以我会查看模块文档中pairwise给出定义的函数:itertools

def pairwise(iterable):
    "s -> (s0,s1), (s1,s2), (s2, s3), ..."
    a, b = tee(iterable)
    next(b, None)
    return izip(a, b)
Run Code Online (Sandbox Code Playgroud)

请注意,这不是实际itertools功能,您必须将实现复制并粘贴到代码中.无论如何,使用此函数,您的循环可以像这样实现:

for a, b in pairwise(gen):
    func(b[1], a[1])
    func(b[1], a[2])
Run Code Online (Sandbox Code Playgroud)