python基础(12迭代器生成器)
python系列文章目录
python基础(01变量&数据类型&运算符)
python基础(02序列共性)
python基础(03列表和元组)
python基础(04字符串&字典)
python基础(05集合set)
python基础(06控制语句)
python基础(07函数)
python基础(08类和对象)
python基础(09闭包&装饰器)
python基础(10异常处理)
python基础(11文件读取)
文章目录
- python系列文章目录
- 前言
- 一、可迭代对象
- 二、迭代器对象
- 三、迭代器
- 四、生成器
- 总结
前言
本文主要介绍什么是可迭代对象、迭代器对象,两者之间的区别和用法,以及什么是生成器,生成器的表达式等知识点。
一、可迭代对象
- 例如:字符串、列表、文件
- 实现了__iter__
- 不可迭代、不能for循环,不能被迭代
二、迭代器对象
- 实现了__iter__
- 实现了__next__
三、迭代器
1.特点
- 可以迭代的,并且从第一个位置开始,直到所有原始被访问结束,只能前进不能后退
2.说明
- iter表示这个是可迭代的对象
- next表示迭代的规则,真正的运用起来
3.判断是否可迭代
print(isinstance(animal,Iterable)) #是否是可迭代对象
rint(isinstance(animal,Iterator)) #是否是迭代器对象
4.例子
class Iter_demo:def __init__(self,date):self.date=dateself.index=len(date)#协议的声明 声明类是一个可迭代的对象def __iter__(self):return self#产生数据的def __next__(self):if self.index == 0:raise StopIterationself.index-=1return self.date[self.index]
a=Iter_demo("abc")
for s in a: #next() 调用 __next__()来产生数据print(s) #cba 倒叙
四、生成器
1.介绍
- yield 返回一个值后 还能从退出的地方继续运行
- 生成器函数:返回一个自动实现了迭代协议对象
2.例子
第一种方式
def gen_demo():print("111")yield 1print("222")yield 2print("333")yield 3
g=gen_demo() #返回的是一个生成器的函数 对这个函数进行调用
单个调用
next(g) #111
next(g) #222
b=next(g) #333
print(b) # 返回值是3
循环调用
for i in g:print(i) #111 1 222 2 333 3
第二种方式
def gen_demo1(num):for i in range(num):print(f"yield{i+1},,")yield i+1
g1=gen_demo1(3)
单个调用
print(next(g1)) #用next进行调用 运行一次next(g1) 并且打印返回值 所以打印 yield1,, 1
循环调用
for i in g1:print(i) #yield1,, 1 yield2,, 2 yield3,, 3
生成器表达式
l=(x*10+1 for x in range(10))
print(l) #l是一个生成器对象 直接打印 打印是这个对象的地址
b=next(l) #把返回值给b
print(b) #1
for i in l: #对生成器函数进行遍历打印print(i) #1,11,21,31,41,51,,,--------------------------------------------------------
整体运行结果是 1,11,21 ,, 不会打印两个1 因为会接着上一个继续运行 这也是生成器的特点之一
总结
本文首先简单介绍了什么是可迭代对象、以及什么是迭代器对象。迭代器对象一定是可迭代对象,可迭代对象不一定是迭代器对象。生成器本身也是一种迭代器。