美文网首页
day11-04 Python的迭代器生成器

day11-04 Python的迭代器生成器

作者: 代码小小白 | 来源:发表于2020-08-13 15:20 被阅读0次
    可迭代对象
    • 字面意思:一个可以进行循环更新的一个试试在在的值
    • 专业角度:内部含有"_iter_"方法的对象称为可迭代对象
    • 判断一个对象是不是可迭代对象
      1.通过dir(obj)函数获取该对象所有的方法,结果是list。通过判断"_iter_"是否在列表中即可。
      例:
    name="python"
    print("__iter__" in dir(name))
    

    输出结果:

    True
    
    • 可迭代对象的优缺点:
      优点:
    1. 存储数据能直接展示,比较直观
    2. 拥有的方法比较多,方便操作
      缺点:
    3. 占用内存
    4. 不能直接取值,虽然能通过for循环取值,实际上是内部转化成了迭代器
    迭代器
    • 迭代器的含义
      • 字面意思:可更新迭代的工具
      • 专业角度:内部含有"_iter"方法,并且含有"_next"方法的对象就是迭代器
      • 判断是否迭代器:"_iter_" and "_next_"方法在对象中
    • 可迭代对象转化成迭代器
      • iter(obj) 或者 obj.iter()
      • 使用next()或者next()进行迭代
        例:
    l1 = [11,22,33,44]
    obj = iter(l1)
    # obj = l1.__iter__()
    print(next(obj)) # print(obj.__next__())
    print(next(obj)) # print(obj.__next__())
    print(next(obj)) # print(obj.__next__())
    print(next(obj)) # print(obj.__next__())
    print(next(obj)) # print(obj.__next__())
    
    • 输出结果
    11
    22
    33
    44
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    StopIteration
    

    当迭代器超过他本身对象个数时,会抛出StopIteration的错误
    迭代器也可以直接for循环,(其实可迭代对象不能for循环,只是内部做了特殊处理
    例:

    l1 = [11,22,33,44]
    obj = iter(l1)
    for i in obj:
      print(i)
    
    • 输出结果
    11
    22
    33
    44
    
    • 优点:
    1. 节省内存
    2. 惰性机制,next一次取一个值,不会多取
    • 缺点
    1. 速度慢,以时间换空间
    2. 只能顺序取值,不走回头路
    生成器
    • 生成器:
      • 生成器:
        • 获取生成器的三种方式
          • 生成器函数
            def func():
                print(111)
                yield 1
                yield 2
            ret = func() # 生成一个生成器对象
            print(ret)   # <generator object func at 0x10cfee450> 
            #一个yield对应一个next
            print(next(ret)) # 111  1
            print(next(ret))# 2
            
            备注:return 和 yield的区别
            return: 一个函数只有一个return,return会终结函数的执行,并且返回return后面的值
            yield:只要函数中还有yield,他就不是函数,而是一个生成器,一个函数可以有多个yield,他不会结束函数的执行,一个yield对应一个next
            yield from:会将yield from 后面的值变成一个迭代器返回
            例:
            def func():
                lst1 = ['卫龙', '老冰棍', '北冰洋', '牛羊配']
                lst2 = ['馒头', '花卷', '豆包', '大饼']
                yield from lst1
                yield from lst2
            
            s= func() 
            print(s) # <generator object func at 0x104e242d0>
            print(next(s)) # 卫龙 |如果不加from,则会返回lst1这个列表
            print(next(s)) # 老冰棍 |如果不加from,则会返回lst2这个列表
            
          • 生成器表达式
            • 列表推导式 :用一行代码构建一个比较复杂有规律的列表。
              • 两类列表推导式
              1. 循环模式:[变量(可加工) for 变量 in iterable]
                例子:将10以内所有整数的平方写入列表。
                [i**2 for i in range(1,11)]
                
              2. 条件模式:[变量(可加工) for 变量 in iterable if 条件]
                例子:30以内能被3整除的数
                [i for i in range(1,31) if i%3 == 0]
                
              • 生成器表达式:与列表推导式几乎一模一样,只是把 [ ] 改成了()
                • 生成器表达式和列表推导式的区别:生成器表达式生成的是生成器对象,而列表推导式生成的是可迭代对象
              • 字典推导式
               lst1 = ['jay', 'jj', 'meet']
               lst2 = ['周杰伦','林俊杰','元宝']
               dict = {lst2[i]:lst1[i] for i in range(len(lst1))}
              
              • 集合推导式
               {i for i in range(1,11)}
              
          • Python内部提供的一些: 文件句柄

    相关文章

      网友评论

          本文标题:day11-04 Python的迭代器生成器

          本文链接:https://www.haomeiwen.com/subject/iwnpdktx.html