zoukankan      html  css  js  c++  java
  • python2.7 可迭代对象、迭代器和迭代的概念说明

    描述python 中 可迭代对象,迭代器和迭代的概念

    1 概念

    • 可迭代对象:只要定义了__iter__()方法,就说该对象是可迭代对象,并且可迭代对象能提供迭代器.例如: str,list,tuple,dict,set,文件对象
    在自定义可迭代对象需要实现 __iter__ 函数;严格来讲,还需要实现 __getitem__ 函数,这个函数的主要作用是当前对象可通过下标取值
    
    • 迭代器:实现了__next__()或者next()(python2)方法的称为迭代器,迭代器仅仅在迭代到某个元素时才计算该元素,而在这之前或之后,元素可以不存在或者被销毁,因此只占用固定的内存。
    1.既内置有__next__方法的对象,执行该方法可以不依赖索引取值
    2.又内置有__iter__方法的对象,执行迭代器的__iter__方法得到的依然是迭代器本身
    

    迭代器一定是可迭代对象(一是实现了__next__()或next() 方法,二是实现了__iter__() 方法),可迭代对象不一定是迭代器对象,文件对象本身就是一个迭代器对象

    使用内置的 iter() 函数可以根据一个可迭代对象返回一个迭代器对象。

    my_string = "hello"
    my_iter = iter(my_string)
    next(my_iter)
    # Output: 'h'
    

    python处理迭代器越界是抛出StopIteration异常.

    • 迭代:当使用一个循环来遍历某个东西时,这个过程本身就叫迭代。迭代器迭代的元素只能往前不能后退。

    • 生成器:带有 yield 的函数在 Python 中被称之为 generator(生成器)。生成器也是一种迭代器,yield 的作用就是把一个函数变成一个 generator,带有 yield 的函数不再是一个普通函数,Python 解释器会将其视为一个 generator。

    2 示例

    #!/usr/bin/env python 
    # -*- coding: utf-8 -*-
    from collections import Iterable, Iterator
    
    class IterableFunc(object):
        """
        定义可迭代对象   Iterable
        """
        def __init__(self):
            self.capacity = []
    
        def add_capacity(self, cap1):
            """
    
            :param cap1:
            :return:
            """
            if isinstance(cap1, (str, int, float)):
                self.capacity.append(cap1)
            elif isinstance(cap1, list):
                self.capacity.extend(cap1)
            elif isinstance(cap1, dict):
                return
    
        def __getitem__(self, item):
            if self.capacity:
                return self.capacity[item]
    
        def __iter__(self):
            for cap in self.capacity:
                yield cap
    
        def next(self):
            if self.capacity:
                return self.capacity.pop()
    
    
    if __name__ == '__main__':
        func = IterableFunc()
        func.add_capacity([1, 2, 3, 4])
    
        print isinstance(func, Iterable)  # True
        print isinstance(func, Iterator)  # True
    
        for c in func:
            print c
    
    种一棵树最好的时间是十年前,其次是现在!
  • 相关阅读:
    学习 CosmosDB (NoSql)
    <linux-sed> sed基本用法
    grep 正则表达式用引号括起来和元字符加反斜杠转义的测试
    CACTI批量添加linux主机sh脚本
    一个简单的C共享库的创建及Python调用此库的方法
    Linux下的C的开发之GCC的初级使用
    AcitveReocrd事件和关联操作
    Samrty技术的 初步了解
    Ubuntu下配置Tomcat
    在ubuntu中安装jdk
  • 原文地址:https://www.cnblogs.com/gaozhidao/p/12950454.html
Copyright © 2011-2022 走看看