闭包函数

什么是闭包?

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

可以打破层级关系,把局部变量拿到全局使用,并且可以把外部的变量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

装饰器

无参装饰器

什么是装饰器

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

为什么要用装饰器

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

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

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

怎么用装饰器

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

最新文章

  1. 在JS中关于堆与栈的认识function abc(a){ a=100; } function abc2(arr){ arr[0]=0; }
  2. 从Prototype学习JavaScript面向对象编程
  3. 大话设计模式C++版——装饰模式
  4. HTML5中的Range对象的研究
  5. ODBC访问不到Server的问题
  6. Java异常处理之try-catch-finally
  7. ASP.NET中定制自己的委托和事件参数类
  8. CSS 特殊样式设置集合
  9. 参数化SQL小认识
  10. C#基础 大盘点
  11. ActionBar+Fragment实现顶部标签页
  12. Testlink1.9.17使用方法(第二章 登录&汉化设置)
  13. PDF如何添加水印,PDF添加水印工具的使用方法
  14. web----框架基础
  15. Cocos2dx网络读取图片
  16. ffmpeg编码中的二阻塞一延迟
  17. 如何给oracle账户解锁
  18. postgresql 脏读-dirtied
  19. 004-集成maven和Spring boot的profile功能打包
  20. Mysql主从架构报错-Fatal error: The slave I/O thread stops because master and slave have equal MySQL server UUIDs; these UUIDs must be different for replication to work...

热门文章

  1. 前端CSS(1)
  2. P4869 罪犯分组
  3. 基于Java实现的快速排序
  4. 前后端分离 vue+springboot 跨域 session+cookie失效问题
  5. 浏览器兼容之条件注释,cssHack
  6. 使用AuthToken架构保护用户帐号验证Cookie的安全性
  7. countUp 动画展示数字变化
  8. 【extjs6学习笔记】0.1 准备:基础概念(02)
  9. fpathconf
  10. POJ 4020 NEERC John's inversion 贪心+归并求逆序对