迭代器/生成器

迭代器

#1.什么是迭代器
    迭代取值的工具

#2.为什么用迭代器
    优点:
        1、提供一种不依赖索引的取值方式
        2、更节省内存(自定义迭代器是,它所占的内存是功能本身的代码量,)
    缺点:
        1、没有按索引取值灵活
        2、迭代器对象是一次性的,值可以取完,再想取值重新把可迭代对象定义为迭代器对象

      

#3. 如何用迭代器

  可迭代的对象:  str\list\tuple\dict\set\文件对象
      但凡内置有__iter__方法的对象都称之为可迭代对象
      可迭代对象).__iter__=====》》迭代器对象

  迭代器对象:   文件对象
    既内置有__iter__方法又内置有__next__方法的对象都称之为迭代器对象    

 

 

  __iter__与__next__简便写法

k={'a':111,'b':222,'c':333}
iter_k=iter(k)                      # k.__iter__()
print(next(iter(k)))            #iter_d.__next__()    

  

4.for循环的底层工作原理(必须是可迭代类型)

  1  把可迭代对象转换为迭代器对象,
   2  调迭代器的__next__方法,取值,取值
   3  用try和except监测异常,在把迭代器中值取完的情况下结束循环

 

方式一方式二是一个引子
方式一
k={'a':111,'b':222,'c':333}
k1=k.__iter__()

    print(k1.__next__())
    print(k1.__next__())
    print(k1.__next__())
    print(k1.__next__())
------------------------------------------------
方式二
k={'a':111,'b':222,'c':333}
k1=k.__iter__()
while True:
    v=k1.__next__()
    print(v)
----------------------------------------------
方式一二执行结果一样,都会报错(超出索引范围)
那么通过添加try和except来阻止报错
k={'a':111,'b':222,'c':333}
k1=k.__iter__()
while True:
    try:                    #监管代码执行,遇到异常,捕捉异常,开始和except后的值匹配,是否是这个错误
        v=k1.__next__()
        print(v)
    except StopIteration:
        break
View Code

 

 

  

 

 

 

生成器

一、什么是生成器

    只要函数内部包含有yield关键字,那么函数名()得到的结果就是生成器,并且不会执行函数内部代码

二、如何用生成器

    但凡函数内出现yield关键字,再去调用函数不会立即执行函数体代码,通过next()调用

def func():
    print('a')
    yield 1
    print('s')
    res=yield 2
    print('c')
    res=yield 3

g=func()
s=next(g)
print(s)
next(g)
print(res)
next(g)
print(res)
next(g)

通过next()调用yield,因为生成器是迭代器的一种,所以在next执行完也会报错,仍通过try监测异常
def func..
....
try:
    g=func()
    print(next(g))
    next(g)
    next(g)
    next(g)
except:
    print(0)
View Code

 

总结yield:
1. 提供一种自定义迭代器的解决方案
2. yield & return
  相同点: 都可以返回值,返回值没有类型限制和个数限制

  不同点: 函数遇到return会结束函数体
       遇到yield是让函数暂停在某一个位置

 

小练习,自定义range

def a(start,stop,s):
    while start<stop:
        yield start
        start+=s
for i in a(1,50,2):        范围及步长自定义
    print(i)

  



 

 

 

    







posted @ 2019-01-15 14:29  pdun  阅读(158)  评论(0编辑  收藏  举报