函数名的本质

函数名本质上就是函数的内存地址。

1.可以赋值给其他变量,被引用

def func():
print('in func') f = func
print(f)

2.可以被当作容器类型的元素

def f1():
print('f1') def f2():
print('f2') def f3():
print('f3') l = [f1,f2,f3]
d = {'f1':f1,'f2':f2,'f3':f3}
#调用
l[0]()
d['f2']()

3.可以当作函数的参数和返回值

def f1():
print('f1') def func1(argv):
argv()
return argv f = func1(f1)
f()
第一类对象(first-class object)指
1.可在运行期创建
2.可用作函数参数或返回值
3.可存入变量的实体。 #可以当做普通变量用!

闭包

闭包函数:

内部函数包含对外部作用域而非全剧作用域变量的引用,该内部函数称为闭包函数
#函数内部定义的函数称为内部函数

def wrapper():
name='laozhang'
def inner():
print(name)
inner()
print(inner.__closure__) #检测是不是闭包 cell 就是b包
wrapper() '''
输出内容:

laozhang
(<cell at 0x0000000002167498: str object at 0x00000000026D6CB0>,)

'''

由于有了作用域的关系,我们就不能拿到函数内部的变量和函数了。如果我们就是想拿怎么办呢?返回呀!

我们都知道函数内的变量我们要想在函数外部用,可以直接返回这个变量,那么如果我们想在函数外部调用函数内部的函数呢?

是不是直接就把这个函数的名字返回就好了?

这才是闭包函数最常用的用法

判断闭包函数的方法__closure__

#输出的__closure__有cell元素 :是闭包函数
def func():
name = 'eva'
def inner():
print(name)
print(inner.__closure__)
return inner f = func()
f() #输出的__closure__为None :不是闭包函数
name = 'egon'
def func2():
def inner():
print(name)
print(inner.__closure__)
return inner f2 = func2()
f2()

闭包嵌套

def wrapper():
money = 1000
def func():
name = 'eva'
def inner():
print(name,money)
return inner
return func f = wrapper()
i = f()
i()     '''
eva 1000
'''

闭包的用处:

如果说内存函数是个闭包,python内部有一个机制,遇到闭包,会在内存中开启一个内存空间(不会关闭),不会随着函数的结束而关闭,能够节省创建新内存的时间和使用频率。

应用:网页爬虫

from urllib.request import urlopen

def index():
url = "http://www.xiaohua100.cn/index.html"
def get():
return urlopen(url).read()
return get xiaohua = index()
content = xiaohua()
print(content)

装饰器

在不改变原函数的基础上,增加其他功能。(验证登录、测试时间、打印日志)

1.简单的装饰器

import time
def func():
print('更健康')
def timmer(f):
def inner():
start_time = time.clock()
time.sleep(0.1)
f()
end_time = time.clock()
print('执行时间为%s'%(end_time - start_time))
return inner
func = timmer(func)
func() '''

更健康
执行时间为0.0998653700182556

'''
 

2.语法糖(简单版本的装饰器):

将@装饰器的函数名,放在被装饰的函数之前。

import time
def timmer(f):
def inner():
start_time = time.clock()
time.sleep(0.1)
f()
end_time = time.clock()
print('执行时间为%s'%(end_time - start_time))
return inner
@timmer #相当于func = timmer(func)
def func():
print('更健康')
func() #inner() '''

更健康
执行时间为0.1004682374539092

'''

3.带参数的装饰器

import time
def timmer(f):
def inner(*args,**kwargs):
start_time = time.clock()
time.sleep(0.1)
f(*args,**kwargs)
end_time = time.clock()
print('执行时间为%s'%(end_time - start_time))
return inner
@timmer #相当于func = timmer(func)
def func(a):
print('%s更健康'%a)
@timmer #相当于func1 = timmer(func1)
def func1(a,b):
print('%s和%s更健康'%(a,b))
func('老哥') #
func1('老哥','杀毒软件') '''

老哥更健康
执行时间为0.10024377977801449
老哥和杀毒软件更健康
执行时间为0.09983056346016456

'''

4.带返回值的装饰器

import time
def timmer(f):
def inner(*args,**kwargs):
start_time = time.clock()
time.sleep(0.1)
ret = f(*args,**kwargs) #
end_time = time.clock()
print('执行时间为%s'%(end_time - start_time))
return ret
return inner
@timmer #相当于func = timmer(func)
def func(a): #a:老哥
return 222
print(func('老哥')) '''

执行时间为0.0996239553012396

