zoukankan      html  css  js  c++  java
  • python笔记(六)迭送器和生成器

    一、迭送器

    1.1可迭代协议(iteradle)

    可迭代协议可以被迭代要满足的要求就叫做可迭代协议

    可迭代协议的定义:内部实现了__iter__方法可以实现_iter_的内置方法的都是可迭代对象

    可以被for循环的对象都是可迭代的对象

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

    1.2迭代器(iterator)

    迭代器遵循迭代器协议:必须拥有__iter__方法和__next__方法

    优点:   - 提供一种统一的、不依赖于索引的迭代方式   - 惰性计算,节省内存

    缺点:   - 无法获取长度(只有在next完毕才知道到底有几个值)   - 一次性的,只能往后走,不能往前退,执行到最后一个元素后,会报错

    二、生成器(Generator)

    生成器定义

    1.生成器函数:常规函数定义,使用yield语句而不是return语句返回结果。yield语句一次返回一个结果,在每个结果中间,挂起函数的状态,以便下次重它离开的地方继续执行

    2.生成器表达式:类似于列表推导,但是,生成器返回按需产生结果的一个对象,而不是一次构建一个结果列表

    3.本质:生成器的本质为迭代器(所以自带了__iter__方法和__next__方法,不需要我们去实现)   

    4.特点:惰性运算,开发者自定义

    生成器的优点

    1.延迟计算,一次返回一个结果。也就是说,它不会一次生成所有的结果,这对于大数据量处理,将会非常有用

    2.提高代码可读性

    生成器表达式

    1 g=('%s' %i for i in range(10))
    2 for i in g:
    3     print(i)

    yield from

     1 def gen1():
     2     for c in 'AB':
     3         yield c
     4     for i in range(3):
     5         yield i
     6 
     7 print(list(gen1()))
     8 
     9 def gen2():
    10     yield from 'AB'
    11     yield from range(3)
    12 
    13 print(list(gen2()))
    14 # 两个函数执行的结果是一样的

    send

     1 def generator():
     2     print(123)
     3     content = yield 1
     4     print('=======',content)
     5     print(456)
     6     yield 2
     7 
     8 g = generator()
     9 ret = g.__next__()
    10 print('***',ret)
    11 ret = g.send('hello')   #send的效果和next一样
    12 print('***',ret)
    13 
    14 #send 获取下一个值的效果和next基本一致
    15 #只是在获取下一个值的时候,给上一yield的位置传递一个数据
    16 #使用send的注意事项
    17     # 第一次使用生成器的时候 是用next获取下一个值
    18     # 最后一个yield不能接受外部的值

    三、推导式

    1 #列表推导式
    2 g=[i for i in range(10)]
    3 print(g)
    4 #与生成器表达式的区别为:生成器用(),列表用[]

    遍历之后挨个处理:[每一个元素或者是和元素相关的操作 for 元素 in 可迭代数据类型]
    筛选功能:[满足条件的元素相关的操作 for 元素 in 可迭代数据类型 if 元素相关的条件]

    例子:所有能被3整除的数

    1 ret = [i for i in range(30) if i%3 == 0]  #完整的列表推导式
    2 print(ret)
  • 相关阅读:
    Go学习(5):集合
    Go学习(4):数组和切片
    Go学习(3):分支循环
    Go学习(2):基本语法
    Go学习(1):简介和配置
    input输入框只能输入数字而且开头不能为零
    JS 显示周 几和 月 日
    IntelliJ Idea 跳出括号并且光标移到末尾的快捷键
    不可小视的String字符串
    PrintWriter中的write与println方法居然就是这些区别
  • 原文地址:https://www.cnblogs.com/zxq520921/p/9430632.html
Copyright © 2011-2022 走看看