第65p,关于:生成器、迭代器与迭代对象(上)

大家好,我是杨数Tos,这是《从零基础到大神》系列课程的第65篇文章,第三阶段的课程:Python进阶知识:生成器、迭代器与迭代对象。

一、什么是可迭代对象?

迭代是一个重复的过程,迭代每次的重复都是基于上一次的结果;如果单纯的重复并不是迭代;

下面这张图片会用一个简单的案例说明迭代与循环的区别:

由于可迭代对象是一种比较抽象的概念,我们可以用这样的方式区分可迭代对象;在Python中只要内置有__iter__()方法的对象都称之为可迭代对象。

二、迭代器?

1、什么是迭代器?

器是工具,迭代器指的是迭代取值的工具。

2、为什么会有迭代器?

如果我们使用索引取值的方式获取对象内的元素,可以获取到对象内所有元素的值;但是,对于一些没有索引的对象,如字典,通过索引取值的方式是无法获取字典中元素的值;

为了解决基于索引取值的局限性,Python提出了一种迭代取值的方式,这就是迭代器(iterator);只要是可迭代对象,都能进行迭代取值;

调用可迭代对象下的__iter__方法,可以得到该迭代对象的迭代器对象,即:可迭代对象可以转换成迭代器对象。

将可迭代对象转成迭代器对象以后,迭代器对象内有一种__next__()方法,使用__next__()方法就可以进行迭代取值。每执行一次__next__()方法就能取得迭代器中的返回值;当迭代器的值被取完,再次取值会发出报错信息。


3、可迭代对象与迭代器的不同:

可迭代对象只能通过索引取值的方式(即:__iter__()方法);迭代器对象不仅可以通过索引取值,也可以通过__next__()方法取值;


4、用for循环的工作原理说明迭代器:

① 将被循环的数据调用__iter__()方法,将数据转换成为迭代器对象,如果数据本身是迭代器对象,调用__iter__()方法也是在调用迭代器本身,并没有发生任何变体;

② 基于迭代器对象,调用__next__()方法进行迭代取值,拿到__next__()的返回值;

③ 将返回值赋值给i

④ 循环往复以上步骤,迭代器对象只的值被取尽,抛出StopIteration异常,for循环会捕捉异常并结束循环。

所以while循环可以称为条件循环,for循环可以称为迭代器循环。

  只要是迭代器对象都相当于执行了for循环;所以我们在进行数据类型转换的时候,如果字符串转换成列表x = list(str),这里调用了list方法其实就是调用了迭代器对象进行了for循环,所以会将字符串打散成一个个字符,变成列表(list)中的一个元素。

  如:list(“杨数Tos”)与for的原理相同,得到的结果是:['杨', '数', 'T', 'o', 's']。


5、迭代器对象优缺点总结:

优点:

a. 获得了一种统一取值的方案,不管是有序类型还是无序类型都可以使用同一方法进行取值;

b. 更节省内存,数据只要被使用时,__next__()方法才会触发并生成新的数据,就像一只生蛋的鸡,不用事先把所有的蛋生出来,只有调用时,才会生出新的蛋;


缺点:

A. 不能索引取值这样,可以取指定的值,比如取第3个值,使用索引取值可以直接获取,使用迭代器必须先把前两个值取出来 ,才能获取到第3个值。

B. 迭代器具有生命周期,迭代器内的值取完以后,再次取值会发生报错。

C. 除非迭代器内的值被取尽,否则无法获取迭代器的长度。

D. 只能取下一个值,不能回到开始,


以上是本期内容,如果有表达不对的内容,欢迎您的留言、斧正,我们一起天天向上。

感谢您的阅读,您的三连【关注、点赞、收藏】就是对我最大的支持,谢谢!

本文由杨数Tos原创,欢迎关注,带你一起长知识。

你可能感兴趣的:(第65p,关于:生成器、迭代器与迭代对象(上))