python-闭包函数和装饰器
闭包函数
什么是闭包?
函数的内部函数,对外部作用域,而非全局作用域的引用。
可以打破层级关系,把局部变量拿到全局使用,并且可以把外部的变量x封装到f2中,然后下车直接调用f2就行了。
x = 10
def f1(x): # f1()== f2
# x = 2
def f2():
print(x)
return f2 # 把f2函数当做一个返回值返回给f1.
f2 =f1(1) # f1()就相当于把f2的值拿到,然后在赋值给一个变量名为f2。
f2()
1
全局中相同名字的变量不会影响局部的变量。
两种为函数传参的方式
使用参数的形式
def f1(x):
print(x)
f1(1)
1
包给函数
def f1(x):
def f2():
print(x)
return f2
f = f1(2)
f()
2
闭包函数的应用
闭包的意义:
返回的函数对象,不仅仅是一个函数对象,在该函数外还包裹一层作用域,这使得,该函数无论在何处调用,都优先使用自己外层包裹的作用域。
应用领域:延迟计算、爬虫领域。
import requests
def outter(url): #outter() == spider ;spider() == response == requests.get(url)
def spider(): # spider() == response
response = requests.get(url)
print(response.status_code)
return response
return spider
baidu = outter('https://www.baidu.com') # baidu == spider
baidu()
200
装饰器
无参装饰器
什么是装饰器
是为被装饰器对象添加额外功能。装饰器本质上也是一个函数,只不过这个函数具有装饰的功能。
为什么要用装饰器
当我们想新增功能,但又不想修改原方法的使用方法,这个时候就可以使用装饰器。
装饰器的实现必须遵循两大原则:
- 不修改被装饰对象的源代码
- 不修改被装饰对象的调用方式
怎么用装饰器
import time
def time_sleep():
time.sleep(1)
print('from time_sleep')
def deco(func): # deco()== wrapper ; func == time_sleep
def wrapper():
start = time.time()
res = func()
end = time.time()
print(end - start)
return res
return wrapper
time_sleep = deco(time_sleep) #func == time_sleep ,括号里的time_sleep才是调用上面函数time_sleep,而前面的time_sleep只是我们自定义的一个接收变量值的变量名。
time_sleep() # time_sleep() == wrapper()
from time_sleep
1.000948429107666
完善装饰器
返回值的
import time
def time_sleep():
time.sleep(1)
return 'longzeluola'
def deco(func):
def wrapper(*args,**kwargs):
start = time.time()
res = func(*args,**kwargs)
end = time.time()
print(end - start)
return res
return wrapper ##wrapper() == res == func()
time_sleep = deco(time_sleep) #wrapper
res = time_sleep() # wrapper()
print(res)
1.0001847743988037
longzeluola
参数的
import time
def time_sleep(x): #给定义了一个形参
time.sleep(x)
return 'longzeluola'
def deco(func):
def wrapper(*args,**kwargs):
start = time.time()
res = func(*args,**kwargs)
end = time.time()
print(end - start)
return res
return wrapper ##wrapper() == res == func()
time_sleep = deco(time_sleep) #wrapper
res = time_sleep(3) # wrapper()
print(res)
3.00034236907959
longzeluola
装饰器模板
def deco(func):
def wrapper(*args,**kwargs):
res = func(*args,**kwargs)
return res
return wrapper
语法糖
import time
@deco # @deco == time_sleep == deco(time_sleep)
def time_sleep(x):
time.sleep(x)
return 'longzeluola'
time_sleep(5)
5.000701427459717
python-闭包函数和装饰器的更多相关文章
- python 闭包函数与装饰器
1.什么是闭包函数 (1):什么是闭包函数: #内部函数包含对外部作用域而非全局作用域的引用, 简而言之, 闭包的特点就是内部函数引用了外部函数中的变量. 在Python中,支持将函数当做对象使用,也 ...
- python闭包函数与装饰器
目录 闭包函数 闭包概念 实际应用 装饰器 简介 简单版本装饰器 进阶版本装饰器 完整版本装饰器 装饰器模板 装饰器语法糖 装饰器修复技术 问题 答案 闭包函数 闭包概念 闭:定义在函数内部的函数 包 ...
- python闭包函数、装饰器
闭包函数的传值方式: 方式1:通过参数传值 def func(x): print(x)func(1) 方式2:闭包函数传值 def outter(x): def inner(): print(x) r ...
- python闭包函数及装饰器简介
目录: 闭包函数简介 闭包函数的实际应用 装饰器简介 装饰器初期-完整版 装饰器语法糖 闭包函数简介 1.定义在函数内部的函数(函数的嵌套) 2.内部函数运用外部函数局部名称空间中的变量名 注:函数名 ...
- python基础-闭包函数和装饰器
闭包函数和装饰器 闭包函数 概念:在函数中(嵌套)定义另一个函数时,内部函数引用了外层函数的名字. 特性 闭包函数必须在函数内部定义 闭包函数可引用外层函数的名字 闭包函数是函数嵌套.函数对象.名称空 ...
- day11 闭包函数和装饰器
1.函数不是新知识点 主要是学习函数的用法 在面向对象编程中,一切皆对象,函数也不例外 具体的表现 1.函数可以引用 2.函数可以作为函数的参数 3.函数可以作为函数的返回值 4.可以被存储到容器类型 ...
- Python之函数对象、函数嵌套、名称空间与作用域、闭包函数、装饰器
目录 一 函数对象 二 函数的嵌套 三 名称空间和作用域 四 闭合函数 五 装饰器 一.函数对象 1.函数是第一类对象 #第一类对象的特性:# 可以被引用 # 可以当做参数传递 # 返回值是函数 # ...
- 【Python3的命名空间与作用域,闭包函数,装饰器】
一.命名空间与作用域 命名空间是名字和对象的映射,就像是字典,key是变量名,value是变量的值 1.命名空间的定义 name='egon' #定义变量 def func(): #定义函数 pass ...
- day11_7.11 闭包函数与装饰器
补充: callable 代表可调用的,加括号可以执行.(函数或者类) import this 查看python之禅 一.闭包函数 所谓闭包函数,就是定义在函数内部的函数,也就是函数定义的嵌套.而在 ...
- CSIC_716_20191112【闭包函数和装饰器】
闭包函数 什么是闭包函数:闭包函数是函数嵌套.函数对象.名称空间和作用域的集合体. 闭包函数必须在函数内部定义,闭包函数可以引用外层函数的名字. # _*_ coding: gbk _*_ # @Au ...
随机推荐
- AXURE-手把手教你做汉化
我们默认下载的AXURE是英文版的,对于英文能力不足或者不习惯英文界面的,那必须使用汉化手段,网上也有很多朋友已经为大家做好了汉化文件,这里介绍一下如何自己做AXURE的汉化. 如何开始汉化 如何 ...
- 构造方法,this,super,final,static
1构造方法 一个Person类,属性都被private了,外界无法直接访问属性,必须对外提供相应的set和get方法.但如果需要在创建对象的同时明确对象的属性值,就需要构造方法了. 1.1定义 构建创 ...
- Java运算符、引用数据类型、流程控制语句
1运算符 1.1算术运算符 运算符是用来计算数据的符号. 数据可以是常量,也可以是变量. 被运算符操作的数我们称为操作数. 算术运算符最常见的操作就是将操作数参与数学计算: 运算符 运算规则 范例 结 ...
- Linux下软件安装的四种方式
一.源码安装 步骤: 下载,解压源码(常见的源码打包格式:.tar.gz/.tar.bz2); 可以直接下载源码再上传至linux服务器,或者在联网状态下,直接通过wget等命令获取源码安装包;源码解 ...
- C++拾遗(五)——类
类是 C++ 中最重要的特征.C++ 语言的早期版本被命名为“带类的 C(Cwith Classes)”,以强调类机制的中心作用.随着语言的演变,创建类的配套支持也在不断增加.语言设计的主要目标也变成 ...
- Selenium3+webdriver学习笔记4(css方式元素定位)
#!/usr/bin/env python# -*- coding:utf-8 -*- from selenium import webdriver import time,os # about:ad ...
- 两个div并列居中显示——当display:inline-block;时,两个div无法对齐即一高一矮
解决办法: 给div添加样式vertical-align: top;
- BZOJ 4423: [AMPPZ2013]Bytehattan 并查集+平面图转对偶图
4423: [AMPPZ2013]Bytehattan Time Limit: 3 Sec Memory Limit: 128 MB Submit: 277 Solved: 183 [Submit ...
- 学习Unity 4.6新GUI系统
(搬运自我在SegmentFault的博客) 最近在学习Unity的过程中,自己做一款小游戏自娱自乐.自然需要用到GUI.但4.5中的GUI很难用,一个选择是传说中的NGUI插件.但对于4.6中的新G ...
- Controller接收处理json、xml格式数据
1.RequestBody接收json格式的数据,并直接转为对象. User.java使用lombok依赖包 @Data @AllArgsConstructor @NoArgsConstructor ...