zoukankan      html  css  js  c++  java
  • python大法好——装饰器、生成器、迭代器

    1.装饰器

      1. 不能修改被装饰的函数的源代码
      2. 不能修改被装饰的函数的调用方式

      实现装饰器知识储备:
        1 函数即“变量”
        2 高阶函数
             a:把一个函数名当做实参传给另外一个函数(不修改被装饰函数源代码)
             b:返回值中包含函数名(不修改函数的调用方式)
        3嵌套函数

    装饰器 想了很久过两天代码实现

    列表生成式:

    a=[i if i<5 else i*i for i in a]

    2.生成器

    为什么会有这个功能?

    答:我们可以使用列表储存数据,可当我们的数据特别大的时候,建立了列表是很占内存,生成器他可以先创建数据,但不用,你需要时用,要几个拿几个。

    A简单的生成器

    a=( x for x in range(10))
    next(a)
    #写一次next输出一个数

    next(a)会一直表示出a中数据直到没有,且不可以回退。

    B.用函数写的生成器

    yield

    b把函数的执行过程冻结在这一步,并且把b的值,返回给外面的next()

    next()唤醒冻结的函数

    代码如下:

    def fib(max) :
        n,a,b=0,0,1
        while n<max:
            print("nice")
            yield b     
            a,b=b,a+b
            n+=1
         return 'done'
    f=fib(15)
    next(f)

    代码执行到yield b 这里停了,外面调用一次next(f),继续走。再次调用 会继续走,直到遇到下一个yield 通过next()唤醒。

    运行到完程序会报错,这是正常的。

    函数有了YIELD之后

    1.函数名加()就得到了一个生成器

    2.return在生成器里,代表生成器的中止,直接报错

    2.生成器send方法

    A.唤醒并继续执行

    B.发送一个信息到生成器内部

    代码如下:

    def range2(n) :
        count=0
        while count<n:
            print(count)
            count+=1
            sign=yield count
            if sign='stop' :
                print(sign)
        return 1111
    new_range=range2(3)
    new_range.send("stop")

    程序走到yield 返回消息到外面可next 可接受 send的消息 作出继续或停止的操作。

    3.迭代器(可循环的)

    可以使用isinstance()判断一个对象是否是iterable对象

    iterable可迭代类型

    isinstance(1.iterable)     
    isinstance('abc',iterable)
       
    #结果是:false true

    迭代器:可以被next()函数调用并不断返回下一个值得对象成为迭代器 iterator

    所有生成器也是迭代器

    为什么:list,str dict是可迭代对象,但却不是迭代器?

    python中,iterator对象表示的是一个数据流,iterator对象可以被next()函数调用并不断返回下一个数据,直到没有数据时STOPITERATION错误,可以把这个数据流,看作是一个有序序列,但是我们却不可以提前知道序列的长度,只能不断通过next()函数实现 按需计算下一个数据,所以iterator的计算式惰性的,只有在需要返回 下一个数据时,他才会计算,而dict,list这些都是有大小,长度的所以不是iterator1

  • 相关阅读:
    Oracle TRCA 工具 说明
    Oracle TTS ORA39322: Cannot use transportable tablespace with different timezone version 说明
    Oracle 传输表空间(Transportable Tablespaces) 示例(二) 跨操作系统迁移表空间(endianness格式不同)
    易于在各手机平台移植的设计(转)
    Symbian 学习资源
    项目经理修炼手册
    ZIP 算法详解 (转!)
    google Android OS 学习资源、资料和笔记汇总(要看的)
    小白兔的求职遭遇
    数据结构和算法学习笔记(1)
  • 原文地址:https://www.cnblogs.com/lchh/p/9386644.html
Copyright © 2011-2022 走看看