python系列文章目录
python基础(01变量&数据类型&运算符)
python基础(02序列共性)
python基础(03列表和元组)
python基础(04字符串&字典)
python基础(05集合set)
python基础(06控制语句)
python基础(07函数)
python基础(08类和对象)
python基础(09闭包&装饰器)
python基础(10异常处理)
python基础(11文件读取)
前言
本文主要介绍什么是可迭代对象、迭代器对象,两者之间的区别和用法,以及什么是生成器,生成器的表达式等知识点。
一、可迭代对象
- 例如:字符串、列表、文件
- 实现了__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=date
self.index=len(date)
#协议的声明 声明类是一个可迭代的对象
def __iter__(self):
return self
#产生数据的
def __next__(self):
if self.index == 0:
raise StopIteration
self.index-=1
return 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 1
print("222")
yield 2
print("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 因为会接着上一个继续运行 这也是生成器的特点之一
总结
本文首先简单介绍了什么是可迭代对象、以及什么是迭代器对象。迭代器对象一定是可迭代对象,可迭代对象不一定是迭代器对象。生成器本身也是一种迭代器。