迭代器
引入# 索引 for
iterable
可以for 循环的数据类型:list dic str set tuple 文件 range enumerate
为什么能for 循环 因为它们有迭代器
dir([]) ,功能:列出 列表拥有的所有方法
**双下方法 _sum_ 这个就是双下方法 为什么双下:可能不止一种方法调用它 **
print([1].__add__([2])) #双下方法
print([1]+[2]) #程式间接调用了 双下方法
#求公共方法 (转化为集合求并集) set(dir([])) &set(dir({}))
print('__iter__' in dir(int)) #看看__iter__ 在不在里面 false
#只要能被for循环的数据类型 就一定拥有__iter__方法
#print([].__iter__())
#一个列表执行了 __iter__() 之后的1返回值就是一个迭代器
#print([].__iter__().__length_hint__()) #元素个数
__next__ #会把上次的存起来
1.能被循环的都可迭代 Iterable
2.只要含有__iter__方法的都是可迭代的
[].__iter__() 迭代器
只要含有__iter__方法的都是可迭代的—可迭代协议
迭代器协议—内部含有_next_ 和__iter__方法就是迭代器 (两个都存在)
迭代器一定可迭代
可迭代的._iter_()方法就可以得到一个迭代器
_next_ 可以一个个获取值 (for循环就是在用它)
只有可迭代对象的时候 才能用for 循环
判断它是否可迭代 print(‘iter’ in dir(int)
迭代器的好处 1.节省空间 range() 现包现吃 2.所有值都会取到
from collections import Iterable
from collections import Iterator
print(isinstance([],Iterator)) #false 功能:某个东西是不是这个东西
print(isinstance([],Iterable))
模拟for
l=[1,2,3,4]
it=l.__iter__()
while True:
print(it.__next__()) #会报错
生成器
##生成器
generator()
生成器函数 本质上就是我们自己写得函数
生成器—迭代器
初级 正常函数
def generator():
print("123")
return 'b'
ret=generator()
print(ret)
#只要含有yield 关键字的函数都是生成器函数
(不能和return公用 需要写在 函数里 )
def generator():
print("123")
yield 'b' #不会结束次函数
print("567")
#执行之后会得到一个生成器作为返回值
ret=generator() #拿到生成器
print(ret) #没有打印值
print(ret.__next__())
返回值函数
def generator():
print("123")
yield 'a'#分段的 一段一段传回去 以yield 为关键字
print(456)
yield 'b'#一个个触发
g=generator()
ret=g.__next__()##for i in g
print(ret) ##输入的结果 123 b##print(i) 整体输出
ret=g.__next__()
print(ret) ##输入结果 456 b
·range 的原理
def wahah():
for i in range(2000)
yield 'wahha'#用了就扔了 #边调边打印 是个即使 下次在调用会接着使用
#迭代器各自走各自的 不影响 调用不同的
ps jian kan
def tail(filename):
f=open(filename,mode='r',encoding='utf-8')
while True:
line=f.readline()
if line:
print(line.strip())
tail('file')
#
def tail(filename):
f = open(filename, mode='r', encoding='utf-8')
while True:
line = f.readline()
if line:
yield line.strip()
g = tail('file')
for i in g:
print(i)
###
def tail(filename):
f = open(filename, mode='r', encoding='utf-8')
while True:
line = f.readline()
if line:
yield line.strip()
g = tail('file')
for i in g:
if 'python' in i:
print('****',i)