• 生成器


    生成器:生成器实质就是迭代器,在python中有三种方式来获取生成器:

    1通过生成器函数

    2.通过各种推导式

    3.通过数据的转换也可以实现

    def func():
        print("1112")
        return 2223
    ret=func()
    print(ret)
    结果:
    1112
    2223    

    将函数中的return换成yield就是生成器

    def func():
        print("1112")
        yield 2223
    ret=func()
    print(ret)
    结果:
    <generator object func at 0x0000000002501EB8>    

    结果出现了一个内存地址,函数中存在yield,那么这个函数就是一个生成器函数,因为生成器的本质就是迭代器,所以我们可以直接执行__next__()来执行生成器

    def func():
        print("1112")
        yield 2223
    g=func()   #到这函数不会执行,会变成一个生成器
    ret=g.__next__() #到这里函数才会执行,yield的作用和return一样的都是返回数据
    结果:
    1112
    2223 

    yield的特点:可以记录当前函数中执行的位置,写一次继续执行

    生成器的特点:

      调用之后不执行,需要用next来出发这个函数继续执行下去

      yield停止符,也是记录符

      生成器函数和其他函数本质上和我们得到的是相同的,中间过程不同

    yield和return的区别

      yield是分段来执行一个函数

      return 直接停止执行函数

    def func():
        print("1112")
        yield 2223
        print("3334")
        yield 4445
    g=func()
    ret=g.__next__()
    print(ret)
    ret2=g.__next__()
    print(ret2)
    ret3=g.__next__()  #最后一个yield执行完毕,再次__next__()程序报错,也就是说和return无关了
    print(ret3)
    

     生成器的作用:节省内存,一次调用一个,__next__()到哪快,下一个__next__继续获取下一个值

    send方法:

    def gener():
        print("草莓味")
        smell=yield 1
        print(smell)
        smell2=yield 2
        print(smell2)
        yield 3
    
    g=gener()
    print(g.__next__())
    ret=g.send("香蕉味")
    print(ret)
    ret2=g.send("榴莲味")
    print(ret2)
    

    1..生成器函数永远得到的是一个生成器

    2.启动生成器的第一个方法永远是next

    3.从第二个开始可以是send

    4.g.__next__相当于同一g.send(None)

    5.如果send发送了值,但是yield没有接收,不会报错,也不会收到值

    send和__next__()区别:

      1.send和__next__都是让生成器向下走一次

      2.send可以给上一个yield的位置传递值,在第一次执行生成器代码的时候不能使用send()  

    生成器可以会用for循环获取内部的元素:

      

    def func():
        print(1112)
        yield 2223
        print(3334)
        yield 4445
        print(5556)
        yield 6667
    g=func()
    for i in g:
        print(i)
    结果:
    1112
    2223
    3334
    4445
    5556
    6667
    

     生成器:

        send/__next__ 生成器外用 

        yield/yield from 生成器内用

    next+send==yield

        如果函数中yield需要接收参数,那么应该使用send传值

        如果函数中yield不需要接收参数,那么直接使用next即可

        生成器和迭代器是一样的,内部的值都是只能取一次值

        从生成器中取值的方式也和迭代器是一样

    监听文件输入:
     def func():
         f=open("t.txt",encoding="utf-8")
        while 1:
            line=f.readline().strip()
            if line:
                yield line.strip()
    line1=func()
    foe i in line1:
        print(i.split(","))
    

      

    浮点数:float :小数点的浮动

    浮点数能不能表示数学上的数字:有理数(有限小数,无限循环小数)

    浮点数是不准确的,小数的小数位是转换成二进制存储的

    如果想准确的存储:转换成字符串存储

    如果创建的变量本身带小数点,那么这个变量的数据类型直接就是浮点数

    所有的除法(除了//平地除)得到的都是小数

    除法:

      python2.x:整数除以整数就会取值,(向下取整)有一个数浮点数,就找哪块浮点数计算

      python3.x所有的除法(除了//)得到的都是小数

    列表推导式:

      当已经有一个列表,从这个列表中的每一个元素都需要做某个操作,并且需要将操作的结果放在一个新的列表中,适合使用列表推导式

    lst=[1,2,3,4,5]

    new_lst=[i for i in lst]

     

      

      

     

     

  • 相关阅读:
    10.19
    10.17
    张钊的作业
    张钊的第十一份作业
    张钊的第十份作业
    张昭的第九次作业
    张钊的第八份作业
    张钊的第七份作业
    张钊的第六次作业啊
    张钊O的第五次作业
  • 原文地址:https://www.cnblogs.com/lilei1996/p/9919025.html
Copyright © 2020-2023  润新知