• Python 基础第十三天(迭代器,生成器)


    今日主要内容:

    1.可迭代对象

    2.迭代器

    3.生成器

     

    1.可迭代对象

    什么是可迭代对象:内部含有__iter__方法的对象,就是可迭代对象.

    查看__iter__方法:dir(对象)

    可迭代对象就遵循可迭代协议。

    接触过的可迭代对象有:str,list,tuple,dict,set,range

    迭代器:f1文件句柄

    如何判断

    法一:

    例:s = 'laonanhai'

    print('__iter__' in dir(s))

    法二:

    例:l = [1, 2, 3, 4]
    from collections import Iter

    print(isinstance(l, Iterable))

    返回结果:# True

     

    2.迭代器

    什么是迭代器

    可迭代对象转化成迭代器:可迭代对象.__iter__()  --->迭代器

    不仅含有__iter__方法,还要含有__next__方法

    例:l1 = [1,2,3]

    l1_obj = l1.__iter__()

    print('__iter__' in  dir(l1_obj))  #True

    print('__next__' in  dir(l1_obj)) #True

     

    判断迭代器:

    法一:

     print('__iter__' in dir(l1_obj)) #判断是否是可迭代对象
    print('__next__' in dir(l1_obj)) #判断是否为迭代器

    法二:
    from collections import Iterator 
    print(isinstance(l1_obj, Iterator))

    迭代器的好处:

    1.节省内存空间,只有执行__next__函数,才会进行下一步,并加载到内存中.

    2.满足惰性机器

    3.不能反复取值,不可逆.

    例:用while循环模拟for循环内部机制

    思路:

    '''

    1.将可迭代对象转化成迭代器

    2.内部使用__next__方法,取值

    3.运用了异常处理去处理报错

    '''

     li = [1,2,3,4,5,6,7]

    li_obj = li.__iter__()

    while True:

      try:

        i = li_obj.__next__()

        printe(i)

       except  Exception:

        break

     #  Exception 表示一切非代码错误

    3.生成器

    (1)

    什么是生成器:生成器本质是迭代器,是特殊的迭代器.所以迭代器的有点它都具有.

    (2)

    生成器的产生方式:

    1.生成器函数构造

    2.生成器推导式构造

    3.数据类型的转换

    1.生成器函数构造

    方法:

    正常函数下面将return 变成yield,就可以将函数转变成生成器.

    例:

    def funcl():

      print(666)

      print(555)

      return 777

    print(funcl())

    def funcl1():

      print(666)

      print(555)

      yield 444

      yleld 777

    g = funcl()

    print(g)

    结论:# <generator object func1 at 0x0000000001197888>

    解析:

    第一:函数中只要有yield 那他就不是一个函数,而是一个生成器

    第二:g称作生成器对象

    执行:

    print(g.__next__())

    print(g.__next__())

    print(g.__next__()) #超出yield数量,报错

    sent的作用

    next 和send 功能一样,都是执行一次
    send可以给上一个yield赋值

    例:

    def generator():
      print(123)
      content = yield 1
      print(content)
      print(456)
      yield 2
    g = generator()
    g.__next__()
    g.send('hello')

  • 相关阅读:
    IOS AutoLayout 代码实现约束—VFL
    理解iOS Event Handling
    一些优秀的iOS第三方库
    iOS中NSNotification、delegate、KVO三者之间的区别与联系?
    laravel 框架加载自定义函数/类文件
    Nodejs 使用 socket.io 简单实现实时通信
    Redis 与 Memcache 的异同之处
    Redis 服务安装
    PHP 依赖管理神器 Composer 基本使用
    Ajax无刷新图片插件使用
  • 原文地址:https://www.cnblogs.com/tom2ling/p/8710806.html
Copyright © 2020-2023  润新知