Python3.x基础学习-生成器用法
2021-02-16 03:17
标签:generator 返回 orm for 两种 包含 学习 fun int 生成器的本质就是迭代器 一个包含yield关键字的函数就是一个生成器函数。并且yield不能和return共用,并且yield只能用在函数内 send 获取下一个值的效果和next()基本一直,只是在获取下一个值的时候,给上一个yeild的位置传递一个数据 Python3.x基础学习-生成器用法 标签:generator 返回 orm for 两种 包含 学习 fun int 原文地址:https://www.cnblogs.com/johnsonbug/p/12709693.html生成器
生成器包括两种:生成器函数和生成器表达式
(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 indexn:
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 ‘\r{}桶方便面‘.format(i)
time.sleep(0.01)
g = ksf()
for i in range(100000):
print(next(g))
# 0桶方便面
# 1桶方便面
# 2桶方便面
#...
# 100000桶方便面send()
使用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
上一篇:Java泛型常见面试题
文章标题:Python3.x基础学习-生成器用法
文章链接:http://soscw.com/index.php/essay/55902.html