zoukankan      html  css  js  c++  java
  • python 基础篇 13 迭代器与生成器

    13. 前⽅⾼能-迭代器和⽣成器
    本节主要内容:
    1. 迭代器
    2. ⽣成器

    . 迭代器
    我们之前⼀直在⽤可迭代对象进⾏迭代操作. 那么到底什么是可迭代对象. 本⼩节主要讨
    论可迭代对象. ⾸先我们先回顾⼀下⽬前我们所熟知的可迭代对象有哪些:
    str, list, tuple, dict, set. 那为什么我们可以称他们为可迭代对象呢? 因为他们都遵循了可
    迭代协议. 什么是可迭代协议. ⾸先我们先看⼀段错误代码:

    注意看报错信息中有这样⼀句话. 'int' object is not iterable . 翻译过来就是整数类型对象
    是不可迭代的. iterable表⽰可迭代的. 表⽰可迭代协议. 那么如何进⾏验证你的数据类型是否
    符合可迭代协议. 我们可以通过dir函数来查看类中定义好的所有⽅法.

    我们发现在字符串中可以找到__iter__. 继续看⼀下list, tuple, dict, set

     我们发现这⼏个可以进⾏for循环的东⻄都有__iter__函数, 包括range也有. 可以⾃⼰试⼀
    .
    综上. 我们可以确定. 如果对象中有__iter__函数. 那么我们认为这个对象遵守了可迭代协议.
    就可以进⾏迭代. 这⾥的__iter__是帮助我们获取到对象的迭代器. 我们使⽤__next__()来获取
    到⼀个迭代器中的元素. 那么我们之前讲的for的⼯作原理到底是什么? 继续看代码

     

    . ⽣成器
    什么是⽣成器. ⽣成器实质就是迭代器.
    python中有三种⽅式来获取⽣成器:
    1. 通过⽣成器函数
    2. 通过各种推导式来实现⽣成器
    3. 通过数据的转换也可以获取⽣成器
    今天, 我们主要使⽤⽣成器函数来完成⽣成器的创建和使⽤.
    ⾸先, 我们先看⼀个很简单的函数:

    运⾏的结果和上⾯不⼀样. 为什么呢. 由于函数中存在了yield. 那么这个函数就是⼀个⽣成器
    函数. 这个时候. 我们再执⾏这个函数的时候. 就不再是函数的执⾏了. ⽽是获取这个⽣成器.
    如何使⽤呢? 想想迭代器. ⽣成器的本质是迭代器. 所以. 我们可以直接执⾏__next__()来执⾏
    以下⽣成器.

     

    示例:

     当程序运⾏完最后⼀个yield. 那么后⾯继续进⾏__next__()程序会报错.
    好了⽣成器说完了. ⽣成器有什么作⽤呢? 我们来看这样⼀个需求. 公司向JACK JONES
    10000套学⽣服. JACK JONES就比较实在. 直接造出来10000套衣服.

    但是公司现在没那么多人啊,你一下给我一万套我没地方存啊,很尴尬,   

    最完美的就是我用一套 你给我一套  

     

    区别: 第⼀种是直接⼀次性全部拿出来. 会很占⽤内存. 第⼆种使⽤⽣成器. ⼀次就⼀个. ⽤多
    少⽣成多少. ⽣成器是⼀个⼀个的指向下⼀个. 不会回去, __next__()到哪, 指针就指到哪⼉.
    下⼀次继续获取指针指向的值.

    ---->>>> send和__next__区别<<<<<-----

    第一次执行必须用__next__

     

    这个比较乱,可以自己运行一下看看结果    先打印 然后打印yield返回值  然后send传值进上一个yield  打印出来

  • 相关阅读:
    L1和L2正则
    Python基础(一)
    消息分发
    StringList 自定义快速排序
    Delphi Length函数
    接口的委托实现(通过接口)
    接口委托实现--通过类的对象
    排序
    Socket编程(摘抄)
    Delphi线程同步
  • 原文地址:https://www.cnblogs.com/dalaoban/p/9198741.html
Copyright © 2011-2022 走看看