对字符串、列表、元组、字典等类型的数据结构使用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()
函数让生成器从断点处继续执行,即唤醒生成器property属性是一种用起来像是实例属性一样的特殊属性,可以对应于某个方法;
@proprety
装饰器;并且仅有一个self参数;方法:foo_obj.func() property属性:foo_obj.prop
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
属性,能够简化调用者在获取数据时的流程。