zoukankan      html  css  js  c++  java
  • 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
    
  • 相关阅读:
    中国MOOC_零基础学Java语言_第1周 计算_第1周编程题_1温度转换
    郝斌_GUI
    郝斌_生产消费
    WCF技术剖析(卷1)WCF全面解析文摘
    构建搞性能可扩展asp.net网站文摘
    net 程序员面试宝典
    【工具推荐】ELMAH——可插拔错误日志工具(转)
    各大主流.Net的IOC框架性能测试比较(转)
    2013年总结
    GCT英语口语复试中的常见问题总汇
  • 原文地址:https://www.cnblogs.com/zhujiangyu/p/13485240.html
Copyright © 2011-2022 走看看