可迭代协议:只要含有__iter__方法都是可迭代的

迭代器协议:内部含有__next__和__iter__方法的就是迭代器

从生成器中取值的几个方法:

  for           #如果没有break会一直取完

  next

  send        #不能用在第一个,取下一个的时候给上个位置传一个新的值

  数据类型强制转换    #一次性全读到内存,占内存

   #优先类型按序

 

from collections import Iterable

from collections import Iterator

print(isinstance([],Iterator))

print(isinstance([],Iterable))

 

可迭代的调用.__iter__()方法就可以得到一个迭代器

迭代器的特点:

  一个迭代器只能从头到尾取一次

  可以依次取,都能取到

  节约内存(依次取与一次性取)

#####################################################

生成器函数执行以后会得到一个生成器做返回值

生成器的本质就是迭代器

只要含有yield关键字的函数都是生成器函数

生成器函数特点:

  调用之后函数不执行,返回生成器

  每从生成器中取一个值就执行一段代码,遇到yield停止

yield不能和return共存,yield不会结束函数

def generator():

  print(1)

  yield'a'

  print(2)

  yield'b'

g = generator

ret = g.__netx__()

print(ret)

ret = g.__netx__()

print(ret)

#等于 for i in g

#   print(i)

 

#############################################

 

def legend():

  for i inrange(2000000):

    yield '我是渣渣辉%s'%i

g = legend()

 

############################################

#监听文件输入

def tail(filename):

  f = open(filename,encoding = 'utf-8')

  if line.strip():              #回车会被当做一行

    yield line.strip()

 

g = tail('file')

for i in g:

  if '渣渣辉' in i:           #判断关键字

    print('***',i)

 

############################################