美文网首页python
py3笔记27:迭代器

py3笔记27:迭代器

作者: _百草_ | 来源:发表于2022-12-18 13:52 被阅读0次

    1、迭代器

    1.1 iter()

    #-*-coding:utf-8-*-
    # 迭代:访问集合元素的一种方式
    # 迭代器:记住遍历位置的对象
    #       从集合第一个元素开始访问,直到所有元素被访问完结束
    # 基本方法:iter() 、next()
    # 字符串,列表或元组对象都可以用于创建迭代器
    
    list1 = [1,2,3,4]
    iter1 = iter(list1) # 列表对象创建迭代器对象
    print(iter1) # <list_iterator object at 0x0000018970D5D1C0>
    
    str1 = "abcd"
    iter2 = iter(str1) # 字符串对象创建迭代对象
    print(iter2)  # <str_iterator object at 0x000001F1149D1FA0>
    
    set1 = (6, 7, 8, 9)
    iter3 = iter(set1)
    print(iter3)  # <tuple_iterator object at 0x00000207C2711F70>
    
    dict1 ={"name":"b", "age":18}
    iter4 = iter(dict1)
    print(iter4)  # <dict_keyiterator object at 0x0000022CDF6188B0>
    

    1.2 迭代器遍历

    print(next(iter1))  # 1  输出迭代器的下一个元素
    # next(iterator, default=None)
    # default未设置,则无可迭代元素时,报错:StopIteration;若已设置,则无可迭代元素是返回default
    iter_default = iter([])
    # print(next(iter_default,default="已无下一元素")) # TypeError: next() takes no keyword arguments
    print(next(iter_default,"已无下一元素"))  # 已无下一元素
    
    # import sys
    # while True:
    #     try:
    #         print(next(iter1))
    #     except StopIteration:
    #         sys.exit()  # 通过引发SystemExit异常来退出Python程序(不捕捉异常)
    
    for i in iter2: # 使用for语句遍历
        print(i, end="~")  # a~b~c~d~
    

    1.3 类作为迭代器使用

    • 把类作为一个迭代器使用,需要类中实现2个构造函数:__iter__()__new__()
    • __iter__():返回一个特殊的迭代器对象,该对象实现__next__()方法并通过StopIteration异常标识迭代的完成。
    • __next__():返回下一个元素 ;py2中是next()
    • Python内置函数 iter()next()实际上调用的就是对象的 __iter__()__next__()
    class NumberIter:
        def __iter__(self):
            # 返回数字的迭代器
            self.a = 1
            return self
        def __next__(self):
            # # 返回下一个元素;当前为无限循环,则需要StopIteration标识
            # x = self.a
            # self.a +=2
            # return x
            if self.a <=20:
                x = self.a
                self.a += 1
                return x
            else:
                raise StopIteration
    
    
    myclass = NumberIter() # 实例化
    iter5 = iter(myclass)  # 创建迭代器
    print(iter5)  # <__main__.NumberIter object at 0x000001E76D3D3DC0>
    print(next(iter5)) # 1
    print(next(iter5)) # 3
    for i in iter5:
        print(i)
    

    1.4 迭代器对象判断

    # 迭代器对象判断
    # from collections import Iterable
    # DeprecationWarning: Using or importing the ABCs from 'collections' instead of from 'collections.abc' is deprecated since Python 3.3, and in 3.10 it will stop working
    from collections.abc import Iterable,Iterator
    print(isinstance(iter5, Iterable))  # True (可迭代对象)
    print(isinstance(list1, Iterator))  # False (迭代器)
    

    2、参考

    1. 菜鸟教程:Python3 迭代器&生成器
    2. Python next()函数
    3. python生成器

    相关文章

      网友评论

        本文标题:py3笔记27:迭代器

        本文链接:https://www.haomeiwen.com/subject/nxlsyrtx.html