在返回语句中的for循环

8 浏览
0 Comments

在返回语句中的for循环

我正在研究Nosklo在什么是最“Pythonic”的方式以块状迭代列表?中的回答,他定义了以下函数:

def chunker(seq, size):
    return (seq[pos:pos + size] for pos in xrange(0, len(seq), size))

有人可以解释一下当return后面跟着一个for循环时它是如何工作的吗?

我尝试了以下代码:

def chunker2(seq, size):
    for pos in xrange(0, len(seq), size):
    return seq[pos:pos + size]

但是我得不到相同的结果。

注意,在Nosklo的例子中,chunker()像下面的例子一样被迭代调用:

animals = ['cat', 'dog', 'rabbit', 'duck', 'bird', 'cow', 'gnu', 'fish']
for group in chunker(animals, 3):
    print group

通过添加打印语句,我注意到后一个for循环执行了3次(遍历了animals列表),但是chunker函数中的for循环只执行了一次。所以,为什么只有一个return,我却能看到3个打印结果?

0
0 Comments

从上面的内容中,我们可以看到这个问题的出现原因是因为使用了一个带有循环的返回语句。具体来说,函数`chunker(seq, size)`的返回值是一个生成器对象,它在迭代时会生成值。生成器对象是通过使用生成器表达式创建的,生成器表达式是在括号内部的一个不可分割的代码块:(seq[pos:pos + size] for pos in xrange(0, len(seq), size))

在这个问题中,解决方法是将生成器表达式重写为一个普通的生成器函数,通过使用`yield`语句来实现。生成器函数是一种更加冗长但也更加灵活的生成器形式,可以包含打印语句,并且可以像最初期望的那样工作。

具体的解决方法如下:

def chunker2(seq, size):
    for pos in xrange(0, len(seq), size):
        print('chunker2 generator called')
        yield seq[pos:pos + size]

在这个重写后的函数中,`chunker2`函数本身就是一个真正的生成器,并且会被调用3次。

最后,通过在生成器函数中包含打印语句,我们可以实现在每次调用生成器时打印出调用的次数。这样就可以达到最初期望的效果。

希望对你有所帮助!

0