Python教程

python迭代器和生成器

本文主要是介绍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迭代器和生成器的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!