描述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