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

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

时间: 2024-10-28 01:48:50

python大法好——装饰器、生成器、迭代器的相关文章

Python概念之装饰器、迭代器、生成器

装饰器.迭代器.生成器均属于函数知识范畴 1.装饰器 理解装饰器,首先要了解闭包函数. 闭包函数:1.定义在函数内部的函数: 2.该函数的函数体代码包含对外部作用域(而不是全局作用域)名字的引用: 3.通常将闭包函数用return返回,然后可以任意调用. eg:以下代码中inner()即闭包函数 def outer(): x=1 def inner(): print(x) return innerf=outer() 装饰器:即是一种闭包函数的应用. 什么是装饰器?:装饰它人的器具,本身可以是任意

python函数、装饰器、迭代器、生成器

5月21日,请假结婚,然后性格惰性来了,不怎么想看视频和笔记,性格中的弱点开始出现,开始做的不错,渐渐开始松懈,直至放弃--- 函数补充进阶 函数对象 函数的嵌套 名称空间与作用域 闭包函数 函数之装饰器 函数之迭代器 函数之生成器 内置函数 一.函数补充进阶 1.函数对象:  函数是第一类对象,即函数可以当作数据传递,它的应用形式也被称为高阶函数,函数的特性如下: a. 可以被引用 1 # def foo(): 2 # print('from foo') 3 # 4 # func = foo

《Python运维开发之路》 装饰器&amp;生成器&amp;迭代器(五)

一.装饰器 装饰器可以使函数执行前和执行后分别执行其他的附加功能,这种在代码运行期间动态增加功能的方式,称之为“装饰器”(Decorator),装饰器的功能非常强大.装饰器一般接受一个函数对象作为参数,以对其进行增强      说白了:就相当于C++中的构造函数,与析构函数 装饰器本身是一个函数,用于装饰其他函数 装饰器是一个闭包函数是嵌套函数,通过外层函数提供嵌套函数的环境 装饰器在权限控制,增加额外功能如日志,发送邮件用的比较多 1,原函数不带参数的装饰器 假设:我定义了一个函数lyshar

Python之装饰器、迭代器和生成器

在学习python的时候,三大“名器”对没有其他语言编程经验的人来说,应该算是一个小难点,本次博客就博主自己对装饰器.迭代器和生成器理解进行解释. 为什么要使用装饰器 什么是装饰器?“装饰”从字面意思来谁就是对特定的建筑物内按照一定的思路和风格进行美化的一种行为,所谓“器”就是工具,对于python来说装饰器就是能够在不修改原始的代码情况下给其添加新的功能,比如一款软件上线之后,我们需要在不修改源代码和不修改被调用的方式的情况下还能为期添加新的功能,在python种就可以用装饰器来实现,同样在写

Python学习之三大名器-装饰器、迭代器、生成器

Python学习之三大名器-装饰器.迭代器.生成器 一.装饰器     装饰,顾名思义就是在原来的基础上进行美化及完善,器这里指函数,所以说装饰器就是装饰函数,也就是在不改变原来函数的代码及调用方式的前提下对原函数进行功能上的完善.其核心原理其实是利用闭包.     格式 @关键字+装饰函数          被装饰函数()      注意:@行必须顶头写而且是在被装饰函数的正上方     按照形式可以分为:无参装饰器和有参装饰器,有参装饰器即给装饰器加上参数     以下示例是一个无参装饰器,

Python(四)装饰器、迭代器&生成器、re正则表达式、字符串格式化

本章内容: 装饰器 迭代器 & 生成器 re 正则表达式 字符串格式化 装饰器 装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志.性能测试.事务处理等.装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量函数中与函数功能本身无关的雷同代码并继续重用.概括的讲,装饰器的作用就是为已经存在的对象添加额外的功能. 先定义一个基本的装饰器: ########## 基本装饰器 ########## def orter(func):    #定义装饰器     de

Python装饰器、迭代器、生成器、re正则表达式、字符串格式

本章内容: 装饰器 迭代器 & 生成器 re 正则表达式 字符串格式化 装饰器 装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志.性能测试.事务处理等.装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量函数中与函数功能本身无关的雷同代码并继续重用.概括的讲,装饰器的作用就是为已经存在的对象添加额外的功能. 先定义一个基本的装饰器: ########## 基本装饰器 ########## def orter(func): #定义装饰器 def inner

Python装饰器、迭代器&amp;生成器、re正则表达式、字符串格式化

Python装饰器.迭代器&生成器.re正则表达式.字符串格式化 本章内容: 装饰器 迭代器 & 生成器 re 正则表达式 字符串格式化 装饰器 装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志.性能测试.事务处理等.装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量函数中与函数功能本身无关的雷同代码并继续重用.概括的讲,装饰器的作用就是为已经存在的对象添加额外的功能. 先定义一个基本的装饰器: ########## 基本装饰器 ########

4)装饰器、迭代器、生成器以及内置函数

 装饰器.迭代器.生成器以及内置函数 装饰器: 原函数前后增加功能,切不改变函数的原本使用方式 import timedef wrapper(f):    def inner():        start = time.time()        f()        end = time.time()        print('执行效率为%s'%(end-start))    return inner @wrapperdef func():    print('this is func')