zoukankan      html  css  js  c++  java
  • python之路--day11---迭代器和生成器

    迭代:

      迭代是一个重复的过程,每次重复即一次迭代,并且每次迭代的结果都是下一次迭代的初始值

    为什么要有迭代器:

      数据类型的取值,字符串,列表,元组依靠索引可以取值,但是字典,集合,文件这些数据类型无法通过索引取值,

      那么迭代器提供了一种不依靠索引取值的方法,这个方法就是迭代器

    可迭代对象

      内置有__iter__方法,执行该方法会拿到迭代器

        字符串,列表,元组,字典,集合,文件都是可迭代对象

    迭代器对象

      内置有__next__方法,执行该方法会拿到迭代器对象中的一个值
      内置有__iter__方法,执行该方法会拿到迭代器本身

      文件是迭代器对象

    注意:迭代器对象一定是可迭代对象,可迭代对象不一定是迭代器对象

    迭代器的使用

    dic={'a':1,'b':2,'c':3}

    iter_dic=dic.__iter__()   #可迭代对象执行_ _iter_ _方法得到的结果就是迭代器对象

               #迭代器对象内置有_ _iter_ _方法和_ _next_ _方法

    iter_dic.__iter__() is iter_dic  #True   迭代器.__iter__()得到的仍然是迭代器本身

    print(iter_dic.__next__())

    print(iter_dic.__next__())

    print(iter_dic.__next__()) #等同于next(iter_dic)

    #迭代对象有几个值就需要执行几次,直到没有值可取

    print(iter_dic.__next__()) #抛出异常StopIteration,标志迭代对象的值已经全部取出

    #有了迭代器,我们就可以不依赖索引迭代取值了

    iter_dic=dic.__iter__()

    while 1:

      try:

        k=next(iter_dic)

        print(dic[k])

      except StopIteration:

        break

    ====================================================================

    异常处理

    捕捉异常可以使用try/except语句。

    try/except语句用来检测try语句块中的错误,从而让except语句捕获异常信息并处理。

    如果你不想在异常发生时结束你的程序,只需在try里捕获它。

    语法:

    try:
    <语句>        #运行别的代码
    except <名字><语句>        #如果在try部份引发了'name'异常
    except <名字>,<数据>:
    <语句>        #如果引发了'name'异常,获得附加的数据
    else:
    <语句>        #如果没有异常发生

     ================================================================================

    for 循环

    基于for循环,我们可以实现不依赖索引取值

    1 dic={'a':1,'b':2,'c':3}
    2 for k in dic:
    3     print(dic[k]

    for循环的工作原理

    1,执行in后对象的_ _iter_ _()方法,得到一个迭代器对象

    2,执行_ _next_ _ 方法,将得到的值赋值变量,然后执行循环体代码

    3,重复过程2,直到捕捉到异常StopIteration

    迭代器的优缺点

    优点:提供了一种不依赖索引的迭代方式

    缺点:无法获长度

        只能一直往后取,无法往前取

    生成器

      函数内包含有yield关键字

      再调用函数,就不会执行函数体代码,拿到的返回值就是一个生成器对象

    注意:生成器本质就是迭代器,也就是说迭代器的用法也就是生成器的用法

  • 相关阅读:
    LeetCode:204. 计数质数
    LeetCode:203. 移除链表元素
    LeetCode:202. 快乐数
    LeetCode:191. 位1的个数
    LeetCode:190. 颠倒二进制位
    LeetCode:189. 旋转数组
    LeetCode:187. 重复的DNA序列
    LeetCode:165. 比较版本号
    LeetCode:164. 最大间距
    LeetCode:155. 最小栈
  • 原文地址:https://www.cnblogs.com/guodengjian/p/8678337.html
Copyright © 2011-2022 走看看