python迭代器、生成器、装饰器之迭代器

迭代是Python最强大的功能之一,是访问集合元素的一种方式。
一般分为可迭代对象,迭代器,可迭代对象不一定是迭代器,但迭代器一定是可迭代对象
1、可以直接作用于for循环的数据类型
  第一类:集合数据类型,如list、tuple、dict、set、str等;
  第二类:generator,包括集合定义generator和带yield的generator(也就是generator function)。
以上这些可以直接作用于for循环的对象统称为可迭代对象:Iterable。
可以使用isinstance()判断一个对象是否是Iterable对象:可迭代代对象一般内置__iter__()方法,或者是可以利用iter()函数转变为Iterator的对象,iter()为内置函数,作用是将可迭代对象转变为迭代器,而__iter__()继承于iter()
def iter(source, sentinel=None): # known special case of iter
    """
    iter(iterable) -> iterator
    iter(callable, sentinel) -> iterator
    
    Get an iterator from an object.  In the first form, the argument must
    supply its own iterator, or be a sequence.
    In the second form, the callable is called until it returns the sentinel.
    """
    pass
    def __iter__(self, *args, **kwargs): # real signature unknown
        """ Implement iter(self). """
        pass
from collections import Iterable
print(isinstance([], Iterable))  # True
print(isinstance({}, Iterable))  # True
print(isinstance((), Iterable))  # True
print(isinstance('abc', Iterable))  # True
print(isinstance(123, Iterable))  # Flase

2、迭代器(Iterator)

可以使用isinstace()判断一个对象是否是Iterator对象:

当一个可迭代对象调用__iter__()或者iter()后得到的就是一个迭代器对象,而迭代器对象可以通过__next__()或者next()方法进行取值,取值特点是,一次取出一个值,不能后退,当值取完时会抛出StopIteration异常

# 可迭代对象执行obj.__iter__()得到的结果就是迭代器对象
# 而迭代器对象指的是即内置有__iter__又内置有__next__方法的对象
# 以使用isinstance()判断一个对象是否是Iterator对象:
print(isinstance((x for x in range(10)), Iterator))  #True
print(isinstance([], Iterator))  # Flase
print(isinstance([].__iter__(), Iterator))  # True
print(isinstance({}, Iterator))  # Flase
print(isinstance(iter({}), Iterator))  # True
print(isinstance((), Iterator))  # Flase
print(isinstance('abc', Iterator))  # Flase

迭代器通过__next__()或者next()取值

l = [1, 2, 3]
l = l.__iter__()
print(l.__next__())
print(next(l))

迭代器的优缺点:

# 优点:
#   - 提供一种统一的、不依赖于索引的迭代方式
#   - 惰性计算,节省内存
# 缺点:
#   - 无法获取长度(只有在next完毕才知道到底有几个值)
#   - 一次性的,只能往后走,不能往前退
原文地址:https://www.cnblogs.com/June-King/p/10596207.html