迭代器,生成器,内置方法

  • 迭代器
    • 什么是迭代器:
      • 迭代:更新换代,每次迭代都必须基于上一次的结果
      • 迭代器:迭代取值的工具​
    • 为什么要用迭代器:
      • 迭代器提供了一种不依赖索引取值的方式
    • 可迭代对象:
      • 可迭代对象:只要内置有__iter__方法的都叫做可迭代对象
      • 可迭代对象-->迭代器对象:
        可迭代对象执行内置方法__iter__得到的就是该对象的迭代器对象
      • 针对双下划线开头和结尾的方法,推荐读法:双下+方法名
      • 基本数据类型中的可迭代对象:str,list,dict,tumple,set,(检测方法:加上__iter__看下 返回值是否是内存地址的形式)
      • 特殊的:
        文件对象执行__iter__后还是本身,没有任何变化(文件对象本身就是可迭代对象)
    • 迭代器取值:
      • 迭代器对象特点:
        • 内置有__iter__ 和 __next__方法
        • 迭代器一定是可迭代对象,可迭代对象不一定是迭代器对象
      • 生成迭代器和迭代器取值
        • 取值特点:只能往后取,不能回退;若取完再取就报错(stopiteration)
        • 迭代器对象无论执行多少次__iter__方法,得到的还是迭代器对象本身(******)
  • for循环本质
    • 问题引出:__iter__方法就是用来帮助生成迭代器对象的,
      文件对象本身就是迭代器对象,为什么还内置有__iter__方法
    • for循环内部本质:
      • 1.将in后面的对象调用__iter__转换成迭代器对象
      • 2.调用__next__取值
      • 3.内部有异常捕获stopiteration,当__next__报这个错,自动结束循环
    • 迭代取值优缺点:
      • 优点:
        • 1.不依赖索引取值
        • 2.内存中永远只占有一份空间,不会导致内存溢出
      • 缺点:
        • 1.不能指定取出元素
        • 2.取完之后会报错stopiteration
    • 补充:
      • 可迭代对象:内置有__iter__方法的对象叫做可迭代对象
      • 迭代器对象:内置既有__iter__方法,也有__nxet__方法
  • 生成器
    • 用户自定义的迭代器就是生成器
    • 生成器从产生到执行:
      • 1.函数内写yield + 返回值(支持多个返回值,逗号隔开,然后会以元组形式返回)
      • 2.函数名加括号的方式是生成器生效(此时就不是执行函数体内的代码块了)
      • 3.将函数名加括号赋给g,那么g就是一个生成器(生成器初始化)
      • 4.g.__next__()就是对函数做一次执行,
        这个一次的意思是到下一个yield为止,并且yield的返回值也要返回
  • yield表达形式
    • yield支持外接为其传参
    • yield特性:
      • 1.提供了一种自定义生成器的方式
      • 2.会帮你将函数的运行状态暂停住
      • 3.可以返回值
    • yield和return异同:
      • 相同点:都可以返回值,且支持返回多个
      • 不同点:① yield可以返回多次值,然后暂停函数,等待下一次生成器的调用,而return只能返回一次,接着函数立即结束
        ② yield还可以接受外部传入的值g.send()
  • 生成器表达式
    • 类比列表生成式
    • 生成器表达式可以理解为 元组生成式
    • 注意:
      • 生成器不会主动执行任何一行代码,
      • 必须通过__next__触发代码的运行
      • __next__一次只能触发执行函数到下一行yield处
  • 内置方法
    • abs()求绝对值
    • locals()返回当前所处位置 存储的所有名字;
      globals()无论在哪,查看的都是全局名称空间
    • bin();oct();hex() 这三个将十进制转换为其他进制;int()将其他进制转换为十进制
    • bool()将执行结果转换为布尔值
    • bytes也是一个数据类型
    • callable()判断是否为可调用对象
    • char()将数字转换为ASCII码表对应的字符;
      ord()将字符按照ASCII码表转换成对应的数字
    • dir()获取当前对象名称空间里边的名字
    • divmod()分页器,同时返回除数和余数
      • divmod的应用:分页器
    • enumerate()枚举,一般用于给列表加索引号,可以加初始索引号
    • eval()和exec()
      • eval() 函数用来执行一个字符串表达式,并返回表达式的值;
        exec()相比于 eval,exec可以执行更复杂的 Python 代码,返回值为None;
        eval不支持逻辑代码,只支持一些简单的python代码
    • format()三种 用法{}占位;{index}索引;{name}指名道姓
    • help()查看函数注释
    • isinstance()判断该方法时候是指定的数据类型
    • pow(x,y)返回x**y
    • round()四舍五入
  • 面向过程编程
      • 定义:类似于设计一条流水线。就是分析出解决问题所需要的步骤,
        然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了。
      • 优劣:
        • 好处:复杂的问题流程化
        • 缺点:扩展性较差,一旦需要更改,整体都受到影响

posted @ 2019-07-15 20:10  不在一城  阅读(143)  评论(0编辑  收藏  举报