迭代器和生成器

可迭代对象

  可迭代对象:有__iter__()方法的对象,调用该方法返回迭代器对象

  例如:str、list、tuple、dict、set、range()、file、迭代器对象、enumerate、生成器

迭代器对象

  可迭代对象通过__iter__()方法得到迭代器对象,例如:

    [].__iter__()

    {}.__iter__()

    ().__iter__()

  迭代器对象:有__next__()方法的对象,也就是用该方法一次从迭代器对象中获得一个值,取出一个少一个

  例如:file、enumerate()、生成器

  优缺点:迭代器取值可以不依赖索引完成取值,但是不能计算长度,也不能指定位置取值(只能从前往后逐一取值)

  重点:

  ①从迭代器对象中取值,取一个少一个,如果要从又开始取,,需要重新获得拥有所有元素的迭代器对象

  ②迭代器对象也有__iter__()方法,调用后等得到的是自己本身(当前含义几个元素,得到的就只有几个元素的迭代器对象)

for循环迭代

  1.自动获取别迭代对象的迭代器对象

  2.在内部一次一次调用__next__()方法取值

  3.自动完成异常处理,例子如下

    iter_obj=[1,2,3].__iter__()

    while True:
      try:   #如果有异常操作,接收
        ele = iter_obj.__next__() 
        print(ele)
      except StopIteration:     #StopIteration为错误类型,当报错时,执行下面代码块
        # print("取完了")
        break

  4.for取值例子如下 

    for ele in st1:   # 1.自动完成 for ele in st1.__iter__(): 2.自动完成异常处理
      print(ele)

生成器

  生成器:包含有yield关键字的函数就是生成器 

    def my_generator():
      yield 1
      yield 2
      yield 3
   g_obj = my_generator()

  my_generate()并不会执行函数体,得到的返回值就是生成器对象,生成器对象就是迭代器对象。(函数的返回type类型就是generator)

   r1 = g_obj.__next__()   # 1,函数内执行一次,在遇到下一个yield的时候停止,且拿到yield的返回值

   for v in g_obj:
     print(v)    # 2 | 3,生成器也可以被for迭代,因为生成器也是一个迭代器对象

生成器的发送信息

  def fun():

    r1=yield 1000

    print(r1)    #接收send发出的信息后,r1变成了信息1

    yield 2000

  obj=fun()

  r1=obj.__next__() #走到第一个yield后停止,返回1000

  print(r1) #  输出为1000

  r1=obj.send('信息1')

  print(r2)  #2000

  

posted @ 2019-04-03 15:24  Mr-Bear  阅读(86)  评论(0编辑  收藏  举报