使用生成器函数迭代可迭代对象

8 浏览
0 Comments

使用生成器函数迭代可迭代对象

我面临着这个问题,希望你们中的一些人能帮帮忙:

编写一个函数,接受一个可迭代对象和一个正数n。该函数返回一个新的迭代器,以长度为n的元组形式提供原始值。如果需要,用'None'来填充缺失的值,直到最后一个元组。

例如:

for x in bunch_together(range(10),3): print(x)

返回值为:

(0, 1, 2)
(3, 4, 5)
(6, 7, 8)
(9, None, None)

目前我想出了以下解决方案:

def bunch_together(iterable,n):
    tup = tuple()
    for item in iterable:
        for i in range(n):
            tup += (i,)
        yield tup

但显然这不起作用,因为我没有考虑到range(当前输出的结果看起来像这样:

(0, 1, 2)
(0, 1, 2, 0, 1, 2)
(0, 1, 2, 0, 1, 2, 0, 1, 2)
...#(继续下去)

我可以创建一个生成器或构建一个迭代器(例如构建一个由init、iter和next组成的类)。

感谢帮助!

0
0 Comments

迭代可迭代对象时使用生成器函数的原因是为了将迭代过程封装成一个可重复使用的函数。在上述代码中,问题出现在每次循环迭代时都重新初始化了一个空元组。这意味着每次循环都会创建一个新的元组,并且之前保存的元组将会被丢弃。这导致输出结果中只包含了每个循环迭代的最后一个元组。

要解决这个问题,可以将初始化元组的代码移动到循环外面,这样就不会在每次迭代时重新创建一个新的元组。代码如下:

def bunch_together(iterable,n):
    tup = tuple() # 初始化空元组
    for k in range(0,len(iterable),n):
        for i in range(k,k+n):
            tup += (iterable[i] if i<len(iterable) else None,)
        yield tup
for x in bunch_together(range(10),3): 
    print(x)

输出结果将会是:

(0, 1, 2)
(0, 1, 2)
(0, 1, 2)
(0, 1, 2)

现在,输出结果包含了每个迭代的元组,而不是只包含最后一个元组。这就是修复后的代码。

0