闭包函数

之前我们都是通过参数将外部的值传给函数,而闭包打破了层级关系,把局部变量拿到全局使用,并把外部的变量封装到内部函数中,然后下次直接调用就行了。

举个例子:

  1. # 闭包函数
  2. def outter():
  3. x = 1
  4. def inner():
  5. print(x)
  6. return inner
  7. f = outter() # 返回 f = inner
  8. f() # 直接调用局部变量inner()

在这个闭包函数中f = outter(1)在调用函数outter时,f返回的结果时inner,这是一个在函数内部定义的一个函数名,执行f()时就是在执行inner()函数,它实现了将局部变量拿到全局使用,打破了层级关系

返回的对象,不仅仅是一个函数对象,在该函数外还包裹了一层作用域,这使得,该函数无论在何处调用,优先使用自己外层包裹的作用域

  1. import requests
  2. def outter(url):
  3. def spider():
  4. responser = requests.get(url)
  5. print(responser.text)
  6. return spider
  7. baidu = outter("https://www.baidu.com")
  8. baidu()
  9. taobao = outter("https://www.taobao.com")
  10. taobao()

装饰器

装饰器就是用来装饰的工具,本质上其实是一个函数,只不过这个函数具有装饰的功能,改变功能的时候不改变被装饰对象的调用方式,并且不改变被装饰对象的源代码

无参装饰器

  1. is_login_dict = {'username': None}
  2. def login_deco(func):
  3. def wrapper(*args, **kwargs):
  4. if not is_login_dict['username']:
  5. username = input('请输入你的用户名》》》').strip()
  6. if username != 'fanping':
  7. print('非法登录')
  8. return
  9. is_login_dict['username'] = username
  10. res = func(*args, **kwargs)
  11. return res
  12. else:
  13. res = func(*args, **kwargs)
  14. return res
  15. return wrapper
  16. @login_deco # @login_deco 在此相当于是做了 shopping = login_deco(shopping)的操作
  17. def shopping():
  18. print('from shopping')
  19. @login_deco # @login_deco 在此相当于是做了 withdraw = login_deco(withdraw)的操作
  20. def withdraw():
  21. print('from withdraw')

有参装饰器

  1. is_login_dict = {'username': None}
  2. def auth(origin):
  3. def login_deco(func):
  4. def wrapper(*args, **kwargs): # 赋值后的time_sleep
  5. if origin == 'file':
  6. if not is_login_dict['username']:
  7. username = input('请输入你的用户名》》》').strip()
  8. if username != 'fanping':
  9. print('非法登录')
  10. return
  11. is_login_dict['username'] = username
  12. res = func(*args, **kwargs) # 真正的time_sleep
  13. return res
  14. else:
  15. res = func(*args, **kwargs) # 真正的time_sleep
  16. return res
  17. elif origin == 'mongodb':
  18. print('非法登录')
  19. else:
  20. print('dsb')
  21. return wrapper
  22. return login_deco
  23. # @auto('file')相当于是做了以下操作
  24. # f = origin('file') # login_deco
  25. # shopping = f(shopping)
  26. @auth('file')
  27. def shopping():
  28. print('from shopping')
  29. @auth('mongodb')
  30. def withdraw():
  31. print('from withdraw')

装饰器模板

  1. def deco(func):
  2. def wrapper(*args, **kwargs):
  3. res = func(*args, **kwargs)
  4. return res
  5. return wrapper
  6. @deco
  7. def func():
  8. pass

