Python学习笔记之 迭代和生成器

迭代

可迭代对象iterable

1.定义

具有__iter__函数的对象,可以返回迭代器对象

2.语法

--创建:

class 可迭代对象名称:
    def __iter__(self):
        return 迭代器

--使用:

for 变量名 in 可迭代对象:
    ...

3.实例

class SkillIteror:
    def __init__(self,skills):
        self.__skills = skills
        self.__index = -1
    def __next__(self):
        if len(self.__skills) - 1 == self.__index:
            raise StopIteration()
        self.__index += 1
        return self.__skills[self.__index]

class SkillManager:
    def __init__(self):
        self.__skills = list()

    def add_skill(self,skill):
        self.__skills.append(skill)

    def __iter__(self):
        return SkillIteror(self.__skills)

skillmanager = SkillManager()
skillmanager.add_skill('九阳神功')
skillmanager.add_skill('降龙十八掌')
skillmanager.add_skill('太极拳')

iteror = skillmanager.__iter__()
for i in range(3):
    print(iteror.__next__())

for each in skillmanager:
    print(each)

迭代器对象iterator

1.定义

可以被next()函数调用并返回下一个值的对象

2.语法

class 迭代器类名:
    def __init__(self):
        self.聚合对象 = 聚合对象
    def __next__(self):
        if 没有元素:
            raise StopIteration()
        return 聚合对象元素

3.说明

聚合对象通常是容器对象

生成器

生成器 = 可迭代对象 + 迭代器对象

yield 返回值

实例:

class SkillManager:
    def __init__(self):
        self.__skills = list()

    def add_skill(self,skill):
        self.__skills.append(skill)

    def __iter__(self):
        for each in self.__skills:
            yield each

skillmanager = SkillManager()
skillmanager.add_skill('九阳神功')
skillmanager.add_skill('降龙十八掌')
skillmanager.add_skill('太极拳')

for each in skillmanager:
    print(each)

迭代器函数

实例:

def builder():
    yield 1
    yield 2

print(builder()) # 1
print(builder()) # 2

迭代器表达式

实例:

g = (i for i in range(10))
print(g)
print(next(g))
print(next(g))
print('-------------')
for i in g:
    print(i)

运行结果:

<generator object <genexpr> at 0x006776F0>
0
1
-------------
2
3
4
5
6
7
8
9
posted @ 2020-08-11 21:22  小宇宙zjy  阅读(125)  评论(0编辑  收藏  举报