Python面向对象进阶之生成器

一、列表生成式(几种形式记住)

Python面向对象进阶之生成器_第1张图片

生成器

1. 什么是生成器

Python面向对象进阶之生成器_第2张图片

1、生成器的特点:只是保存了生成列表数的一个算法,什么时候需要用,就next() 调用。 

2. 创建生成器方法1 

要创建一个生成器,有很多种方法。第一种方法很简单,只要把一个列表生成式的 [ ] 改成 ( )

Python面向对象进阶之生成器_第3张图片

Python面向对象进阶之生成器_第4张图片

②第二种写法:可 for  in 循环

Python面向对象进阶之生成器_第5张图片

 

3. 创建生成器方法2 

Python面向对象进阶之生成器_第6张图片

Python面向对象进阶之生成器_第7张图片

"""斐波那契数列"""
def fib(times):
    n=0
    a,b=0,1
    while n

Python面向对象进阶之生成器_第8张图片

 Python面向对象进阶之生成器_第9张图片

"""斐波那契数列"""
def fib(times):
    n=0
    a,b=0,1
    while n

 结果:

D:\Anaconda\python.exe E:/pythonwork/黑马/面向对象进阶之生成器.py
1
1
2
3
5
Traceback (most recent call last):
  File "E:/pythonwork/黑马/面向对象进阶之生成器.py", line 30, in 
    print(next(F))
StopIteration: done

Process finished with exit code 1

Python面向对象进阶之生成器_第10张图片

 

Python面向对象进阶之生成器_第11张图片

Python面向对象进阶之生成器_第12张图片

"""yield的运行原理:从函数的开头开始执行,到yield暂停,将yield后面的值返回。
    如果再调用一下next(a),从暂停的地方继续执行,再循环到yield处停止,指导循环结束"""
def createNum():
    a,b=0,1
    print('---start---')
    for i in range(15):
        print('---1---')
        yield b #只要添加yield的函数。就变成生成器了
        print('---2---')
        a,b=b,a+b
demo=createNum() #保存的是一个生成器对象
# print(next(demo))
# print(next(demo))
# print(next(demo))

#第一种方法,一次性得到,拿到数据,超过range值不会保存
for res in demo:
    print(res)
    
#第二种方法,一次一次的打印出来
res=demo.__next__()
print(res)
res=demo.__next__()
print(res)

三、生成器——send:传值用

t.__next__() 和 t.send("haha")两步原理:
第一次执行t.__next__()时运行到yield i 时就暂停了,把yield后面的i=0返回给了res值了
再执行t.send("haha"),使程序往下执行,接着执行temp=yield i等号左边的temp,并传值
给了temp,依次循环,——执行到yield就停,返回值给res,send继续执行,传值给temp

"""t.__next__()和t.send('haha')两步原理:
   第一次执行t.__next__()运行到yield时就暂停了,把yield后面的i=0返回给了res值了
   再执行t.send("haha"),使程序往下执行,接着执行temp=yield i等号左边的temp,并传值
给了temp,依次循环,——执行到yield就停,返回值给res,send继续执行,传值给temp"""
def Test():
    i=0
    while i <5:
        temp=yield i #到这就暂停返回值给res,遇到send继续执行,参数给temp
        print(temp)
        i+=1
#总之,yield后面的返回值都给了res,send('haha')传的参数都给了temp,print(temp) 打印出来
t=Test()
res=t.__next__()
print(res)
res=t.send('haha')
print(res)
res=t.send('haha')
print(res)
D:\Anaconda\python.exe E:/pythonwork/黑马/面向对象进阶之生成器.py
0
haha
1
haha
2

Process finished with exit code 0

四、生成器--注意事项
1、不能一上来就使用t.send(“haha”)或者 t.send()什么也不传,会报错

      应该结合使用:t.__next__()

                               t.send("传的参数")

2.如果非要一开始就传,传个None:

           t.send(None)

3、再传值时,temp的值不会被修改
      一个函数里面可以有多个yield,也就是只要有一个yield的话,这个函数就是一个生成器
Python面向对象进阶之生成器_第13张图片

"""t.__next__()和t.send('haha')两步原理:
   第一次执行t.__next__()运行到yield时就暂停了,把yield后面的i=0返回给了res值了
   再执行t.send("haha"),使程序往下执行,接着执行temp=yield i等号左边的temp,并传值
给了temp,依次循环,——执行到yield就停,返回值给res,send继续执行,传值给temp"""
def Test():
    i=0
    while i <5:
        if i==0:
            temp=yield i #到这就暂停返回值给res,遇到send继续执行,参数给temp
            print(temp)
        else:
            yield i
        i+=1
#总之,yield后面的返回值都给了res,send('haha')传的参数都给了temp,print(temp) 打印出来
t=Test()
res=t.__next__()
print(res)
res=t.send('haha')
print(res)

res=t.send('xixi')
print(res)
res=t.send('xixi')
print(res)
D:\Anaconda\python.exe E:/pythonwork/黑马/面向对象进阶之生成器.py
0
haha
1
2
3

Process finished with exit code 0

总结 

Python面向对象进阶之生成器_第14张图片

 

 

 

 


 

 

你可能感兴趣的:(python)