• Python3基础笔记--生成器


    目录:                                                  

    一、列表生成器

    二、生成器

    三、迭代器

    一、列表生成器

    a = [x for x in range(10)]
    
    b= [y*2 for y in range(10)]
    
    def f(n)
        return n*n*n
    
    c = [f(z) for z in range(10)]

     列表生成器会将所有的内容加载到内存中,在生成大量的数据时,会占用内存

    生成器只会生成一个  generator object   ,占用很少内存,只会在调用时才产生值。且只能按顺序取值

    二、生成器

    1、基础代码

    b = (x for x in range(10))
    print(b)
    
    print(next(b))    # 等价于 b.__next__()   等价于python2中的b.next()
    print(b.__next__())
    
    for i in b:
        print(i)
    
    
    '''output
    <generator object <genexpr> at 0x000002900B1BB308>
    0
    1
    2
    3
    4
    5
    6
    7
    8
    9
    '''

     2、两种生成方式

    ①   (x for x in range(10))

    ②  yield方式

    第②种代码

    def foo():
        print("ok")
        yield 1
        
        print("fine")
        yield
    
    g = foo()
    print(g)
    
    # next(g)
    # aa = next(g)
    # print(aa)
    
    for i in g:
        print(i)

    遇到函数中有  yield   则该函数为生成器

    一个yield是一个生成器的生成物的结点,它会返回yield 后面的内容,然后结束,直到下一个next的调用 

     3、send()方法

    def bar():
        c = yield 0
        print(c)
        print("ok1")
        count = yield 1
    
        print(count)
        print("ok2")
        yield 2
    
    g = bar()
    print(g)
    
    # print(next(g))
    print(g.send('ccc'))   # TypeError: can't send non-None value to a just-started generator
    
    print(g.send("qqqq"))

    send()方法与next()方法类似,但可以向生成器中传值,用于一些交互场景,但在第一个send()前如果没有next(),只能传一个send(None),否则会出现  TypeError: can't send non-None value to a just-started generator

    三、迭代器

    参考博客:Python之路,Day4 - Python基础4 (new版)

          Py西游攻关之迭代器&生成器

    什么是迭代器?

    满足两个条件:①有iter方法  ②有next方法

    区别迭代器与可迭代对象

    from collections import Iterator,Iterable
    
    l = [1, 2, 3]
    
    print(isinstance(l,list))
    print(isinstance(l,Iterator))   # False   不是迭代器
    print(isinstance(l,Iterable))   # True    是可迭代对象
    
    for i in l:
        print(i)
  • 相关阅读:
    C# MVC 自定义ActionResult实现EXCEL下载
    如何让WEBAPI 能够进行跨越访问
    C#进阶系列——WebApi 接口返回值不困惑:返回值类型详解
    sC#进阶系列——WebApi 接口参数不再困惑:传参详解
    mybatis.net insert 返回主键
    [转]MySQL中timestamp数据类型的特点
    [转]java List和数组相互转换方法
    [转]Mybatis foreach 批量操作
    [转]让iframe自适应高度-真正解决
    [转]decorators.xml的用法
  • 原文地址:https://www.cnblogs.com/panlei3707/p/8471974.html
Copyright © 2020-2023  润新知