Python 迭代器与生成器
迭代器 (iterator)
迭代的对象(iterable):列表(list)、字典(dict)、元祖(tuple)、字符串(str)、集合(set)
dir() 查看数据类型的所用方法
print(dir([]))
print(dir({}))
print(dir(5))
迭代的对象定义: 内部含有__iter__()方法的数据类型,就是可迭代的对象 --》(可迭代协议)
ret = ‘__iter__’ in dir('abc')
print(ret)
'abc'.__iter__() : 含有__iter__() 和__next__()称为迭代器(iterator)
迭代器定义:迭代器你可以理解为一个容器,从这个容器中一个接一个把值取出来的过程,就是迭代过程
如何取值:print(ret.__next__())
print(ret.__next__())
print(ret.__next__())
l = ['ha','hei','he']
lst_iter = l.__iter__()
print(lst_iter.__next__())
print(lst_iter.__next__())
print(lst_iter.__next__())
Python 一切皆对象
print('__iter__' in dir(lst_iter))
print('__next__' in dir(lst_iter))
print(set(dir(lst_iter)) - set(dir(l)))
lst_iter.__next__()
可迭代协议:必须含有__iter__()方法
迭代器协议:包含__next__(),__iter__()方法
包含__next__方法的可迭代对象就是迭代器
迭代器是可迭代的 的一部分
获得迭代器:可迭代的调用 __iter__()
使用迭代器:迭代器.__next__()
可迭代的 : __iter__
迭代器 : __iter__ 和__next__
迭代器和可迭代的关系 :可迭代的包含迭代器
迭代器和可迭代的判断 :两种方法
迭代器的工作原理
l_iter = [1,2,3,4,5].__iter__()
只是记录当前这个元素和下一个元素
print('__iter__' in dir(range(10)))
print('__next__' in dir(range(10)))
range_iter = range(10).__iter__()
print(range_iter.__next__())
print(range_iter.__next__())
迭代器的特点 —— 迭代器是个好东西
惰性运算
从前到后一次去取值,过程不可逆 不可重复
节省内存
for item in [1,2,3]:
pass
list_iter = [1,2,3].__iter__()
list_iter.__next__()
用while循环模拟for循环的方式 —— for循环是依赖迭代器的,且我们自己也可以仿照着写
l = [1,2,3,4,5]
l_iter = l.__iter__()
while True:
try:
print(l_iter.__next__())
except StopIteration:
break
for循环是让我们更简单的使用迭代器
用迭代器取值就不需要关心索引或者key的问题了
迭代器是个好东西
目前我们已知的可迭代的都是python提供给我们的
range()
enumerate()
在平时写代码的过程中,我们用for循环就够了
我自己想写个可迭代的,——生成器
生成器的本质就是迭代器
因此生成器的所有好处都和迭代器一样
但是 生成器是我们自己写的python代码
生成器的实现由两种方式:
1.生成器函数
2.生成器表达式
def func():
return ['衣服1','衣服2000000']
ret = func()
print(ret)
def g_func():
yield 1
g = g_func()
print(g)
generator 生成器 ---> 迭代器
print(g.__next__())
生成器函数和普通函数之间的区别
生成器函数中含有yield关键字
生成器函数调用的时候不会立即执行,而是返回一个生成器
def g_func():
print('aaaa')
yield 1
print('bbbb')
yield 2
yield 3
g = g_func()
for i in g:
print(i)
print(g.__next__())
print(g.__next__())
print(g.__next__())
def cloth():
for i in range(1000000):
yield '衣服%s'%i
g = cloth()
for i in range(50):
print(g.__next__())
for i in range(50):
print(g.__next__())
浙公网安备 33010602011771号