迭代器,生成器

迭代器       生成器

 

 

一 , 迭代器

迭代器优点

1,节省内存

2,惰性机制

3,单向,不可逆

如果对象中有__iter__函数. 那么我们认为这个对象遵守了可迭代协议.
就可以进行迭代. 这里的__iter__是帮助我们获取到对象的迭代器. 我们使用__next__()来获取
到一个迭代器中的元素.

__iter__() 获取迭代器
__next__() 获取最前面这个元素

s="山上有座庙"
ko=s.__iter__()
print (ko.__next__())
print (ko.__next__())
print (ko.__next__())
print (ko.__next__())
print (ko.__next__())
#结果:山
     #
     #
     #
     #

开始的时候是__iter__()来获取迭代器,后面每次获取元素都是通过__next__()来完成.

 

 判断是什么类型

isinstance
lst = [1, 2, 3]
from collections import Iterable    # 可迭代的
from collections import Iterator
print(isinstance(lst, Iterable))        #判断lst是不是可迭代对象
print(isinstance(lst, Iterator))        #判断lst是不是迭代器

 

 

 

二 , 生成器

生成器
生成器实质上就是迭代器
生成器例子
由于函数中存在了yield. 那么这个函数就是一个生成器函数
yield跟return的作用是一样的,区别在于yield是分段执行函数,return是直接停止执行函数
def fu():
    print (1)
    yield 222
ret=fu()
ko=ret.__next__()
print (ko)
#结果:1
#222

 

 

 

使用__next__()执行到下一个yield. send()也有这个功能.

区别:
__next__()不能赋值
send()可以赋值, 在执行send()之前执行__next__()

send可以给上一个yield的位置传递值, 不能给最后一个yield发送值. 在第一次执行生成器代码的时候不能使用send(),所以第一次执行生成器代码的时候要用__next__

def fu():
    print("到处跑")
    a=yield
    print ("先去"+str(a))
    b=yield
    print ("再去"+str(b))
    c=yield
    print ("然后去"+str(c))
    yield "最后回家"
gen=fu()
gen.__next__()
gen.send("学校")
gen.send("街上")
ret=gen.send("天安门")
print (ret)
#结果:到处跑
    # 先去学校
    # 再去街上
    # 然后去天安门
    # 最后回家
def fu():
    print ("你想去哪")
    a=yield
    print ("想去"+str(a))
    b=yield
    print("还想去"+str(b))
    c=yield
    print (""+str(c))
    yield "北京"         #send不能给最后一个yield传递值,所以这里的yield得给一个值,如果没有值则显示None ,如果没有yield程序会报错
ko=fu()      #获取生成器
ko.__next__()       #send是给上一个yield传递值的,而这里执行的是最先开始的,上面没有yield,所以这里要用__next__
ko.send("广西")      #用send给上一个yield传递值
ko.send("湖南")
ret=ko.send("云南")
print(ret)
# send和next的区别:
# 1. send和next()都是让生成器向下走一次
# 2. send可以给上一个yield的位置传递值, 不能给最后一个yield发送值. 在第一次执行生
#    成器代码的时候不能使用send()

 

#模拟for循环

# 模拟for循环
li=['猫和老鼠','邋遢大王','黑猫警长','变形精钢','秦时明月']
ret=li.__iter__()       #先拿到一个迭代器
while True:         #让迭代器循环
    try:               #try是Python里的关键字
        name=ret.__next__()     #拿出列表里的每一个元素
        print(name)
    except StopIteration:       
        break
'''正常情况下列表里面的元素拿完之后会报这个错 StopIteration 所以我们这里要引入try和except
这样当程序报这个错的时候try就会接着,然后break,这样程序就不会报错'''

 

转载于:https://www.cnblogs.com/hdy19951010/p/9199157.html

### 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、付费专栏及课程。

余额充值