zoukankan      html  css  js  c++  java
  • 装饰器和迭代器

    1,什么是装饰器

    装饰器遵循开放封闭原则,对修改封闭,对扩展开放

    装饰器器本身是可任意调用的对象,被装饰者也是任意可调用对象.

    装饰器的原则   1, 不修改被装饰对象的源代码,      2,  不修改被装饰对象的调用方式

    被装饰函数的正上方,单独一行

    @deco1

    @deco2

    @deco3

    def foo():

      pass

    foo=deco(deco2(deco3(foo)))

    装饰器wraps

    from functools import wraps

    def deco (func):

      @wraps(func):

      def wraps(*args,**kwargs)

        return  func(*args,**kwargs) 

      return wrapper

    @deco

    def  index():

      '''hahhahahah'''

      print('from index)

    print(index.--doc--)

    2,  迭代

    迭代器即迭代的工具,什么是迭代?

    迭代是一个重复的过程,每一次重复即一次迭代,并且每次迭代的结果都是下一次迭代的初始值,只是单纯的重复并不是迭代

    l=[1,2,3]

    count=0

    while count<len(l)

      print(l[count])

      count+=1

    (1)

    为何要有迭代器

    对于序列类型:字符串,元组,列表,我们可以使用索引的方式迭代取出其包含的元素.但对以字典,集合,文件类型是没有索引的,

    若还想取出其内部包含的元素,则必须找到一种不依赖于索引的迭代方式,这就是迭代器

    什么是可迭代对象

    可迭代对象指的是内置有__iter__方法的对象,即obj.__iter__,如下

    'hello' .__iter__

    (1,2,3).__iter__

    [1,2,3].__iter__

    {'a':1}.__iter__

    {'a','b'}.__iter__

    open('a.txt').iter__

    3,什么是迭代器对象?

    可迭代对象执行obj.__iter__()得到的结果就是迭代器对象

    而迭代器对象指的是即内置有__iter__又内置有__next__方法的对象

    文件类型是迭代器对象

    open('a.txt').__iter__()

    open('a.txt).__iter__()

    -----------注意,迭代器对象一定是可迭代对象,而可迭代对象不一定是迭代器对象

    dic={'a':1,'b:2,'c':3}

    iter__dic=idc.__iter__()   #得到迭代器对象,迭代器对象即有__iter__又有__next__,但是:迭代器.__iter__()得

    到的仍然是迭代器本身

    iter__dic.__iter__()  is  iter__dic

    print(iter__dic.__next__())#等同于next(iter__dic)

    print(iter__dic.__next__())#等同于next(iter__dic)

    print(iter__dic.__next__())#等同于next(iter__dic)

    #print(iter__dic.__next__())   #抛出异常stopiteration,或者说结束标志

    #有了迭代器,我们就可以不依赖索引迭代取值了

    iter__dic=dic.__iter__()

    while  1:

      try :

        k=next(iter__dic)
        print(dic[k])

      except stopiteration

        break

    4,for 循环

    基于for 循环,我们可以完全不去依赖索引去 取值

    dic={'a':1,'b':2,'c':3}

    for k in dic:

      print(dic[k])

    for 的工作原理

    1,执行in 后对象的dic.__iter__()方法,得到一个迭代器对象iter_dic

    2,执行next(iter__dic),将得到的值赋值给k,然后执行循环体代码

    3,重复过程2,直到捕捉到异常stop iteration,结束循环

    迭代器的优缺点:

    优点:

    提供一种统一的,不依赖索引的迭代方式

    惰性计算,节省空间

    缺点:

    无法获取长度(只有在next完毕才知道到底有几个值)

    一次性的,只能往后走,不能往前退


        

  • 相关阅读:
    codevs 1115 开心的金明
    POJ 1125 Stockbroker Grapevine
    POJ 2421 constructing roads
    codevs 1390 回文平方数 USACO
    codevs 1131 统计单词数 2011年NOIP全国联赛普及组
    codevs 1313 质因数分解
    洛谷 绕钉子的长绳子
    洛谷 P1276 校门外的树(增强版)
    codevs 2627 村村通
    codevs 1191 数轴染色
  • 原文地址:https://www.cnblogs.com/lijieshi/p/9173576.html
Copyright © 2011-2022 走看看