python知识——迭代器和生成器 flash动画教程 • 2022-6-2 • python • 阅读 15 概述前置知识迭代:迭代是重复反馈过程的活动,其目的通常是为了逼近所需目标或结果。每一次对过程(函数)的重复称为一次“迭代”,而每一次迭代得到的结果(函数return)会作为下一次迭代的初始值(传入函数的参数)。例如斐波那契数列:01123581323………F(0)=0,F(1)=1,F(n)=F(n-1 @H_403_3@前置知识迭代:迭代是重复反馈过程的活动,其目的通常是为了逼近所需目标或结果。每一次对过程(函数)的重复称为一次“迭代”,而每一次迭代得到的结果(函数return)会作为下一次迭代的初始值(传入函数的参数)。 例如 斐波那契数列: 0 1 1 2 3 5 8 13 23………@H_419_13@F(0)=0,F(1)=1, F(n)=F(n - 1)+F(n - 2)(n ≥ 2,n ∈ N)迭代器迭代器:是一个类,有__iter__()和__next__()方法的类,迭代器对象:是”迭代器“类的实例化对象备注:@H_419_13@迭代器对象可以使用常规for语句进行遍历字符串、列表或元组对象都可用于创建迭代器。iter():类的内置函数,返回一个迭代器对象next():类的内置函数,返回下一个数据一个类中有__iter__()方法和__next__()方法,则self也是一个迭代器对象实例1 自定义迭代器类@H_419_13@class MyNumbers: # 因为MyNumbers类中含有__iter__()和__next__()函数,所以MyNumbers是一个迭代器 def __iter__(self): # 返回一个迭代器对象 self.a = 1 return self def __next__(self): # 返回下一个数据 if self.a <= 5: x = self.a self.a += 1 return x else: raise stopiteration # 异常用于标识迭代的完成,防止出现无限循环的情况,在 __next__()方法中我们可以设置在完成指定循环次数后触发 stopiteration 异常来结束迭代。 myclass = MyNumbers() # myclass为迭代器对象 for x in myclass: # 迭代器对象可使用for循环 print(x) >>>12345实例2 字符串、列表、元组、字典都可用于创建迭代器。@H_419_13@typestr: ‘abc’List: [1,2,3]int: 1,2,3迭代器: iter([1,2,3])生成器: def g(): yeild 1dict: {‘a’:1, ‘b’:2, ‘c’:3}可迭代的(Iterable)TrueTrueFalseTrueTrue{‘a’:1, ‘b’:2, ‘c’:3}迭代器(Iterator)FalseFalseFalseTrueTrueFlase# 字符串、列表、元组、字典可用于创建迭代器# my = 'this_is_a_string' # string# my = [1, 2, 3, 4, 5] # Listd# my = ('a', 'b', 'c', 'd', 'e') # tuplemy = {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5} # dictionaryit = iter(my) # 创建迭代器对象print(next(it)) # 输出迭代器的下一个元素print(next(it))print(next(it))print(next(it))print(next(it))>>>abcde生成器出现了yIEld的函数(Python 解释器会将其视为一个 generator类)生成器对象:使用“生成器函数”实例化的对象,内部是根据“生成器类generator"创建对象,生成器内部也声明了:iter、__next__方法;生成器满足迭代器的定义,生成器是迭代器的一种实例@H_419_13@#!/usr/bin/python3 import sys def fibonacci(n): # 生成器函数 - 斐波那契 a, b, counter = 0, 1, 0 while True: if (counter > n): return yIEld a a, b = b, a + b counter += 1 f = fibonacci(10) # f 是一个迭代器,由生成器返回生成 while True: try: print (next(f), end=" ") except stopiteration: sys.exit()可迭代对象可迭代类:有__iter__()方法的类;可迭代对象:”可迭代类“创建的对象;可迭代对象可以进行for循环;迭代器对象、生成器对象都是可迭代对象的特例。可迭代器对象和迭代器的判断通过dir()查看对象是否包含以下方法:可迭代对象:包含__iter__()方法迭代器:包含__iter__()和__next__()方法通过Iterable 和Iterator 来判断typestr: ‘abc’List: [1,2,3]int: 1,2,3迭代器: iter([1,2,3])生成器: def g(): yeild 1dict: {‘a’:1, ‘b’:2, ‘c’:3}可迭代的(Iterable)TrueTrueFalseTrueTrue{‘a’:1, ‘b’:2, ‘c’:3}迭代器(Iterator)FalseFalseFalseTrueTrueFlasefrom collections.abc import Iterable from collections.abc import Iterator # my = 'this_is_a_string' # string# my = [1, 2, 3, 4, 5] # Listd# my = ('a', 'b', 'c', 'd', 'e') # tuplemy = {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5} # dictionaryit = iter(my) # 创建迭代器对象def f(): # 生成器函数 yIEld 1print(isinstance(it, Iterable)) # 判断是否可迭代print(isinstance(it, Iterator)) # 判断是否是迭代器print(isinstance(my, Iterable))print(isinstance(my, Iterator)) print(isinstance(f(), Iterable))print(isinstance(f(), Iterator))print("it具体的方法包括:", dir(it))print("my具体的方法包括:", dir(my))print("f()具体的方法包括:", dir(f()))>>>TrueTrueTrueFalseTrueTrueit具体的方法包括: ['__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__length_hint__', '__lt__', '__ne__', '__new__', '__next__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']my具体的方法包括: ['__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'clear', 'copy', 'fromkeys', 'get', 'items', 'keys', 'pop', 'popitem', 'setdefault', 'update', 'values']f()具体的方法包括: ['__class__', '__del__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__lt__', '__name__', '__ne__', '__new__', '__next__', '__qualname__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'close', 'gi_code', 'gi_frame', 'gi_running', 'gi_yIEldfrom', 'send', 'throw']迭代器和生成器的区别迭代器是一个类;生成器是一个函数;生成器是一种特殊的迭代器,内部支持了生成器协议,不需要明确定义__iter__()和__next__()方法;生成器通过生成器函数产生,生成器函数可以通过常规的def语句来定义,但是不用return返回,而是用yIEld一次返回一个结果。 总结 以上是内存溢出为你收集整理的python知识——迭代器和生成器全部内容,希望文章能够帮你解决python知识——迭代器和生成器所遇到的程序开发问题。如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。 欢迎分享,转载请注明来源:内存溢出原文地址: http://outofmemory.cn/langs/1183555.html 生成器 知识 赞 (0) 打赏 微信扫一扫 支付宝扫一扫 flash动画教程 一级用户组 0 0 生成海报 Python|蓝桥杯真题之旋转 上一篇 2022-06-02 使用python *** 作excel 下一篇 2022-06-02 发表评论 请登录后评论... 登录后才能评论 提交 评论列表(0条)
评论列表(0条)