Python3 生成器与迭代器 -实操 随记

"""
可以直接作用于for循环的对象统称为可迭代对象(Iterable)。
可以被next()函数调用并不断返回下一个值的对象称为迭代器(Iterator)。
所有的Iterable均可以通过内置函数iter()来转变为Iterator。
__iter__() 方法返回一个特殊的迭代器对象, 这个迭代器对象实现了 __next__() 方法并通过 StopIteration 异常标识迭代的完成
__next__() 方法(Python2里是next())会返回下一个迭代器对象。
"""
# 返回数字的迭代器
class MyClassIter:
    def __iter__(self):    # 返回一个迭代器对象,并初始值为1
        self.num = 1
        return self

    def __next__(self):         # 迭代器next返回数字,并+1
        if self.num <= 5:
            n = self.num
            self.num += 1
            return n
        else:         # 手动抛出迭代器迭代完成的异常,StopIteration表示迭代结束异常
            raise StopIteration

myclass = MyClassIter()
myIter= iter(myclass)

for x in myIter:
    print(x)

# 在调用next()方法时,需要注意的是迭代器是否结束,如果结束就会抛出异常StopIteration
try:
    print("next : ",next(myIter))
except StopIteration:
    print("The iter is end ! ")

# 迭代器貌似没有重置的说法,如果常用的话,可以转为列表
myList =list(myIter)
print(type(myIter))
print(type(myList)," : ",myList)



print("---------------------字典迭代器 1 ---------------------")
dict1={"firstName":"zhang","lastNmae":"san"}
# 迭代器iterators (iter)
# iter1=iter(dict1) 迭代器对象为字典的key
iter1=iter(dict1.values())
# 迭代器指定后不能在修改对象长度,"RuntimeError: dictionary changed size during iteration"
# dict1.__setitem__("age",'28')
while True:
    try:
        print(next(iter1))
    except StopIteration:
        break
print(dict1)


print("---------------------字典迭代器 2 ---------------------")
listDict1=[{"firstName":"zhang","lastNmae":"san"},{"firstName":"li","lastNmae":"si"},{"firstName":"wang","lastNmae":"wu"}]
for x in listDict1:
    x.__setitem__("age","28")
print(listDict1)

iterDict1=iter(listDict1)
for indx in iterDict1:
    xinxi=list(indx.values())   # indx.values()获取字典的values;indx的话则为key
    print(xinxi)


print("---------------------生成器---------------------")
"""
调用一个生成器函数,返回的是一个迭代器对象。
使用了 yield 的函数被称为生成器(generator)
跟普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器。
在生成器运行中,每次yield时函数会暂停并保存当前所有的运行信息,返回yield 的值,并在下一次执行next()方法时从当前位置继续运行。
"""
def generator(max):
    a=0
    while a<max:
        a += 1
        yield a       # 生成器标识符号 yield
iterGen1=generator(4)    # 生成器返回一个迭代器对象
for x in iterGen1:
    print(x)

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值