python_生成器&&迭代器

#迭代器的概念

  dir([])方法:#告诉我列表拥有的方法(双下方法)

  #双下方法(带双下划线的方法  例:_add_) : 都是已经写好的C语言代码,并可以通过不只一种方法可以调用它

      ##一般双下方法不直接被我们调用    

  #求交集用set()函数:    set(dir([]))&set(dir(''))&set(dir(range(9)))  #&求列表的交集

   #只要是能被for循环的数据类型,就一定拥有 _iter_方法

#什么是迭代器?

 

  print([]._iter_())

  #一个列表执行了_iter_()之后的返回值就是一个迭代器

    #只要含有_iter_()方法的都是可迭代的,都可以被for循环

  #迭代器通过 _next_()方法就可以从迭代器中一个一个取值

  #只要内部含有_next_()和_iter_()方法的都是迭代器

 

#迭代器的好处:

  #从容器类型中一个一个取值,会把所有的值都取到

  #节省内存空间

    #迭代器并不会在内存中再占用一大块内存,

      #而是随着循环,每次生产一个,每次next每次给我一个

  

  isinstance()方法,判断参数的数据类型

    print(isinstance([],Iterable))

 

  #for循环其实就是在使用迭代器

  #当我们遇到一个新的变量,不确定能不能for循环的时候,就判断他是否可迭代

  #遇到迭代器的两种情况:

    #已明确告诉你是一个iterator

    #直接给一个内存地址,可能是一个迭代的

    #拿到一个函数没有值,猜测 可能是一个迭代器

 

    #for循环剖析:

        for i in l :

          pass

        #代码执行解析:

        iterator = l._iter_()

        iterator._next_()  

#生成器函数

 

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

def generator() : #generator() 是一个生成器函数

  print(1)

  yield 'a'     #yield只能写在函数里 , 并且不能和  return 共用 

          #return会直接结束一个函数而 yield不会结束

  print(2)

  yield 'b'

 

#只要是生成器函数 :执行之后会得到一个生成器作为返回值

ret = generator()    #ret是一个生成器

print(ret)

r = ret._next_() #生成器也是一个迭代器,  可以利用在迭代器中取值的方法来取值 (next);执行一次yield只能取到一次 yield返回值(但函数并没有结束

print (r)

r = ret._next_() #生成器也是一个迭代器,  可以利用在迭代器中取值的方法来取值 (next);执行一次yield只能取到一次 yield返回值(但函数并没有结束)

print (r)

for i in set :  #用for循环 可以一次性读取生成器中所有的yield,但是不能单个读取,只能一次全部读完

  print (i)

posted @ 2019-03-07 14:40  py_tobe  阅读(114)  评论(0)    收藏  举报