迭代器,生成器和生成式

迭代器. 生成器, 生成式
1. 什么是迭代器
  迭代就是一个重复的过程, 但每次重复都是基于上一次的结果而来的
  也就是说, 每次运行拿到返回值后在原地不懂, 等再次调用时会在当前位置进行向下运行
  迭代器不依赖索引取值,取值是不可逆的, 从头到尾依次取值,也不可跳到某一个位置

  内置__iter__方法的是迭代器
  内置__iter__和__next__方法的是迭代器对象

2. 为何要有迭代器
  while循环不能对没有索引的容器进行取值, 而生成器就完美取代
  特性:
  是一种通用的取值方式
  惰性机制, 节省内存
  缺点: 取值不可逆,从头到尾依次取值

3. 如何使用迭代器
  dic = {'name':"chen","age":18,"gender":"male"}
  res = dic.__iter__()
  msg = res.__next__()
  print(msg)
  使用__iter__方法把dic转成迭代器对象,
  使用__next__一个个的取值

自定义生成器
  先定义生成器是用来实现惰性计算, 从而达到节省内存的效果
  但凡是函数内出现yield关键字, 调用函数将不会执行函数yield一下代码, yield会得到一个返回值
  这就是我们定义的迭代器, 称之为生成器


  与return 的相同 与不同
    相同点: 都可以用来返回值,一个或多个,一次性
     不同: return只能返回一次, 函数就结束了
        yield能返回多次, 并且yield会挂起到上次退出位置


  迭代器的优缺点
    优点: 是一种通用的取值方式
      惰性机制, 节省内存
    缺点: 值不如索引
      取值是一次性, 只能往后取, 不能指定值, 不走回头路

dic = {"name": "egon", 'age': 18, 'gender': "male"}
dic_iterator = dic.__iter__()

res1 = dic_iterator.__next__()
print(res1)
res2 = dic_iterator.__next__()
print(res2)
res3 = dic_iterator.__next__()
print(res3)
当取不到值时会抛出异常
dic_iterator.__next__()  # StopIteration

捕捉异常
while True:
    try:
        res = dic_iterator.__next__()
        print(res)
    except StopIteration:
        break
 
posted @ 2020-07-22 15:26  π陈少π  阅读(58)  评论(0)    收藏  举报