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
    
  • 相关阅读:
    维护keepalived与mysql漂移脚本
    Linux限制普通用户只能使用某命令
    Android的AlertDialog详解
    android:传感器的使用
    android:wifi
    android: 使用Canvas 绘图
    在 Eclipse 中 配置 tomcat
    android:AIDL
    android之Service 深入剖析
    广播发送者与广播接收者
  • 原文地址:https://www.cnblogs.com/zhujiangyu/p/13485240.html
Copyright © 2011-2022 走看看