python生成器与迭代器基础

1.生成器

  • 在 python 中,使用了 yield 的函数被称为生成器(generator)。
  • 在调用生成器运行的过程中,每次遇到 yield 时函数会暂停并保存当前所有的运行信息,返回 yield 的值, 并在下一次执行 next() 方法时从当前位置继续运行。
  • 以斐波那契数列为例
def fib(number):   #斐波那契数列函数
    n = 0
    a = 0
    b = 0
    c = 1
    while n < number:
        yield (c)    #yield,变成生成器
        a = b
        b = c
        c = a+b
        n+=1
    return 'wrong'     #异常时打印

p = fib(10)
print(p.__next__())  #打印一步
print(p.__next__())
print(p.__next__())
print(p.__next__())
print("===================")
for i in p:   #接着断点继续打印
    print(i)

在这里插入图片描述

  • 通过yield实现单线程情况下并发运行的效果(生产者消费者)
import time

def consumer(name):    #消费者
    while True:
        product = yield
        print("产品%s已被%s使用"%(product,name))
        
def producer():    #生产者
    c = consumer('Lihua')
    c.__next__()
    for i in range(10):
        time.sleep(2)
        print("产品%s已生产"%(i))
        c.send(i)
producer()

在这里插入图片描述

2.迭代器

  • 可迭代对象(Iterable):直接作用于for循环的对象
    例如:我们常用的 list、tuple、dict、set、str等,还有就是带yield的生成器
    (可以用isinstance()判断一个对象是否为Iterable对象)
>>> from collections import Iterable
>>> isinstance([],Iterable)
True
>>> isinstance({
    
    },Iterable)
True
>>> isinstance(1000,Iterable)
False
>>> isinstance("student",Iterable)
True
  • 迭代器(Iterator):可以被next()函数调用并不断返回下一个值得对象称为迭代器
    (可以用isinstance()判断一个对象是否为Iterator对象)
>>> from collections import Iterator
>>> isinstance([],Iterator)
False
>>> isinstance((x for x in range(10)),Iterator)
True
>>> isinstance({
    
    },Iterator)
False
>>>
  • 生成器一定是迭代器,但是迭代器不一定是生成器
  • 将list,dict,str等可迭代对象Iterable转变成迭代器Iterator,使用iter()函数 >>>
isinstance(iter([]),Iterator)
True
>>> isinstance(iter("student"),Iterator)
True

猜你喜欢

转载自blog.csdn.net/sundan614/article/details/107320745