迭代器,生成器

本文通过具体的生产者消费者模型实例,详细介绍了Python中生成器的两种实现方式及其工作原理,包括如何使用yield关键字创建生成器,以及如何在生成器中处理异常。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

迭代器

生成器(生成器的第1种实现方式: 列表生成式改为生成器;)

python中yield关键字
函数中如果有yield, 那么调用这个函数的返回值为生成器。
当生成器g调用next方法, 执行函数, 知道遇到yield就停止;
再执行next,从上一次停止的地方继续执行;
函数中遇return直接退出, 不继续执行后面代码;

生成器的第二种方式

生成器: 无缓冲区的生产者消费模型

import time
import  random
def consumer(name):
    print "%s 准备买粉条...." %(name)
    while True:
        kind = yield
        print "客户[%s] 购买了 [%s] 口味的粉条. " %(name, kind)
def producer(name):
    c1 = consumer("user1")
    c2 = consumer("user2")
    c1.next()
    c2.next()
    print "[%s]准备制作米线......" %(name)
    for kind in ['特辣', '三鲜', '香辣']:
        time.sleep(random.random())
        print "[%s]制作了[%s]口味的粉条,卖给用户...." %(name, kind)
        c1.send(kind)
        c2.send(kind)
    c1.close()
    c2.close()
producer("厨师user")

生成器:有缓冲区的生产者消费模型



import time
import  random
cache = []
def consumer(name):
    print "%s 准备买粉条...." %(name)
    while True:
        kind = yield
        # cache.pop(0)
        cache.remove(kind)
        print "客户[%s] 购买了 [%s] 口味的粉条. " %(name, kind)
def producer(name):
    print "[%s]准备制作粉条......" %(name)
    for kind in ['特辣', '三鲜', '香辣']:
        time.sleep(random.random())
        print "[%s]制作了[%s]口味的粉条,卖给用户...." %(name, kind)
        cache.append(kind)
producer("厨师user")
c1 = consumer('user1')
c1.next()
c1.send('三鲜')
print  "本店现有的粉条口味: ",
for i in cache:
    print i,

throw 方法:给生成器发送一个异常

迷你聊天机器人


def chat_robot():
    res = ''
    while True:
        receive = yield  res
        if 'hi' in receive or '你好' in receive:
            res = "你好"
        elif 'name' in receive or '姓名' in receive:
            res = "不告诉你."
        elif 'age' in receive or '年龄' in receive:
            res = "就不告诉你."
        else:
            res = "我现在想要睡觉了."
Chat = chat_robot()
next(Chat)
while True:
    send_data = raw_input("请说出想要对人家说的话: ")
    if send_data == 'q' or send_data == 'quit':
        print "我要上天去了."
        break
    response = Chat.send(send_data)
    print "Robot>>: %s" %(response)
Chat.close()

### Python 迭代器生成器和装饰器的概念及用法 #### 1. 迭代器(Iterator) 迭代器是一种可以记住遍历位置的对象,它实现了两个方法:`__iter__()` 和 `__next__()`。`__iter__()` 方法返回迭代器对象自身,而 `__next__()` 方法返回容器的下一个元素。如果已经没有更多元素,则抛出 `StopIteration` 异常[^1]。 以下是通过实现 `__iter__()` 和 `__next__()` 方法手动创建迭代器的示例: ```python class MyIterator: def __init__(self, data): self.data = data self.index = 0 def __iter__(self): return self def __next__(self): if self.index < len(self.data): value = self.data[self.index] self.index += 1 return value else: raise StopIteration # 使用自定义迭代器 my_iter = MyIterator([1, 2, 3]) for item in my_iter: print(item) ``` 此外,还可以通过 `iter()` 函数将一个可迭代对象转换为迭代器[^3]。 #### 2. 生成器(Generator) 生成器是一种特殊的迭代器,它通过函数和 `yield` 表达式来实现。当函数中包含 `yield` 关键字时,该函数不再是一个普通函数,而是一个生成器生成器会在每次调用 `next()` 方法时暂停并保存当前状态,直到下一次调用 `next()` 时继续执行。 以下是一个简单的生成器示例: ```python def countdown(n): while n > 0: yield n n -= 1 # 创建生成器对象 generator = countdown(5) for value in generator: print(value) ``` 从 Python 3.3 开始,引入了 `yield from` 语法,用于将一个可迭代对象委托给生成器。这可以简化生成器的实现,使其更加清晰和易读[^2]。 ```python def countdown(n): while n > 0: yield n n -= 1 def my_gen(n): yield from countdown(n) yield n + 1 # 创建生成器对象 generator = my_gen(5) print(list(generator)) # [5, 4, 3, 2, 1, 6] ``` #### 3. 装饰器(Decorator) 装饰器是一种用于修改函数或方法行为的高级 Python 技术。它本质上是一个函数,接受一个函数作为参数,并返回一个新的函数。装饰器通常用于日志记录、访问控制、性能测试等场景[^3]。 以下是一个简单的装饰器示例: ```python def my_decorator(func): def wrapper(*args, **kwargs): print("Before function call") result = func(*args, **kwargs) print("After function call") return result return wrapper @my_decorator def say_hello(name): print(f"Hello, {name}!") say_hello("Alice") # 输出:Before function call\nHello, Alice!\nAfter function call ``` 装饰器可以通过堆叠多个装饰器来增强功能。例如: ```python def decorator_one(func): def wrapper(*args, **kwargs): print("Decorator One Before") result = func(*args, **kwargs) print("Decorator One After") return result return wrapper def decorator_two(func): def wrapper(*args, **kwargs): print("Decorator Two Before") result = func(*args, **kwargs) print("Decorator Two After") return result return wrapper @decorator_one @decorator_two def greet(): print("Greeting") greet() ``` #### 总结 - **迭代器** 是一种可以记住遍历位置的对象,需要实现 `__iter__()` 和 `__next__()` 方法。 - **生成器** 是一种特殊的迭代器,使用 `yield` 表达式实现,支持 `yield from` 语法以简化代码[^2]。 - **装饰器** 是一种用于修改函数或方法行为的技术,通过包装函数实现功能扩展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值