zoukankan      html  css  js  c++  java
  • python3 迭代器&生成器

    前戏:列表生成式

    等于

    用列表生成式生成列表。需要将所有数据生成到内存中,占用空间,如果数据太多。生成数据就会耗时较久。

    例如需要运行卡顿一下.....

    定义一个生成器:定义时不生成任何数据,只有通过for循环调用,或者生成器本身自带的__next__()方法来调用 。

    注意:1、__next__()方法调用时,只能向下调用,无法向上调用。

       2、内存中只保存当前调用生成的这一个 数据,已经取(生成)过的数据,无法再次访问。只能再次从头循环取。。

    用函数制作一个生成器:yield 关键字

    生成器只有__next__()方法获取已有的yield值

     新知识:异常捕获、next内置方法两种用法

     

     send()方法:给yield传一个值,同时进行__next__()调用,进行生成器的返回:取yield本次获取的值。并进行本次代码执行。

    __next__()只进行唤醒本次取值,无法给yield传值。

    send()可以给yield传值,并唤醒取值。

    迭代器:

    迭代是访问集合元素的一种方式。迭代器是一个可以记住遍历的位置的对象。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。可以使用__next__()不断循环返回下一个值得对象为“迭代器”

    :如字符串、列表、元组、字典、generator生成器。等...

    可被for循环取值的对象为可迭代对象。

    迭代器:

    判断是否可以迭代

    In [50]: from collections import Iterable
    
    In [51]: isinstance([], Iterable)
    Out[51]: True
    
    In [52]: isinstance({}, Iterable)
    Out[52]: True
    
    In [53]: isinstance('abc', Iterable)
    Out[53]: True
    
    In [54]: isinstance((x for x in range(10)), Iterable)
    Out[54]: True
    
    In [55]: isinstance(100, Iterable)
    Out[55]: False

     如何看一个对象(或者说变量)是否是迭代器:使用dir(对象名) 看所有的方法中是否有__next__()方法

     饶舌:生成器一定是迭代器,迭代器不一定是生成器。

     

     将一个可迭代对象(如列表、字典、元组、字符串)iter()变成迭代器

  • 相关阅读:
    [博客美化]给你博客添加一个萌萌的看板娘吧
    精简Command版SqlHelper
    使用VS2017创建EF框架实例
    Ueditor1.4.3.3 asp UTF-8版文件缺失修改方法
    android studio编译包真机安装失败解决方案记录
    ANDROID开发之问题积累及解决方案(四)
    ANDROID开发之问题积累及解决方案(三)
    ANDROID调用webservice带soapheader验证
    ANDROID开发之问题积累及解决方案(二)
    ANDROID开发之问题积累及解决方案(一)
  • 原文地址:https://www.cnblogs.com/zhangmingda/p/9059616.html
Copyright © 2011-2022 走看看