Python3.x基础学习-生成器用法

Posted Johnsonbug

tags:

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

生成器

生成器的本质就是迭代器
生成器包括两种:生成器函数和生成器表达式

一个包含yield关键字的函数就是一个生成器函数。并且yield不能和return共用,并且yield只能用在函数内
(1)生成器函数执行之后会得到一个生成器作为返回值,并不会执行函数体。
(2)执行了__next__()方法之后才会执行函数体,并且获得返回值
(3) next()内置方法,内部调用生成器函数的__next__()方法。
(4)yield和return相同的是可以返回值,但是不同的是yield不会结束函数

 

def func():
    print(---func---)
    yield 1

g = func()
# print(g) 
print(g.__next__())
print(next(g))   # StopIteration

# ---func---
# 1

 

def func():
    print(---func---)
    yield 1
    print(---func2---)
    yield 2
g= func()
print(g.__next__())
# print(g.__next__())
# print(g.__next__())  #StopIteration
print(next(g))

# ---func---
# 1
# ---func2---
# 2

 

def fib(n):
    index = 0
    a,b =0,1
    print(---1---)
    while index<n:
        print(---2---)
        a,b = b,a+b
        yield a
        index+=1
        print(----3---)

g = fib(5)
print(next(g))
print(next(g))
print(next(g))
print(next(g))
print(next(g))

# ---1---
# ---2---
# 1
# ----3---
# ---2---
# 1
# ----3---
# ---2---
# 2
# ----3---
# ---2---
# 3
# ----3---
# ---2---
# 5

 

import time

def ksf():
    for i in range(100000):
        yield 
{}桶方便面.format(i)
        time.sleep(0.01)


g = ksf()
for i in range(100000):
    print(next(g))

# 0桶方便面
# 1桶方便面
# 2桶方便面
#...
# 100000桶方便面

send()

send 获取下一个值的效果和next()基本一直,只是在获取下一个值的时候,给上一个yeild的位置传递一个数据
使用send的注意事项
(1)第一次使用生成器的时候是用next获取下一个值,不能第一次使用send,或者使用g.send(None)唤醒
(2)最后一个yield不能接手外部的值

def generator():
    print(a)
    count = yield 1
    print(--->,count)
    print(b)
    yield 2
    print(c)
g = generator()
print(next(g))
print(g.send(None))

# a
# 1
# ---> None
# b
# 2

 


# 求移动平均值
#10 10
#20 15
#30 20

def
func(): sum = 0 count = 0 avg = 0 while True: print(---1----) get_num =yield avg print(---2----) sum +=get_num count+=1 print(---3----) avg = sum/count g = func() next(g) print(g.send(10)) print(g.send(20)) print(g.send(30)) # ---1---- # ---2---- # ---3---- # ---1---- # 10.0 # ---2---- # ---3---- # ---1---- # 15.0 # ---2---- # ---3---- # ---1---- # 20.0

 

# yield from循环遍历容器类型  返回一个新的迭代器

def func():
    for i in hello:
        yield i
    for j in range(3):
        yield j
f = func()
print(next(f))
print(next(f))
print(next(f))
print(next(f))
print(next(f))
print(next(f))
print(next(f))

# h
# e
# l
# l
# o
# 0
# 1

# 同样

def func():
yield from ‘hello‘
yield from range(3)

f = func()
for i in f:
print(i)
 

 

# #生成器表达式
# # 格式:将列表解析式[]改成()即可
lst=[i for i in range(10)]
print(lst)
iter1 = iter(lst)
print(next(iter1))

g = (i for i in range(10))
print(g)
print(next(g),----0----)
print(next(g),----1----)

for i in g:
    print(i)

# 0 ----0----
# 1 ----1----
# 2
# 3
# 4
# 5
# 6
# 7
# 8
# 9

 

以上是关于Python3.x基础学习-生成器用法的主要内容,如果未能解决你的问题,请参考以下文章

Python3.x基础学习-函数用法

Python3.x基础学习-UDP和TCP用法

Python3.x基础学习-文件基本操作和with用法

#yyds干货盘点#return用法 - python基础学习系列(64)

Python3.x基础学习-异常报错处理

Python3.x:基础学习