合并中的错误排序函数的收益率

时间:2018-02-20 00:34:02

标签: python python-3.x

我收到了其他人的合并排序功能,这里是代码:

def mergesort(lst):
    l = len(lst)
    if l <= 1:
        return lst
    return mergesorted(mergesort(lst[:l//2]), mergesort(lst[l//2:]))

def mergesorted(a, b):
    i, j = 0, 0
    la, lb = len(a), len(b)
    while i < la or j < lb:
        if i == la or (j != lb and a[i] > b[j]):
            yield b[j]
            j += 1
        else:
            yield a[i]
            i += 1

我仍在尝试了解yield如何工作,所以当我尝试打印结果来测试函数时,我使用了

m = mergesort([4, 2, 5, 1, 6, 3])

for i in m :
    print(i)

它给了我这个错误:

Traceback (most recent call last):
    for i in m :
    la, lb = len(a), len(b)
TypeError: object of type 'generator' has no len()

我使用print语句错了吗?

1 个答案:

答案 0 :(得分:1)

mergesorted中包含yield关键字的事实意味着它是一个生成器。如错误消息所示,生成器没有len方法 生成器不具有len方法的原因是因为生成器实际上并不知道它们将会产生什么值,直到产生它们为止。与listtuple s之类的对象不同 在这种情况下,我发现使用yield代替return没有任何好处。