• Python 可迭代对象 / 迭代器 / 生成器


    可迭代对象

    Python 可迭代对象可以分为三类:

    1. 迭代器(iterator): 生成器(generator)

    2. 序列(list, str, tuple, set)

    3. 字典(dict)

    # 可迭代对象
    for i in set(1,2,3,4):
          print(i)
    # 不能用next(i) TypeError: 'set' object is not an iterator
    

    set集合是一个可迭代对象,但不是迭代器

    迭代器

    可迭代对象需要实现__iter__方法,迭代器不仅要实现__iter__方法,还需要实现__next__方法

    迭代器是可迭代对象的一个子集,它是一个可以记住遍历的位置的对象,它与列表、元组、集合、字符串这些可迭代对象的区别就在于__next__方法的实现,其他列表、元组、集合、字符串这些可迭代对象可以通过Python内置的iter函数能很简单的转化成迭代器。

    X = [1,2,3,4,5]
    print(type(X))
    Y = iter(X)
    print(type(Y))
    print(next(Y))
    print(next(Y))
    print(next(Y))
    ​
    # 输出
    <class 'list'>
    <class 'list_iterator'>
    1
    2
    3
    

    自定义迭代器

    class Iterator(object):
        def __init__(self, array):
            self.x = array
            self.index = 0
        
        def __iter__(self):
            return self
        
        def __next__(self):
            if self.index < len(self.x):
                value = self.x[self.index]
                self.index += 1
            else:
                raise StopIteration
            return value
        
    it = Iterator([1,2,3,4,5])
    print(type(it))
    for i in it:
        print(i)
    ​
    # 输出
    <class '__main__.Iterator'>
    1
    2
    3
    4
    5
    

    使用itertools库生成迭代器

    todo

    生成器

    生成器是迭代器的子集

    使用yield关键字构建生成器

    yield 后接单个内容

    def generator(array):
        for i in array:
            yield i
    gen = generator([1,2,3,4,5])
    print(type(gen))
    for j in gen:
        print(j)
    # 输出
    <class 'generator'>
    1
    2
    3
    4
    5
    

    使用yield from关键字构建生成器

    yield from 后接可迭代对象,但也是逐个返回

    def generator(array):
        for sub_array in array:
            yield from sub_array
    ​
    gen = generator([(1,2,3), (4,5,6,7)])
    ​
    # 输出
    1
    2
    3
    4
    5
    6
    7
    
  • 相关阅读:
    php 验证码生成方法 及使用
    idea的jar文件,“java.lang.SecurityException: Invalid signature file digest for Manifest main attribute
    Ubuntu下Java JDK安装
    Ubuntu 忘记密码
    为 ubuntu 切换更新源
    使用Java开发桌面即时通讯程序遇到的问题
    MySQL 1093
    Java中命名Dao、Bean、conn等包的含义(不定期补充)
    通过导入Jar包的方式使用JSONObject
    IM开发通信协议基础知识(一)---TCP、UDP、HTTP、SOCKET
  • 原文地址:https://www.cnblogs.com/linzhenyu/p/13343763.html
Copyright © 2020-2023  润新知