函数进阶——闭包,装饰器,生成器,迭代器

  • 闭包

    • 函数定义和函数表达式位于另一个函数的函数体内(嵌套函数)。而且,这些内部函数可以访问他们所在的外部函数中声明的所有局部变量、参数。当其中一个这样的内部函数在包含他们的外部函数之外被调用时,就会形成闭包。
  • 装饰器
    • 在不修改原函数的情况下,给原函数增加新的功能,使得程序变得可扩展
    • http://www.cnblogs.com/alex3714/articles/5765046.html(转)
  • 列表生成式
    • 1 a = [i+1 for i in range(10)]
      2 print(a)#[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

  • 生成器(generator)
    • 按照一定的算法,在循环的过程中不断推算出后续的元素,可以避免创建完整的list,从而节省大量的空间
    • 创建方式
    • (1)方式一:把列表生成式中的[]换成()通过next()函数获得generator的下一个返回值,直到计算到最后一个元素,没有更多的元素时,抛出StopInteration的错误
    • 1 a = (i+1 for i in range(10))
      2 print(a)#<generator object <genexpr> at 0x0000000001E0B8E0>
      3 print(next(a))#1
      4 print(next(a))#2
      5 print(next(a))#3

    • (2)generator 是可迭代对象,可用for循环遍历,且不用担心会报错,因此next()基本不用
    • 1 a = (i+1 for i in range(10))
      2 print(a)#<generator object <genexpr> at 0x0000000001E0B8E0>
      3 for i in a:
      4     print(i)

    • (3)方式二:函数,在函数中添加yield,函数就变成了generator
    •  1 #斐波拉契数列
       2 def fib(max):
       3     n,a,b = 0,0,1
       4     while n < max :
       5         yield(b)#把函数的执行过程冻结在这一步,并且把b的值,返回给外面的next()
       6         a,b = b,a+b
       7         n += 1
       8     return "DONE"
       9 a = fib(5)
      10 print(fib(5))#<generator object fib at 0x0000000001DEB8E0>

    • (4)yield  VS return
      • return返回并中止函数,return在生成器里,代表生成器的中止,直接报错
      • yield返回数据,并冻结当前的执行过程
      • next唤醒冻结的函数执行过程,继续执行,直到遇到了下一个yield
    • (5)在python2中,range = list,xrange = 生成器,在python3中,range = 生成器,xrange:没有
  • 迭代器
    • 可迭代对象Iterable:可以直接作用域for循环的对象统称为可迭代对象

      • list,tuple,dict,set,str
      • generator,包括生成器和yield的generator function
      • 可以使用isinstance()来判断一个对象是否是Interable对象
      • 1 from collections import Iterable
        2 print(isinstance([],Iterable))#True
        3 print(isinstance({},Iterable))#True
        4 print(isinstance("abc",Iterable))#True
        5 print(isinstance((x for x in range(10)),Iterable))#True
        6 print(isinstance(100,Iterable))#False

    • 迭代器Iterator:可以被next()函数调用并不断返回下一个值的对象称为迭代器
      • 生成器都是Iterator对象,但list、dict、str虽然是Iterable,却不是Iterator
      • 可以使用isinstance()判断一个对象是否是Iterator对象:
      • 1 from collections import Iterator
        2 print(isinstance([],Iterator))#False
        3 print(isinstance({},Iterator))#False
        4 print(isinstance("abc",Iterator))#False
        5 print(isinstance((x for x in range(10)),Iterator))#True
        6 print(isinstance(100,Iterator))#False

        解释:python的Iterator对象表示的是一个数据流,Iterator对象可以被next()函数调用并不断返回下一个数据,直到没有数据时抛出StopIeteration错误。可以把这个数据流看做是一个有序序列,但我们却不能提前直到序列的长度,只能不断通过next()函数实现按需计算下一个数据,所以Iterator的计算是惰性的,只有在需要返回下一个数据时它才会计算。Iterator甚至可以表示一个无限大的数据流,例如全体自然数。而使用list是永远不可能存储全体自然数的

      • Iter()函数:把list,dict,str等Iterable变成Iterator
      • 1 from collections import Iterator
        2 print(isinstance(iter([]),Iterator))#True
        3 print(isinstance(iter("abc"),Iterator))#True

      • 小结
        • 凡是可作用于for循环的对象都是Iterable类型;
        • 凡是可作用于next()函数的对象都是Iterator类型,它们表示一个惰性计算的序列
        • 集合数据类型如list、dict、str等是Iterable但不是Iterator,不过可以通过iter()函数获得一个Iterator对象
        • python的for循环本质上就是通过不断调用next()函数实现的。
