码迷,mamicode.com
首页 > 编程语言 > 详细

python2.7 可迭代对象、迭代器和迭代的概念说明

时间:2020-05-24 13:39:04      阅读:55      评论:0      收藏:0      [点我收藏+]

标签:item   方法   collect   tor   gen   pac   yield   stop   取值   

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

1 概念

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

迭代器一定是可迭代对象,可迭代对象不一定是迭代器对象,文件对象本身就是一个迭代器对象

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

python2.7 可迭代对象、迭代器和迭代的概念说明

标签:item   方法   collect   tor   gen   pac   yield   stop   取值   

原文地址:https://www.cnblogs.com/gaozhidao/p/12950454.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!