近期在学习python的可迭代对象、迭代器、生成器以及它们的区别,过程中遇到了几个困扰我今天的问题,目前算是搞懂了,写出来分享一下,不对之处还望指正。(此处不写它们的概念以及区别,网上有太多的文章)

Q1:

我们在用for循环迭代一个可迭代对象时,底层其实是调用了iter(object)方法将可迭代对象转换成迭代器进行迭代的。问题就是既然底层会将可迭代对象转换成迭代器使用,那么可迭代对象存在的意义又是什么呢?直接用迭代器就行,为什么要多此一举?

A1:

这块就完全体现了可迭代对象和迭代器的区别,可迭代对象可以重复迭代,而迭代器是通过next()取值,只能往前走,不能后退,且迭代完一次就不能再使用。那么问题又来了,既然可迭代对象在执行的时候是调用iter()方法生成的迭代器,那么可迭代对象为什么就可以重复迭代,不都变成迭代器了吗?这个问题困扰了我很久,后来想到了sort()和sorted()函数。list.sort()会直接改变原有列表,而sorted(list)是新生成一个列表来使用,不影响之前的列表。for循环在迭代时,iter(object)就像sorted(list)一样,它是新生成了一个迭代器,并没有改变可迭代对象本身。来看如下一个嵌套循环,我们都知道,嵌套循环是外层循环一次,内层循环一圈。外层每向下迭代一个值,内层都会通过iter()新生成一个迭代器,把可迭代对象迭代一遍。

l = [1,2,3,4,5]
for i in l:
    for j in l:
        print(i*j)

看到这里,会不会有个困惑,可迭代对象不能自己迭代吗,为啥要生成迭代器来迭代?答案其实就在它们的名字中,可迭代对象就是说明这个对象可以迭代,怎么迭代呢?就是把它变成迭代器来迭代。迭代器是干啥的呢?迭代器就是专门来迭代可迭代对象的,这么说能理解吧

Q2:

生成器是特殊的迭代器,它俩都是惰性计算,都是通过next()向下取值,那么在已有迭代器的情况下,为什么还有设计生成器?

A2:

我觉得答案还是在它俩的名字中,生成器:顾名思义它的值是在用的时候才生成的,可以通过我们熟悉是生成器推导式或生成器函数通过惰性计算来生成值。而迭代器是将已有的可迭代对象通过iter()函数变成迭代器,再来迭代其中的值。

 

posted on 2022-08-12 14:00  linkenzhou  阅读(47)  评论(0编辑  收藏  举报