ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

python迭代器和生成器

2021-04-13 21:01:10  阅读:129  来源: 互联网

标签:__ 迭代 python self 生成器 price def


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,self,生成器,price,def
来源: https://blog.csdn.net/qq_40127785/article/details/115678652

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有