闭包函数

什么是闭包?

函数的内部函数,对外部作用域,而非全局作用域的引用。

可以打破层级关系,把局部变量拿到全局使用,并且可以把外部的变量x封装到f2中,然后下车直接调用f2就行了。

  1. x = 10
  2. def f1(x): # f1()== f2
  3. # x = 2
  4. def f2():
  5. print(x)
  6. return f2 # 把f2函数当做一个返回值返回给f1.
  7. f2 =f1(1) # f1()就相当于把f2的值拿到,然后在赋值给一个变量名为f2。
  8. f2()
  9. 1

全局中相同名字的变量不会影响局部的变量。

两种为函数传参的方式

使用参数的形式

  1. def f1(x):
  2. print(x)
  3. f1(1)
  4. 1

包给函数

  1. def f1(x):
  2. def f2():
  3. print(x)
  4. return f2
  5. f = f1(2)
  6. f()
  7. 2

闭包函数的应用

闭包的意义:

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

应用领域:延迟计算、爬虫领域。

  1. import requests
  2. def outter(url): #outter() == spider ;spider() == response == requests.get(url)
  3. def spider(): # spider() == response
  4. response = requests.get(url)
  5. print(response.status_code)
  6. return response
  7. return spider
  8. baidu = outter('https://www.baidu.com') # baidu == spider
  9. baidu()
  10. 200

装饰器

无参装饰器

什么是装饰器

是为被装饰器对象添加额外功能。装饰器本质上也是一个函数,只不过这个函数具有装饰的功能。

为什么要用装饰器

当我们想新增功能,但又不想修改原方法的使用方法,这个时候就可以使用装饰器。

装饰器的实现必须遵循两大原则:

  1. 不修改被装饰对象的源代码
  2. 不修改被装饰对象的调用方式

怎么用装饰器

  1. import time
  2. def time_sleep():
  3. time.sleep(1)
  4. print('from time_sleep')
  5. def deco(func): # deco()== wrapper ; func == time_sleep
  6. def wrapper():
  7. start = time.time()
  8. res = func()
  9. end = time.time()
  10. print(end - start)
  11. return res
  12. return wrapper
  13. time_sleep = deco(time_sleep) #func == time_sleep ,括号里的time_sleep才是调用上面函数time_sleep,而前面的time_sleep只是我们自定义的一个接收变量值的变量名。
  14. time_sleep() # time_sleep() == wrapper()
  15. from time_sleep
  16. 1.000948429107666

完善装饰器

返回值的

  1. import time
  2. def time_sleep():
  3. time.sleep(1)
  4. return 'longzeluola'
  5. def deco(func):
  6. def wrapper(*args,**kwargs):
  7. start = time.time()
  8. res = func(*args,**kwargs)
  9. end = time.time()
  10. print(end - start)
  11. return res
  12. return wrapper ##wrapper() == res == func()
  13. time_sleep = deco(time_sleep) #wrapper
  14. res = time_sleep() # wrapper()
  15. print(res)
  16. 1.0001847743988037
  17. longzeluola

参数的

  1. import time
  2. def time_sleep(x): #给定义了一个形参
  3. time.sleep(x)
  4. return 'longzeluola'
  5. def deco(func):
  6. def wrapper(*args,**kwargs):
  7. start = time.time()
  8. res = func(*args,**kwargs)
  9. end = time.time()
  10. print(end - start)
  11. return res
  12. return wrapper ##wrapper() == res == func()
  13. time_sleep = deco(time_sleep) #wrapper
  14. res = time_sleep(3) # wrapper()
  15. print(res)
  16. 3.00034236907959
  17. longzeluola

装饰器模板

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

语法糖

  1. import time
  2. @deco # @deco == time_sleep == deco(time_sleep)
  3. def time_sleep(x):
  4. time.sleep(x)
  5. return 'longzeluola'
  6. time_sleep(5)
  7. 5.000701427459717

