码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2020-04-16 01:06:56      阅读:85      评论:0      收藏:0      [点我收藏+]

标签:generator   返回   orm   for   两种   包含   学习   fun   int   

生成器

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

一个包含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 \r{}桶方便面.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基础学习-生成器用法

标签:generator   返回   orm   for   两种   包含   学习   fun   int   

原文地址:https://www.cnblogs.com/johnsonbug/p/12709693.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!