时间: 2024-11-07 09:09:06

函数进阶——闭包,装饰器,生成器,迭代器的相关文章

【Python基础】高阶函数+函数嵌套+闭包 ==装饰器

高阶函数+函数嵌套+闭包 == 装饰器 一 什么是装饰器 二 装饰器需要遵循的原则 三 实现装饰器知识储备 四 高阶函数 五 函数嵌套 六 闭包 七 无参装饰器 八 装饰器应用示例 九 超时装饰器 参考: https://www.cnblogs.com/linhaifeng/articles/6140395.html https://www.cnblogs.com/haiyan123/p/8387769.html 原文地址:https://www.cnblogs.com/XJT2018/p/11

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

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

python开发函数进阶:装饰器

一,装饰器本质 闭包函数 功能:就是在不改变原函数调用方式的情况下,在这个函数前后加上扩展功能 二,设计模式 开放封闭原则 *对扩展是开放的 *对修改是封闭的 三,代码解释 1 #!/usr/bin/env python 2 #_*_coding:utf-8_*_ 3 4 tag = False 5 6 def login(func): 7 def inner(*args,**kwargs): 8 global tag 9 if tag == False: 10 user = input('pl

函数进阶(装饰器)

装饰器 python装饰器本质上就是一个函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外的功能,装饰器的返回值也是一个函数对象(函数的指针).装饰器函数的外部函数传入我要装饰的函数名字,返回经过修饰后函数的名字:内层函数(闭包)负责修饰被修饰函数.从上面这段描述中我们需要记住装饰器的几点属性,以便后面能更好的理解: 实质: 是一个函数 参数:是你要装饰的函数名(并非函数调用) 返回:是装饰完的函数名(也非函数调用) 作用:为已经存在的对象添加额外的功能 特点:不需要对对象做任何的代码

Python - 函数进阶之装饰器

本章内容 高阶函数 装饰器 前言 接着上一篇函数进行整理.. 一.高阶函数 高阶函数就是将一个函数以参数的形式传入另一个函数 1 def main_func(func): 2 # 定义一个主函数,并设置一个参数func 3 4 return func 5 # 返回func的值,因为我需要传入一个函数,即返回func的返回值 6 7 def func(): 8 # 定义一个函数作为参数传入主函数 9 10 return "Lyon" 11 # 返回 "Lyon" 给f

python_day04 函数嵌套 名称空间和作用域 闭包 装饰器 迭代器 生成器 列表解析 三元表达式 生成器表达式

本节课重要知识点内容如下: 函数嵌套 名称空间和作用域 闭包 装饰器 迭代器 生成器 列表解析 三元表达式 生成器表达式 1.函数嵌套 函数的嵌套调用:在调用一个函数的过程中,又调用了其他函数函数的嵌套定义:在一个函数的内部,又定义另外一个函数 def bar(): print('from nbar')def foo(): print('from foo') bar()foo()def max2(x,y): if x > y: return x else: return ydef max4(a,

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')

第四天 内置函数2 随机码 装饰器 迭代器、生成器 递归 冒泡算法 JSON

关于函数的return li = [11,22,33,44] def f1(arg): arg.append(55) li = f1(li) print(li) 因为li = f1(li) 实际赋值的是f1的return,那么在这种情况下函数f1并未定义return,所以默认返回None 因此li的值应该是none 如果是 li = [11,22,33,44] def f1(arg): arg.append(55) f1(li) print(li) 因为函数传递的参数实际是参数的引用,因此在函数

第二模块&#183;函数编程-第1章 函数、装饰器、迭代器、内置方法

01-鸡汤之人丑就要多读书 02-三元运算 03-文件处理 04-文件处理-二进制模式 05-文件处理-智能检测编码的工具 06-文件处理-写模式操作文件 07-文件处理-追加模式操作文件 08-文件处理-混合操作文件 09-文件操作其他功能 10-文件处理-文件修改功能 11-函数-基本介绍 12-函数-默认参数 13-函数-关键参数 14-函数-非固定参数 15-函数-非固定参数2 16-函数-返回值 17-函数-局部变量 18-函数-在函数里修改全局变量 19-函数-在函数里修改列表数据

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

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