zoukankan      html  css  js  c++  java
  • 生成器

    1.生成器

    迭代器有两种:一种是调用方法直接返回的,一种是可迭代对象通过执行iter方法得到的,迭代器的好处是可以节省内存。

    生成器:就是自己用python代码写的迭代器,生成器的本质就是迭代器。

    迭代器的构建:1.通过生成器函数 2.生成器表达式。

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

    def func1(x):
        x +=1
        print(x)
        yield x
        x +=2
        print(x)
        yield x
    m = func1(5)
    print(m.__next__())
    print(m.__next__())

    yield和return

    yield:不会结束函数,一个next对应一个yield,给生成器对象.__next__()返回值。

    return:结束函数,给函数的执行者返回一个值。

    #生成器表达式

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

    g = (i for i in range(10000))
    print(g.__next__())
    print(g.__next__())
    print(g.__next__())
    print(g.__next__())
    print(g.__next__())

    2.生成器与迭代器的区别

    区别1:自定制的区别

    区别2:内存级别的区别

    迭代器是需要可迭代对象进行转化。可迭代对象非常占内存。

    生成器直接创建,不需要转化,从本质就节省内存。

    3.send 与 next

    def func1():
        # print(1)
        count = yield 6
        print(count)
        # print(2)
        count1 = yield 7
        print(count1)
        # print(3)
        yield 8
    g = func1()
    print(next(g))
    g.send('alex')
    g.send('太白')

    send与next一样,也是对生成器取值(执行一个yield)的方法。

    send可以给上一个yield传值。

    第一次取值永远是next。

    最后一个yield永远也得不到send传的值。

    4.列表推导式

    一行代码几乎搞定你需要的任何列表。

    循环模式

    l = [i for i in range(1,10)]
    print(l)

    筛选模式

    m = [i for i in range(1,30) if i%3==0]
    print(m)

    列表推导式优缺点:

    优点:一行解决,方便。

    缺点:容易着迷,不宜排错,不能超过三次循环。

    列表推导式不能解决所有列表的问题,所以不要太可以用。

  • 相关阅读:
    SQL Server中怎样可以从SELECT语句的结果集中删除重复行
    Comparison method violates its general contract!
    如何解决 不能以 DISTINCT 方式选择 text、ntext 或 image 数据类型
    TortoiseSVN—Repo-browser
    使用BigDecimal完成小数点后的精确位数的四舍五入
    CREATE TABLE 语句后的 ON [PRIMARY] 起什么作用
    sql server 获取每一个类别中值最大的一条数据
    C# 正则表达式
    Linq to XML 读取XML 备忘笔记
    安装双系统需要注意的几个问题
  • 原文地址:https://www.cnblogs.com/caoshitong/p/9506242.html
Copyright © 2011-2022 走看看