一、可迭代对象

  迭代是访问集合元素的一种方式,一个数据类型是否可以迭代,即这个数据类型是否可以被遍历,一个可迭代的数据类型被称为可迭代对象
  在Python中可以使用 isinstance()函数和Iterable模块查看当前变量的数据类型是否是可迭代的对象:

>>>from collections import Iterable
>>>nums = [1, 2, 3, 4]
>>>isinstance(nums, Iterable)
True  # 返回True,说明列表是可迭代的
>>>num = 100
>>>isinstance(num, Iterable)
False  # 返回False,说明整型是不可迭代的

可迭代对象有:字符串、列表、元组、字典、集合

二、迭代器

  可以被__next__()方法调用获取下一个值的对象称为迭代器,减少了内存空间,存储了生成数据的方法,迭代器只能往前不会后退。在Python中可以通过isinstance()函数和Iterator模块判断一个对象是否是迭代器,使用iter()函数可以将一个可迭代对象变成一个迭代器

>>>from collection import Iterator
>>>li = [1, 2, 3, 4]
>>>isinstance(li, Iterable)
True  # 列表li是可迭代对象
>>>isinstance(li, Iterator)
False  # 列表li不是迭代器

>>>li_iter = iter(li)
>>>isinstance(li_iter, Iterator)
True  # 使用iter()函数将列表li变为了迭代器

三、实现一个迭代器

要点:定义一个类,在类中实现__iter__()方法和__next__()方法

class Person(object):
    """定义一个人物类"""

    def __init__(self):
        self.name = []
        self.index = 0 # 初始化索引

    def add(self, name):
        self.name.append(name)

    def __iter__(self):
        """只要类中实现了此方法,创建的对象就是可迭代的"""
        return self  # 返回迭代器对象

    def __next__(self):
        if self.index < len(self.name):  # 解决列表越界的问题
            result = self.name[self.index]
            self.index += 1
            return result
        else:  # 抛出异常,标识迭代的完成
            raise StopIteration

# 创建对象,调用add()方法
p = Person()
p.add('张三')
p.add('李四')
p.add('王五')

# 遍历这个对象
for value in p:
    print(value)

输出结果:

python里schedule的使用 python scene_协程

四、通过range()和xrange()理解迭代器的实现

  迭代器中存储的不是产生的数据结果,而是产生数据的方法

  在Python2中,使用range()函数,会直接生成一个列表,存储列表的元素,如果元素数量非常大的话,只有列表数据生成保存完毕,再能继续执行下面的程序,效率很低,所有Python2提供了 xrange()函数,它返回的是迭代器对象,里边存储了生成列表元素的方法,只有去调用这个迭代器对象时,它才会根据需求,生成指定的数据。

python里schedule的使用 python scene_多任务_02


  Python3中对此做了修改,取消了xrange()函数,并把range()函数的功能修改成了返回迭代器对象

python里schedule的使用 python scene_多任务_03

五、使用迭代器实现斐波那契数列

class Febonacci(object):
    """使用迭代器实现斐波那契数列"""

    def __init__(self, num):
        """初始化"""
        self.num = num  # 生成数据的个数
        self.a = 0
        self.b = 1
        self.index = 0

    def __iter__(self):
        """返回迭代器对象"""
        return self

    def __next__(self):
        """生成数据的方法"""
        if self.index < self.num:
            result = self.a
            self.a, self.b = self.b, self.a + self.b
            self.index += 1
            return result
        else:
            raise StopIteration
# 创建对象
fibo = Febonacci(10)
# 读取数据
for num in fibo:
    print(num, end=' ')

输出结果:

python里schedule的使用 python scene_python里schedule的使用_04

不止for可以接收可迭代对象,list, tuple, map等都可以

lis = list(Febonacci(10))
print(lis)
tup = tuple(Febonacci(10))
print(tup)
m = map(str, Febonacci(10))
print(m)

输出结果:

python里schedule的使用 python scene_Python_05