zoukankan      html  css  js  c++  java
  • 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
    
  • 相关阅读:
    sharepoint server 2010 打开网页非常慢
    sharepoint 2010 彻底删除用户
    Exchange2007设置网页OWA访问
    sharepoint 2007 网页内嵌打开pdf
    BAT+VBS、BAT+REG、BAT+HTML 混合编程
    Exchange2007安装后如何添加域账户邮箱
    Outlook2003无法登陆Exchange2007邮箱,提示outlook版本禁止
    Winsock Fix for Windows 7
    Silverlight 3 脱机安装
    WCF问题及解决方案
  • 原文地址:https://www.cnblogs.com/linzhenyu/p/13343763.html
Copyright © 2011-2022 走看看