• 31.迭代器丶生成器


    Python3 迭代器与生成器


    • 迭代是Python最强大的功能之一,是访问集合元素的一种方式。
    • 迭代器是一个可以记住遍历的位置的对象。
    • 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退是不可逆的。
    • 迭代器有两个基本的方法:iter() 和 next()
    • 字符串,列表或元组对象都可用于创建迭代器:
    >>> a = range(0,10)
    >>> a
    range(0, 10)
    >>> it = iter(a)      #创建迭代对象
    >>> next(it)         ## 输出迭代器的下一个元素
    0
    >>> next(it)
    1
    >>> for var in it:    #迭代对象可以被for循环访问
    ...     print(var)
    ...
    2
    3
    4
    5
    6
    7
    8
    9

    1,迭代器对象可以使用常规for语句进行遍历:

    list=[1,2,3,4]
    it = iter(list)    # 创建迭代器对象
    for x in it:
        print (x, end=" ")
    

    运行结果:

    1 2 3 4
    

    2,也可以使用 next() 函数:

    def myfor(seq):
    	obj = iter(seq) #obj 迭代器: 节约内存 抽象的
    	while True:
    		try:
    			var = obj.__next__()
    			print(var)
    		except StopIteration:
    			break
    myfor('abc')

    运行结果:

    a
    b
    c 

    内置迭代器:


    • 无限延伸

    1. cycle:           #圈性延伸

    • from itertools import cycle      # cycly 接收可迭代的对象进化成一个圈
    from itertools import cycle
    from time import sleep
    a = [1,2,3]
    rt = cycle(a)
    for var in rt:
        sleep(0.5)
        print(var)
    

    运行结果:

    无限环形循环123 

      2. count:    #线性延申的

    • from itertools import count          #count(start,step) start起始数字 ,step为步长
    from time import sleep
    from itertools import count
    rt = count(0, 2)
    for var in rt:
    	sleep(0.5)
    	print(var)
    	if var >= 10:
    		break
    
    运行结果:(步长为2无限延长)
    0
    2
    4
    6
    8
    10   
    • 有限

    1. islice            islice(iterable, stop)         islice(iterable, start, stop[, step])
    from itertools import islice
    a = [1,2,3,4,5]
    rt = islice(a, 3)
    for var in rt:
    	print(var)
    

    运行结果:

    1
    2
    3

    创建一个迭代器:


     

    • 把一个类作为一个迭代器使用需要在类中实现两个方法 __iter__() 与 __next__() 。
    • 如果你已经了解的面向对象编程,就知道类都有一个构造函数,Python 的构造函数为 __init__(), 它会在对象初始化的时候执行。
    • __iter__() 方法返回一个特殊的迭代器对象, 这个迭代器对象实现了 __next__() 方法并通过 StopIteration 异常标识迭代的完成。
    • __next__() 方法(Python 2 里是 next())会返回下一个迭代器对象。
    • 创建一个返回数字的迭代器,初始值为 1,逐步递增 1:
    class MyNumber:
        def __init__(self,a):
            self.a = a
        def __iter__(self):
            self.a = a
            return self 
        def __next__(self):
            x = self.a
            self.a += 1
            return x
    myclass = MyNumber(1)
    print(next(myclass))
    print(next(myclass))
    print(next(myclass))
    

    运行结果:

    1
    2
    3
    
    • 创建一个返回数字的迭代器,初始值为 0,逐步递增 2:           ###跟内置迭代器count相似
    from time import sleep
    class MyIter:
    	def __init__(self,start,step=1):
    		self.value = start
    		self.step = step
    		self.next = start
    	def __iter__(self):
    		return self
    	def __next__(self):
    		self.value = self.next
    		self.next = self.value + self.step
    		return self.value
    rt = MyIter(0,2)
    for var in rt:
    	sleep(0.5)
    	print(var)
    	if var >= 10:
    		break  

    运行结果:

    0
    2
    4
    6
    8
    10
    
    • 斐波那契数列         ###前两个数字相加得出第三个数
    #斐波那契数列
    import os
    class FBNQSL:
    	def __init__(self,limit):
    		self.limit = limit
    		self.curr = 0
    		self.next = 1
    		self.value =  [self.curr,self.next]
    	def __next__(self):
    		value = self.curr + self.next
    		if value >= self.limit:
    			raise StopIteration('超出上限') #抛出异常
    		self.curr = self.next
    		self.next = value
    		self.value.append(value)
    		return self.value
    	def __iter__(self):
    		return self
    rt = FBNQSL(100)
    for var in rt:
    	os.system('cls')
    	print(var) 

    运行结果:

    [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]  

    生成器:

    • 在 Python 中,使用了 yield 的函数被称为生成器(generator)。
    • 跟普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器。
    • 在调用生成器运行的过程中,每次遇到 yield 时函数会暂停并保存当前所有的运行信息,返回 yield 的值, 并在下一次执行 next() 方法时从当前位置继续运行。
    • 调用一个生成器函数,返回的是一个迭代器对象。

    以下实例使用 yield 实现斐波那契数列:

    import sys 
    def fibonacci(n): # 生成器函数 - 斐波那契
        a, b, counter = 0, 1, 0
        while True:
            if counter >= n: 
                raise StopIteration('超出上限')
            yield a
            a, b = b, a + b
            counter += 1
    it = fibonacci(10) # it 是一个迭代器,由生成器返回生成
    for var in it:
        print(var,end = ' ')
    

    运行结果:

    0 1 1 2 3 5 8 13 21 34
    

    实例2:

    from time import sleep
    def pass_():
    	phone = 18600000000
    	while True:
    		if phone < 18600000010:
    			phone += 1
    			yield phone #返回而不终止,暂停函数
    		else:
    			return #== 手动抛出了 StopIteration
    #			raise StopIteration('超出定义的上限')
    rt = pass_() #<generator object pass_ at 0x0000020ED3C3FE08>
    for var in rt:
    	sleep(0.5)
    	print(var,end = ' ')  

    运行结果:

    18600000001 18600000002 18600000003 18600000004 18600000005 18600000006 18600000007 18600000008 18600000009 18600000010
    

        

     

  • 相关阅读:
    [VBS]遍历XML文档
    [VBS]带参数删除扩展名不是*.h、*.c、*.cpp的全部文件
    [VBS]脚本中的字典、动态数组、队列和堆栈
    [VBS]检测计算机各硬件信息
    [cmd]如何设置 Windows 默认命令行窗口大小和缓冲区大小
    VB.NET and C# 差异
    host-only局域网络
    高并发、死锁、幂等性问题
    elasticsearch简单实现
    记一次504 Gateway Time-out
  • 原文地址:https://www.cnblogs.com/zhangan/p/10072312.html
Copyright © 2020-2023  润新知