python-闭包函数和装饰器的更多相关文章

  1. python 闭包函数与装饰器

    1.什么是闭包函数 (1):什么是闭包函数: #内部函数包含对外部作用域而非全局作用域的引用, 简而言之, 闭包的特点就是内部函数引用了外部函数中的变量. 在Python中,支持将函数当做对象使用,也 ...

  2. python闭包函数与装饰器

    目录 闭包函数 闭包概念 实际应用 装饰器 简介 简单版本装饰器 进阶版本装饰器 完整版本装饰器 装饰器模板 装饰器语法糖 装饰器修复技术 问题 答案 闭包函数 闭包概念 闭:定义在函数内部的函数 包 ...

  3. python闭包函数、装饰器

    闭包函数的传值方式: 方式1:通过参数传值 def func(x): print(x)func(1) 方式2:闭包函数传值 def outter(x): def inner(): print(x) r ...

  4. python闭包函数及装饰器简介

    目录: 闭包函数简介 闭包函数的实际应用 装饰器简介 装饰器初期-完整版 装饰器语法糖 闭包函数简介 1.定义在函数内部的函数(函数的嵌套) 2.内部函数运用外部函数局部名称空间中的变量名 注:函数名 ...

  5. python基础-闭包函数和装饰器

    闭包函数和装饰器 闭包函数 概念:在函数中(嵌套)定义另一个函数时,内部函数引用了外层函数的名字. 特性 闭包函数必须在函数内部定义 闭包函数可引用外层函数的名字 闭包函数是函数嵌套.函数对象.名称空 ...

  6. day11 闭包函数和装饰器

    1.函数不是新知识点 主要是学习函数的用法 在面向对象编程中,一切皆对象,函数也不例外 具体的表现 1.函数可以引用 2.函数可以作为函数的参数 3.函数可以作为函数的返回值 4.可以被存储到容器类型 ...

  7. Python之函数对象、函数嵌套、名称空间与作用域、闭包函数、装饰器

    目录 一 函数对象 二 函数的嵌套 三 名称空间和作用域 四 闭合函数 五 装饰器 一.函数对象 1.函数是第一类对象 #第一类对象的特性:# 可以被引用 # 可以当做参数传递 # 返回值是函数 # ...

  8. 【Python3的命名空间与作用域,闭包函数,装饰器】

    一.命名空间与作用域 命名空间是名字和对象的映射,就像是字典,key是变量名,value是变量的值 1.命名空间的定义 name='egon' #定义变量 def func(): #定义函数 pass ...

  9. day11_7.11 闭包函数与装饰器

    补充: callable 代表可调用的,加括号可以执行.(函数或者类) import this  查看python之禅 一.闭包函数 所谓闭包函数,就是定义在函数内部的函数,也就是函数定义的嵌套.而在 ...

  10. CSIC_716_20191112【闭包函数和装饰器】

    闭包函数 什么是闭包函数:闭包函数是函数嵌套.函数对象.名称空间和作用域的集合体. 闭包函数必须在函数内部定义,闭包函数可以引用外层函数的名字. # _*_ coding: gbk _*_ # @Au ...

随机推荐

  1. Selenium 开源书(一): Selenium历史

    Selenium历史 Selenium最初由Jason Huggins于2004年开发,作为ThoughtWorks的内部工具.Huggins后来加入了ThoughtWorks的其他程序员和测试人员, ...

  2. LWIP学习之一些细节

    一 绑定端口后,开启监听,为何监听还要返回一个新的连接?:监听状态的连接只需要很小的内存,于是tcp_listen()就会收回原始连接的内存,而重新分配一个较小内存块供处于监听状态的连接使用. 二 t ...

  3. C# 连接oracle,用32位client和64位Client,可能导致结果不同

    在调用过程[pro_regentinitauth]时,有参数3-6为number类型,当我们用这样调用时,在32位client下,能正确得到输出参数3-6的结果为:1023, 但是,当我们把程序部署到 ...

  4. 基于 opencv图像去噪

                       -------------------开通头条号-------------------- 实验名称 图像去噪 实验目的 1.掌握算术均值滤波器.几何均值滤波器.谐 ...

  5. P4874 回形遍历 —模拟

    思路: 写完后信心满满,结果超时. 我很不解,下了个数据结果——,z竟然是大于1e10的,跟题目给的不一样啊 原来如此,正解是一行一行的走的... 注意当到两边一样近时,应优先向下和右!!!!!! 这 ...

  6. mysql(数据库,sql语句,普通查询)

    第1章 数据库 1.1 数据库概述 l 什么是数据库 数据库就是存储数据的仓库,其本质是一个文件系统,数据按照特定的格式将数据存储起来,用户可以对数据库中的数据进行增加,修改,删除及查询操作. l 什 ...

  7. 解决easyUI下拉控件无法触发onkeydown事件

    实现在combotree下拉控件中按Backspace键清除combotree选中的值 下面的代码无法获取到键盘事件 <input class="easyui-combotree&qu ...

  8. Python3+Selenium3+webdriver学习笔记9(发送富文本信息及上传文件处理)

    #!/usr/bin/env python# -*- coding:utf-8 -*-'''Selenium3+webdriver学习笔记9(发送富文本信息及上传文件处理)'''from seleni ...

  9. Cause: java.lang.UnsupportedOperationException

    运行web项目的时候出现以下错误: ### Cause: java.lang.UnsupportedOperationException    at org.mybatis.spring.MyBati ...

  10. 多线程程序设计-Thread的一些方法

    run():是程序中会和会和其他线程“同时”执行的部分.   wait():使得当前线程进入等待状态,等待的线程不会主动进入到线程队列中排队等待cpu资源,必须由其他线程调用notify()方法通知它 ...