• 18-Python3 迭代器与生成器


    2018-11-22 16:14:01

    print('迭代器********************************************************************************************')
    '''
    迭代器
    
    迭代是Python最强大的功能之一,是访问集合元素的一种方式。
    
    迭代器是一个可以记住遍历的位置的对象。
    
    迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。
    
    迭代器有两个基本的方法:iter() 和 next()。
    
    字符串,列表或元组对象都可用于创建迭代器:
    '''
    print('字符串创建迭代器*****')
    str = 'Runoob'
    it = iter(str)
    '遍历方法1:使用next()函数遍历'
    print(next(it))
    print(next(it))
    print(next(it))
    print(next(it))
    print(next(it))
    print(next(it))
    #print(next(it)) #超过边界会出错
    '遍历方法2:使用常规for循环遍历'
    for i in it:
        print(i,end=' ')
    '遍历方法3:使用next()函数循环遍历'
    import sys
    while True:
        try:
            print(next(it))
        except StopIteration:
            sys.exit()
    
    print('列表创建迭代器***')
    lis = ['Google','Baidu','Runoob','Taobao']
    it = iter(lis)
    '遍历方法1:使用next()函数遍历'
    print(next(it))
    print(next(it))
    print(next(it))
    print(next(it))
    '遍历方法2:使用常规for循环遍历'
    for i in it:
        print(i,end=' ')
    '遍历方法3:使用next()函数循环遍历'
    import sys
    while True:
        try:
            print(next(it))
        except StopIteration:
            sys.exit()
    
    print('元组创建迭代器***')
    lis = ('Google2','Baidu2','Runoob2','Taobao2')
    it = iter(lis)
    '遍历方法1:使用next()函数遍历'
    print(next(it))
    print(next(it))
    print(next(it))
    print(next(it))
    '遍历方法2:使用常规for循环遍历'
    for i in it:
        print(i,end=' ')
    '遍历方法3:使用next()函数循环遍历'
    import sys
    while True:
        try:
            print(next(it))
        except StopIteration:
            sys.exit()
    
    print('创建一个迭代器*************************************************************************************')
    '''
    创建一个迭代器
    
    把一个类作为一个迭代器使用需要在类中实现两个方法 __iter__() 与 __next__() 。
    
    如果你已经了解的面向对象编程,就知道类都有一个构造函数,Python 的构造函数为 __init__(), 它会在对象初始化的时候执行。更多内容查阅:Python3 面向对象
    
    __iter__() 方法返回一个特殊的迭代器对象, 这个迭代器对象实现了 __next__() 方法并通过 StopIteration 异常标识迭代的完成。
    
    __next__() 方法(Python 2 里是 next())会返回下一个迭代器对象。
    
    创建一个返回数字的迭代器,初始值为 1,逐步递增 1:
    '''
    class MyNumbers():
        def __iter__(self):
            self.a = 1
            return self
        def __next__(self):
            x = self.a
            self.a += 1
            return x
    
    myClass = MyNumbers()
    myiter = iter(myClass)
    
    print(next(myiter))
    print(next(myiter))
    print(next(myiter))
    print(next(myiter))
    print(next(myiter))
    
    print('StopIteration******************************************************************************************')
    '''
    StopIteration
    StopIteration 异常用于标识迭代的完成,防止出现无限循环的情况,在 __next__() 方法中我们可以设置在完成指定循环次数后触发 StopIteration 异常来结束迭代。
    在 20 次迭代后停止执行:
    '''
    class MyNumbers:
        def __iter__(self):
            self.a = 1
            return self
        def __next__(self):
            if self.a <=20:
                x = self.a
                self.a += 1
                return x
            else:
                raise StopIteration
    
    myclass = MyNumbers()
    myiter = iter(myclass)
    
    for x in myiter:
        print(x)
    
    print(
        '生成器***********************************************************************************************************************')
    '''
    生成器
    
    在 Python 中,使用了 yield 的函数被称为生成器(generator)。
    
    跟普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器。
    
    在调用生成器运行的过程中,每次遇到 yield 时函数会暂停并保存当前所有的运行信息,返回 yield 的值, 并在下一次执行 next() 方法时从当前位置继续运行。
    
    调用一个生成器函数,返回的是一个迭代器对象。
    
    以下实例使用 yield 实现斐波那契数列:
    '''
    a, b = 0, 1
    while b < 10:
        print(b)
        a, b = b, a + b
    
    pass
  • 相关阅读:
    leetcode 279. Perfect Squares
    leetcode 546. Remove Boxes
    leetcode 312. Burst Balloons
    leetcode 160. Intersection of Two Linked Lists
    leetcode 55. Jump Game
    剑指offer 滑动窗口的最大值
    剑指offer 剪绳子
    剑指offer 字符流中第一个不重复的字符
    leetcode 673. Number of Longest Increasing Subsequence
    leetcode 75. Sort Colors (荷兰三色旗问题)
  • 原文地址:https://www.cnblogs.com/jpr-ok/p/9987904.html
Copyright © 2020-2023  润新知