python生成器generator和迭代器Iterator测试

Posted 月疯

tags:

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

为什么需要使用生成器?

'''
generator生成器
通过列表推导式,我们可以创建一个新的列表,但是,受内存限制,列表的容量是有限的。
而且,创建一个包含100万个元素的列表,不仅占用很大存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都
白白浪费。所以,如果列表元素可以按照某种算法推算出来,那么我们是可以在循环的过程中不断推算出后续的元素。
这样就不必创建完整的list,从而节省大量的空间。在python中,这种一遍循环一遍计算的机制,称为生成器:generator。

得到生成器的方式:
1、通过列表推导式得到一个生成器
'''

测试01

# [x for x in range(1000000000)]
#[0,3,6,9,12,15,18,21,......,27]
newlist = [x*3 for x in range(10)]
#得到生成器
g = (x*3 for x in range(30))
print(type(g)) #generator
#方式一:通过调用__next__()方式得到元素
#每调用一次产生一个一个元素
print(g.__next__())
print(g.__next__())
#方式二:next() 系统内置函数builtins
#每调用一次产生一个一个元素
print(next(g))
print(next(g))
print(next(g))

测试02

g = (x*3 for x in range(30))

while True:
    try:
        e = next(g)
        print(e)
    except:
        print('没有更多元素了')
        break

#定义生成器的方式二:借助函数生成

#斐波那切数列

#yield就是一个生成器
def func():
    n=0
    while True:
        n += 1
        yield n


g = func()

# print(next(g))
# print(next(g))
# print(next(g))
# print(next(g))

def fib(length):
    a,b =0,1
    n=0
    while n<length:
        yield b  #return b + 暂停
        a,b = b,a+b
        n += 1

    return '没有更多元素了' #return 就是得到StopIteration的提示信息

g = fib(8)
print(next(g))
print(next(g))

测试03

'''
生成器方法:
__next__():获取下一个元素
send(value):向每次生成器调用中传值 注意:第一次调用send(None)

'''
def gen():
    i = 0
    while i < 5:
        tem = yield i   #return + 暂停  tem = 1或者2
        print('tem',tem)
        i += 1

    return '没有更多数据'


g = gen()

#g.__next__()
#为什么第一次一定要传一个NONE值,第一次还没进入yeild,不能传值
print(g.send(None))
g1 = g.send("1")
print(g1)
g2 = g.send("2")
print(g2)

04生成器应用

'''
#进程 > 线程 > 协程(一个进程包含多个线程,一个线程包含多个协程)
#迅雷可以设置线程个数
#生成器应用

'''

def task1(n):
    for i in range(n):
        print('正在搬第块砖!'.format(i))
        yield  None


def task2(n):
    for i in range(n):
        print('正在听第首歌!'.format(i))
        yield None

g1 = task1(10)
g2 = task2(5)
#交替完成
while True:
    try:
        g1.__next__()
        g2.__next__()
    except:
        pass


'''
定义生成器方式:
1、通过列表推导方式
g = (x+1 for x in range(6))
2、函数 yeild
def func():
    ...
    yeild

g =func()

产生元素:
1、next(generator)  ---> 每次调用都会产生一个新的元素,如果元素产生完毕,再次调用的话就会产生异常
2、生成器自己的方法:
   g.__next__()
   g.send(value)
   
应用:协程
'''

生成器总结:

'''
定义生成器方式:
1、通过列表推导方式
g = (x+1 for x in range(6))
2、函数 yeild
def func():
    ...
    yeild

g =func()

产生元素:
1、next(generator)  ---> 每次调用都会产生一个新的元素,如果元素产生完毕,再次调用的话就会产生异常
2、生成器自己的方法:
   g.__next__()
   g.send(value)
   
应用:协程
'''

 迭代器测试:

#可迭代的对象:1、生成器 2、元组 列表 集合 字典 字符串
#如何判断一个对象是否是可迭代的?
from collections import Iterable

list1 = [1,4,7,8,8]
f = isinstance(list1,Iterable) #判断列表是否可迭代
print(f)

# f1 = isinstance('abc',Iterable)
# f2 = isinstance(100,Iterable)

g = (x+1 for x in range(10))
f3 = isinstance(g,Iterable)
'''
迭代是访问集合元素的一种形式。迭代器是一个可以记住遍历的位置的对象。
迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。
迭代器只能往前不会退后。
可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator
只要调用next(),得到下一个元素,就是迭代器
生成器是可以迭代的,也是迭代器
list是可以迭代的,但是不是迭代器,但是可以把他变成一个迭代器iter()
元组、列表、集合、字典、字符串通过iter()转换成迭代器
'''
lit1 = [1,2,3,4]
lit = iter(lit1)

print(next(lit))
print(next(lit))

注意:

生成器是可以迭代的,也是迭代器
list是可以迭代的,但是不是迭代器,但是可以把他变成一个迭代器iter()
元组、列表、集合、字典、字符串通过iter()转换成迭代器

以上是关于python生成器generator和迭代器Iterator测试的主要内容,如果未能解决你的问题,请参考以下文章

Python生成器(generator)和迭代器(Iterator)

Python标准模块--Iterators和Generators

Python标准模块--Iterators和Generators

Python 迭代器&生成器

python生成器generator和迭代器Iterator测试

python高级特征:列表生成式;generator, 迭代器。