生成器

Posted lilei1996

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了生成器相关的知识,希望对你有一定的参考价值。

生成器:生成器实质就是迭代器,在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]

 

  

 

 

  

 

 

 

以上是关于生成器的主要内容,如果未能解决你的问题,请参考以下文章

Apollo Codegen 没有找到生成代码的操作或片段

前端开发工具vscode如何快速生成代码片段

前端开发工具vscode如何快速生成代码片段

vscode代码片段生成vue模板

VS Code配置snippets代码片段快速生成html模板,提高前端编写效率

vs 2010代码片段