day12-闭包函数、装饰器的更多相关文章

  1. 【Python 函数对象 命名空间与作用域 闭包函数 装饰器 迭代器 内置函数】

    一.函数对象 函数(Function)作为程序语言中不可或缺的一部分,但函数作为第一类对象(First-Class Object)却是 Python 函数的一大特性. 那到底什么是第一类对象(Firs ...

  2. python 内嵌函数, 闭包, 函数装饰器

    一.  函数内嵌 闭包 在python中,函数可以作为返回值, 可以给变量赋值. 在python中, 内置函数必须被显示的调用, 否则不会执行. #!/usr/bin/env python #-*- ...

  3. Python记录9:函数4:名称空间作用域+闭包函数+装饰器

    ''' 一: 名称空间namespaces     名称空间就是存放名字与值绑定关系的内存空间 二: 名称空间分为三种     内置名称空间:         1. 特点: 存放是python解释器自 ...

  4. Python作用域-->闭包函数-->装饰器

    1.作用域: 在python中,作用域分为两种:全局作用域和局部作用域. 全局作用域是定义在文件级别的变量,函数名.而局部作用域,则是定义函数内部. 关于作用域,我要理解两点:a.在全局不能访问到局部 ...

  5. day12闭包,装饰器

    一.闭包:内部函数引用了外部函数的变量. # f1() #闭包的定义 #内部的函数引用了外部函数的变量 # def f1(b): #闭包的常用状态 # def f2(): # print(b) # r ...

  6. Day 12 闭包函数,装饰器

    闭包函数 回顾: 1.函数对象:可以将定义在函数内的函数返回到全局使用.从而打破了函数层级限制 2.名称空间与作用域:作用域关系在函数定义阶段时就已经固定死了,与调用位置无关,即在任意位置调用函数都需 ...

  7. 【0812 | Day 13】闭包函数/装饰器/迭代器

    目录 闭包函数 无参装饰器 有参装饰器 迭代器 闭包函数 一.什么是闭包? 闭包指的是:函数内部函数对外部作用域而非全局作用域的引用. def outter(): x = 1 def inner(): ...

  8. python3 闭包函数 装饰器

    闭包函数 1.闭:定义在函数内部的函数 2.包:内部函数引用了外部函数作用域的名字 在函数编程中经常用到闭包.闭包是什么,它是怎么产生的及用来解决什么问题呢.给出字面的定义先:闭包是由函数及其相关的引 ...

  9. python闭包函数&装饰器

    一.函数引用 函数可以被引用 函数可以被赋值给一个变量 def hogwarts(): print("hogwarts") # hogwarts() # 函数调用 print(ho ...

  10. python 复习函数 装饰器

    # 函数 —— 2天 # 函数的定义和调用 # def 函数名(形参): #函数体 #return 返回值 #调用 函数名(实参) # 站在形参的角度上 : 位置参数,*args,默认参数(陷阱),* ...

随机推荐

  1. [javase学习笔记]-7.7 thiskeyword的细节与应用

    这一节我们接着上一节来继续学习thiskeyword. 我们之前在7.5节中的构造函数应注意的细节中提到过一个细节就是构造函数能够调用一般函数,但一般函数不能直接调用构造函数.可是我们没有深究构造函数 ...

  2. PLY格式文件具体解释

    链接:http://blog.csdn.net/szchtx/article/details/7587999 http://cdu.net.cn/3D/2014-04-23/705.html 一.PL ...

  3. 微信前端js sdk以外的开发

    此时页面中就会出现刚才我画红圈部分的工具条. 这个工具条再加上上面的标题栏工具条. 极大的降低了可视区域的面积. 是否能将它去掉呢?答案是能够的.增加以下代码就能够去掉微信中以下的工具条: docum ...

  4. Python类私有方法的陷阱

    引言 Python不像C++.Java.C#等有明白的公共.私有或受保护的keyword来定义成员函数或属性,它使用约定的单下划线"_"和"__"双下划线作为函 ...

  5. MapReduce03

    ======================== MapReduce 2.0基本架构 ======================== Client -------------> 与MapRed ...

  6. leaning website

      -->SoapUI http://soapui-tutorial.com/home/login/SOAPUI    Module 13 - 1, 2, 3, 4, 5, 6 Module 1 ...

  7. Ip获取请求ip

    public class IPAdress { public static bool isIP(string str1) { || str1.Length > ) return false; s ...

  8. touch事件的分发机制

    作者:谢昆 一段伪代码反应整个touch事件的分发 public boolean dispatchTouchEvent(MotionEvent event) { boolean consume = f ...

  9. openstack liberty aio nova 调试

  10. 自定义Git(转载)

    转自:http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/00137621280731 ...