python迭代器和生成器
2021/4/13 22:30:43
本文主要是介绍python迭代器和生成器,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
python迭代器和生成器
迭代器
可迭代对象
对字符串、列表、元组、字典等类型的数据结构使用for...in...
等循环语句可以从中依次提取数据的过程称为遍历,也成为称为迭代。
而通过for..in..
这类的语句迭代读取一条数据供使用的对象就是可迭代对象。
- 判断:
isinstance()
函数可判断一个对象是否为可迭代对象
In [50]: from collections import Iterable In [51]: isinstance([], Iterable) Out[51]: True In [52]: isinstance({}, Iterable) Out[52]: True In [54]: isinstance(mylist, Iterable) Out[54]
- 可迭代对象本质:
可迭代对象的本质就是可以向我们提供一个迭代器,我们在迭代一个可迭代对象时,实际就是先获取该对象提供的一个迭代器,然后通过这个迭代器来依次获取对象的每个数据。
python在类中提供了一个__iter__
方法,一个具备了__iter__
方法的对象就是一个可迭代对象。但是要实现对象的迭代,我们还需要在类中重写__next__
方法,完成迭代器构建。一个实现了__iter__
和__next__
方法的对象,就是迭代器。
from collections import Iterable class MyIterable(): def __init__(self, n): self.n = n self.m = 0 def __iter__(self): return self def __next__(self): if self.m <= self.n: value = self.m self.m += 1 return value else: raise StopIteration #不符合条件停止迭代 s = MyIterable(10) print(isinstance(s, Iterable)) for i in s: print(i) 输出结果: True 0 1 2 3 4 5 6 7 8 9 10
生成器
为了达到记录当前状态,并配合__next__
方法进行迭代,我们采用更加减简便的语法,即生成器。生成器是一类特殊的迭代器。
在使用生成器实现的方式中,我们将原本在迭代器__next__
方法中实现的基本逻辑放到一个函数中来实现,但是将每次迭代返回数值的return换成了yield,此时新定义的函数便不再是函数,而是一个生成器了。简单来说:只要在def中有yield关键字的 就称为 生成器
[https://www.w3cschool.cn/python3/python3-iterator-generator.html]:
总结
- 使用了
yield
关键字的函数就不是一个函数,而是生成器。 yield
关键字有两点作用:- 保存当前运行状态(断点),然后暂停执行,即生成器挂起;
- 将
yield
关键字后面表达式的值作为返回值返回,等同于return
的作用。
- 可以使用
next()
函数让生成器从断点处继续执行,即唤醒生成器 - python3中生成器可以使用return返回最终运行的返回值,而Python2中不允许。
property属性的使用
property属性是一种用起来像是实例属性一样的特殊属性,可以对应于某个方法;
property属性的定义和调用应注意以下几点:
- 定义时,在实例方法的基础上添加
@proprety
装饰器;并且仅有一个self参数; - 调用时,无需括号
方法:foo_obj.func() property属性:foo_obj.prop
property属性的两种方式
- 装饰器
class Goods: """ 只有在python3中才有@xxx.setter @xxx.deleter """ def __init__(self): # 原价 self.original_price = 100 # 折扣 self.discount = 0.8 @property def price(self): new_price = self.original_price * self.discount return new_price @price.setter def price(self, value): self.original_price = value @price.deleter def price(self): del self.original_price obj = Goods() obj.price # 获取商品价格 obj.price = 200 # 修改商品原价 del obj.price # 删除商品原价
- 类属性方式
class Foo(object): def get_bar(self): print("getter...") return 'laowang' def set_bar(self, value): """必须两个参数""" print("setter...") return 'set value' + value def del_bar(self): print("deleter...") return 'laowang' BAR = property(get_bar, set_bar, del_bar, "description...") obj = Foo() obj.BAR # 自动调用第一个参数中定义的方法:get_bar obj.BAR = "alex" # 自动调用第二个参数中定义的方法:set_bar方法,并将“alex”当作参数传入 desc = Foo.BAR.__doc__ # 自动获取第四个参数中设置的值:description... print(desc) del obj.BAR # 自动调用第三个参数中定义的方法:del_bar方法
通过使用property
属性,能够简化调用者在获取数据时的流程。
这篇关于python迭代器和生成器的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-21Python编程基础教程
- 2024-11-20Python编程基础与实践
- 2024-11-20Python编程基础与高级应用
- 2024-11-19Python 基础编程教程
- 2024-11-19Python基础入门教程
- 2024-11-17在FastAPI项目中添加一个生产级别的数据库——本地环境搭建指南
- 2024-11-16`PyMuPDF4LLM`:提取PDF数据的神器
- 2024-11-16四种数据科学Web界面框架快速对比:Rio、Reflex、Streamlit和Plotly Dash
- 2024-11-14获取参数学习:Python编程入门教程
- 2024-11-14Python编程基础入门