Python基础第九天——迭代对象 迭代器对象生成器三元表达式列表解析生成器表达式
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python基础第九天——迭代对象 迭代器对象生成器三元表达式列表解析生成器表达式相关的知识,希望对你有一定的参考价值。
鸡汤:
要时刻不断地给自己灌输一种思想:都TMD是个人,凭什么他会而我就不会?王候将相宁有种乎?我承认人有天赋的差别,但是勤奋能弥补缺陷!所以,根据以上观点得出以下结论,只要出生时不是个傻子,那么就没有蠢的人,只有懒的猪!只要勤奋上进,小白也会变大神。加油
——奔跑吧小白
一、迭代对象、迭代器对象
1、迭代
定义:带有__iter__方法的就是可迭代对象
python常用的数据类型中,除了数字外,都是迭代对象。
例:用isinstance判断python常用数据类型是否为迭代对象,经验证,python常用数据类型中除数字类型外,都是可迭代对象。
from collections import Iterable int1 = 1 str1 = ‘xiaobai‘ list1 = [1,2,3,4,5] tuple1 = (1,2,3,4,5) dic1 = {‘a‘:1,‘b‘:2,‘c‘:3} set1 = {1,2,3,4} f = open(‘a.txt‘,‘w‘) # 用isinstance判断是否为迭代对象 print(isinstance(int1,Iterable)) # 数字类型结果:False print(isinstance(str1,Iterable)) # 字符串结果:True print(isinstance(list1,Iterable)) # 列表结果:True print(isinstance(tuple1,Iterable)) # 元组结果:True print(isinstance(dic1,Iterable)) # 字典结果:True print(isinstance(set1,Iterable)) # 集合结果:True print(isinstance(f,Iterable)) # 文件结果:True
输出结果:
False
True
True
True
True
True
True
2、迭代器
定义:将迭代对象的__iter__后加上括号执行,得到的结果就是迭代器。
取值:迭代器对象通过__next__方法,加上括号拿到迭代器里的值。(迭代器也有一个__iter__方法。)
特点:
优点:不依赖于索引,惰性计算节省内存
缺点:取值不方便,一次性取值,只能住后取,不能回退。
例1:迭代器用__next__()的方式取值
l = [1,2,3,4,5] x = l.__iter__() # 迭代器 print(x.__next__()) print(x.__next__()) print(x.__next__()) print(x.__next__()) print(x.__next__()) print(x.__next__()) # 已知列表l有5个值, # 当取到第6个值的时候会异常 StopIteration
输出结果:
1 Traceback (most recent call last): 2 File "C:/Users/William/PycharmProjects/Python_Item2/study/day9/迭代器.py", line 19, in <module> 3 4 print(x.__next__()) # 已知列表l有5个值, 5 StopIteration
例2:用isinstance判断python常用数据类型是否为迭代器对象
from collections import Iterator int1 = 1 str1 = ‘xiaobai‘ list1 = [1,2,3,4,5] tuple1 = (1,2,3,4,5) dic1 = {‘a‘:1,‘b‘:2,‘c‘:3} set1 = {1,2,3,4} f = open(‘a.txt‘,‘w‘) # 用isinstance判断是否为迭代器对象 print(isinstance(int1,Iterator)) # 数字类型结果:False print(isinstance(str1,Iterator)) # 字符串结果:True print(isinstance(list1,Iterator)) # 列表结果:True print(isinstance(tuple1,Iterator)) # 元组结果:True print(isinstance(dic1,Iterator)) # 字典结果:True print(isinstance(set1,Iterator)) # 集合结果:True print(isinstance(f,Iterator)) # 文件结果:True
输出结果:
False
False
False
False
False
False
True
例3:迭代器执行__iter__方法后得到的还是自己。
# 文件是迭代器 with open(‘a.txt‘,‘r‘,encoding=‘utf-8‘) as f: print(f) # 得到迭代器 obj = f.__iter__() # 执行__iter__后仍然是迭代器 print(obj is f) # True
输出结果:
<_io.TextIOWrapper name=‘a.txt‘ mode=‘r‘ encoding=‘utf-8‘> True
3、for循环原理
步骤:
1、先执行迭代对象的__iter__()方法,得到迭代器
2、for循环会自动调用迭代器内的__next__()方法,将得到的返回值再赋予变量
3、直到捕捉到StopIteration这个异常后,再结束循环。
for循环只能判断要遍历的对象是否为迭代对象,而不能只判断是否为迭代器。
例:
l = [1,2,3,4] for i in l: # 1、先执行迭代对象的__iter__()方法,得到迭代器 # 2、for循环会自动调用迭代器下面的__next__()方法,得到返回值后再赋予变量“i” # 3、直到报出StopIteration异常,for循环再捕捉到这个异常,最后结束循环。 print(i)
4、用while循环实现不依赖于索引的方式取值。
(1)try...except
这里要用到一个新的知识点:
try...except
用于捕捉程序出现的异常。
语法:
try
逻辑
except 要捕捉的异常:
条件
(2)用while循环实现不依赖于索引的方式取值
d = {‘a‘:1,‘b‘:2,‘c‘:3} obj = d.__iter__() # 1、先将迭代对象转换成迭代器 while True: # 2、再用__next__()方法取值 try: # 3、用try...except捕捉StopIteration的异常。 i = obj.__next__() print(i) except StopIteration: break
二、生成器
以上是关于Python基础第九天——迭代对象 迭代器对象生成器三元表达式列表解析生成器表达式的主要内容,如果未能解决你的问题,请参考以下文章