一、python中一切皆对象,那么“可迭代”对象与普通对象有什么区别呢?
实现了__iter__方法的对象即为可迭代对象,str list tuple dict set 都是可迭代的,可以通过判断对象是否有__iter__属性来判断该对象是否是可迭代对象,如下:
二、可迭代对象的__iter__方法的作用是什么?
可迭代对象的__iter__方法的作用是返回一个迭代器对象。在使用for循环对可迭代对象进行迭代操作时,实际上是:调用__iter__方法,返回迭代器对象,这个迭代器对象不断的调用__next__方法返回元素,直到没有元素可以返回时抛出StopIteration异常。
三、可迭代对象如何转成迭代器?
iter(可迭代对象)
四、什么是迭代器?
实现了__iter__方法和__next__方法的对象都是迭代器对象。__iter__方法返回迭代器自身,即self,__next__方法返回下一个值,直至没有下一个元素可以返回时,抛出StopIteration异常。
五、可迭代对象和迭代器对象中都要实现__iter__方法,那么这两者的__iter__方法的区别是什么?
可迭代对象的__iter__方法是返回一个迭代器对象,通过这个迭代器对象完成迭代。迭代器对象的__iter__方法是返回它自身即self,与其__next__方法共同完成迭代。这也就是可迭代对象可以多次迭代,但是迭代器对象只能迭代一次的原因。
六、使用for循环迭代迭代器时,执行过程是怎样的?
在for开始迭代前,会自动调用迭代器的__iter__方法,获取迭代器对象,然后自动调用__next__方法开始迭代。如下:
七、什么是生成器?
生成器是一种特殊的迭代器,不过这种迭代器更加优雅,不需要实现__iter__方法和__next__方法,而是通过关键字 yield 即可实现快速、便捷的创建一个迭代器。
八、生成器的语法?
类似函数的定义,但不返回值。为了显示序列中每一个元素,会使用 yield 语句。只要函数的定义体中有 yield 关键字,那么该函数就是生成器函数。调用生成器函数时,不会执行函数的内容,而是返回一个生成器对象。如下:
九、既然生成器函数没有返回值,那么该如何去访问他的元素呢?
获取生成器函数返回的生成器对象,对该对象进行迭代操作。如下:
十、生成器表达式?
简单的生成器函数,可以替换成生成器表达式。生成器表达式可以理解为列表推导式的惰性版本,即不会马上构建列表,而是返回一个生成器对象,按需惰性生成元素。
生成器表达式格式:(对每次迭代的元素的操作 for语句)