'''

5.通用装饰器

def wrapper(func):
def inner(*args,**kwargs):
'''执行函数前的操作'''
ret = func(*args,**kwargs)
'''执行函数后的操作'''
return ret
return inner
@wrapper
def func():
print(66) func()

Python之函数的本质、闭包、装饰器的更多相关文章

  1. python 函数名 、闭包 装饰器 day13

    1,函数名的使用. 函数名是函数的名字,本质就是变量,特殊的变量.函数名()加括号就是执行此函数. 1,单独打印函数名就是此函数的内存地址. def func1(): print(555) print ...

  2. python 全栈开发,Day11(函数名应用,闭包,装饰器初识,带参数以及带返回值的装饰器)

    一.函数名应用 函数名是什么?函数名是函数的名字,本质:变量,特殊的变量. 函数名(),执行此函数. python 规范写法 1. #后面加一个空格,再写内容,就没有波浪线了. 2.一行代码写完,下面 ...

  3. python函数闭包-装饰器-03

    可调用对象 callable()  # 可调用的(这个东西加括号可以执行特定的功能,类和函数) 可调用对象即  callable(对象)  返回为  True  的对象 x = 1 print(cal ...

  4. python笔记3 闭包 装饰器 迭代器 生成器 内置函数 初识递归 列表推导式 字典推导式

    闭包 1, 闭包是嵌套在函数中的 2, 闭包是内层函数对外层函数的变量(非全局变量)的引用(改变) 3,闭包需要将其作为一个对象返回,而且必须逐层返回,直至最外层函数的返回值 闭包例子: def a1 ...

  5. Python的函数式编程-传入函数、排序算法、函数作为返回值、匿名函数、偏函数、装饰器

    函数是Python内建支持的一种封装,我们通过把大段代码拆成函数,通过一层一层的函数调用,就可以把复杂任务分解成简单的任务,这种分解可以称之为面向过程的程序设计.函数就是面向过程的程序设计的基本单元. ...

  6. python 闭包@装饰器

    1.装饰器 装饰器(Decorator)相对简单,咱们先介绍它:“装饰器的功能是将被装饰的函数当作参数传递给与装饰器对应的函数(名称相同的函数),并返回包装后的被装饰的函数”,听起来有点绕,没关系,直 ...

  7. Python 进阶_闭包 & 装饰器

    目录 目录 闭包 函数的实质和属性 闭包有什么好处 小结 装饰器 更加深入的看看装饰器的执行过程 带参数的装饰器 装饰器的叠加 小结 装饰器能解决什么问题 小结 闭包 Closure: 如果内层函数引 ...

  8. Python【第四篇】函数、内置函数、递归、装饰器、生成器和迭代器

    一.函数 函数是指将一组语句的集合通过一个名字(函数名)封装起来,要想执行这个函数,只需调用其函数名即可 特性: 减少重复代码 使程序变的可扩展 使程序变得易维护 1.定义 def 函数名(参数): ...

  9. 【Python入门学习】闭包&装饰器&开放封闭原则

    1. 介绍闭包 闭包:如果在一个内部函数里,对在外部作用域的变量(不是全局作用域)进行引用,那边内部函数被称为闭包(closure) 例如:如果在一个内部函数里:func2()就是内部函数, 对在外部 ...

  10. Python使用property函数和使用@property装饰器定义属性访问方法的异同点分析

    Python使用property函数和使用@property装饰器都能定义属性的get.set及delete的访问方法,他们的相同点主要如下三点: 1.定义这些方法后,代码中对相关属性的访问实际上都会 ...

随机推荐

  1. element-ui 源码解析 二

    Carousel 走马灯源码解析 1. 基本原理:页面切换 页面切换使用的是 transform 2D 转换和 transition 过渡 可以看出是采用内联样式来实现的 举个栗子 <div : ...

  2. requests 使用免费的代理ip爬取网站

    import requests import queue import threading from lxml import etree #要爬取的URL url = "http://xxx ...

  3. 记一次生产mysql数据误操作恢复过程

    提示:建议每次对数据库进行修改时都做下备份 注意:以下Mysql开启的是row格式的binlog日志,确定到误操作具体时间可能有些麻烦,默认的格式就能很快找出来.这里开启row的原因是还有一种更快的方 ...

  4. 版本控制Git使用最佳实践

    总结版本控制Git的使用,应明确有哪些具体的场景 应用场景  紧急上线(hotfix)  功能开发(feature)  测试(dev/release)  生产(master) 紧急上线 4.git c ...

  5. Delphi 工具条按钮上的下拉菜单

    制作步骤: 1.添加一个 TImageList: ImageList1, 然后载入些图标; 2.添加两个 TPopupMenu: PopupMenu1.PopupMenu2, 并分别添加些菜单项; 3 ...

  6. sql行转列实例

    select gh ,xm , max(A.bz) as bz , max(A.jcz) as jcz , max(A.dl) as dl , max(A.czzx) as czzx , max(A. ...

  7. css伪元素之before和after

    css里面的伪元素主要是用来给选择器设置特殊效果.根据常用性,记录before和after. “:before”伪元素用来在元素的内容前面添加新的元素.比如标题前面会有一个小方块,就可以通过‘ :be ...

  8. @ControllerAdvice + @ExceptionHandler 全局处理 Controller 层异常==》记录

    对于与数据库相关的 Spring MVC 项目,我们通常会把 事务 配置在 Service层,当数据库操作失败时让 Service 层抛出运行时异常,Spring 事物管理器就会进行回滚. 如此一来, ...

  9. 学习 Spring (五) Aware 接口

    Spring入门篇 学习笔记 Spring 中提供了一些以 Aware 结尾的接口,实现了 Aware 接口的 bean 在被初始化之后可以获取相应资源 通过 Aware 接口,可以对 Spring ...

  10. C#程序中设置全局代理(Global Proxy)

    1. HttpWebRequest类的Proxy属性,只要设置了该属性就能够使用代理了,如下: 1             //设置代理 2         WebProxy WP = new Web ...