码迷,mamicode.com
首页 > 编程语言 > 详细

python大法好——装饰器、生成器、迭代器

时间:2018-07-29 20:01:59      阅读:154      评论:0      收藏:0      [点我收藏+]

标签:操作   返回   pytho   停止   turn   序列   实参   for   不能   

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

python大法好——装饰器、生成器、迭代器

标签:操作   返回   pytho   停止   turn   序列   实参   for   不能   

原文地址:https://www.cnblogs.com/lchh/p/9386644.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!