09-03可迭代对象与迭代器

可迭代对象与迭代器

可迭代对象

1、什么是可迭代对象

  • 有__iter__方法的叫可迭代对象
  • 可以在for .. in ..语句出现的对象
例:有__iter__方法的叫可迭代对象
    In [10]: r = range(5)

    In [11]: r.__iter__   # 有__iter__方法的都叫可迭代对象

例:可以在for .. in ..语句出现的语句

    In [11]: for x in range(5):   # 可以在for...in...语句出现
        ...:     pass
        ...: 

    因为for in语句要求一个可迭代对象

2、我们前面学过的可迭代对象

我们学过的7种数据结构和range, dict_keys, dict_values, dict_itemas都是可迭代对象。
7种常用数据结构都是可迭代对象:列表、元组、字符串、bytes、bytearray、字典、集合

迭代器

1、什么是迭代器

总结:有__next__方法的可迭代对象叫迭代器。

Python3 迭代器与生成器

  • 迭代是Python最强大的功能之一,是访问集合元素的一种方式。
  • 迭代器是一个可以记住遍历的位置的对象。
  • 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。
  • 迭代器有两个基本的方法:iter() 和 next()。
  • 字符串,列表或元组对象都可用于创建迭代器:
例:
    In [12]: it = iter(range(5))

    In [13]: it.__next__()   # 迭代器都有next方法
    Out[13]: 0

总结:有__next__方法的可迭代对象叫迭代器。

2、可迭代对象与迭代器关系

  • 可迭代对象可以转换为迭代器。(可迭代对象不是迭代器,但可以转换)
    • iter函数可以把一个可迭代对象转换为迭代器。
  • next函数可以从迭代器里取出下一个元素。

迭代器原理:

迭代器会保存一个指针, 指向可迭代对象的当前元素。
调用next函数的时候, 会返回当前元素, 并且把指针指向下一个元素。
当没有下一个元素时, 会抛出stopiteration异常。

例:可迭代对象不是迭代器
In [5]: next(range(5))
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-5-77906a45c21a> in <module>()
----> 1 next(range(5))

TypeError: 'range' object is not an iterator

In [14]: next(iter(range(5)))   # 需要使用iter方法转换为迭代器才能使用next方法
Out[14]: 0

迭代器会保存一个指针, 指向可迭代对象的当前元素。
调用next函数的时候, 会返回当前元素, 并且把指针指向下一个元素。
当没有下一个元素时, 会抛出stopiteration异常。

3、迭代器的用法

  • 需要用next方法把值取出来使用
方法1:
In [16]: lst = [['m', 1, 2, 3, 4], ['age', 0, 1, 2, 3]]

In [17]: for x in lst:
    ...:     key = x[0]
    ...:     for v in x[1:]:
    ...:         print()
    ...:

方法2:
In [18]: for x in lst:
    ...:     it = iter(x)
    ...:     key = next(it)
    ...:     for v in it:
    ...:         print()
    ...:

4、for循环的底层实现

  • for in 循环对于可迭代对象:首先调用iter方法转换为迭代器, 然后不断的调用next方法, 直到抛出Stopiteration异常。
In [19]: it = iter(itratable)
    ...: while True:
    ...:     try:
    ...:         next(it)
    ...:     except StopIteration:
    ...:         return

每周总结

内置数据结构:
    七种内置数据结构:
        列表
        元组
        类字符串:操作几乎相同
            字符串
            bytes
            bytearray
        集合
        字典

        线性结构:特点就是切片操作
            列表
            元组
            类字符串:操作几乎相同
                字符串
                bytes
                bytearray
        解构与封装

    成员运算:
        set:O(1)
        dict:
            O(1) with key
            O(n) with value
        其他:
            O(n)

    解析式:
        列表
        生成器解析
        集合解析
        字典解析

    可迭代对象与迭代器:
        可迭代对象:
            具有__iter__方法
        迭代器:
            需是可迭代对象
            具有__next__方法

        可迭代对象可以使用iter转换为迭代器。
        迭代器可以使用next方法一个一个调用出来。
posted @ 2020-06-04 07:01  此时  阅读(120)  评论(0编辑  收藏  举报