Python 基础第十一天(闭包和装饰器初识)

今日内容:

函数名的应用

闭包

装饰器的初识

装饰器的传参

1.函数名的应用

函数名是函数的名字.

本质:变量,特殊的变量。是函数的内存地址

函数名() 可以执行此函数

(1)单独打印函数名,可以得到函数的内存地址:

print(func1)  # <function func1 at 0x0000000000872378>

(2)函数名可以赋值

例:

def func2():
print(666)
#
f = func2
print(f())

(3)函数名可以作为容器类数据的元素。

例:

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‘]()

(4)函数可以作为参数

def f1():
print(666)
def f2(x): # x = f1
x() # f1()
f2(f1)

(5)函数名可以作为函数的返回值

def wraaper():
  def inner():
    print(666)
  return inner

ret = wraaper() # inner
ret() # inner()

#此代码的流程分析

代码由 上而下,def 设置了一个wraaper的变量名,由于没有引用变量,一直向下,到达,ret = wraaper(),看到变量赋值,优先计算等号右边的,即wraaper(),引用wraaper()函数,然后进入下一层, def inner(),记录变量名称,不走变量体,return返回inner,函数结束.return将inner返回给函数调用者,wraaper(),即ret = inner

然后运行代码inner(),然后找到局部空间内的inner函数,继续执行inner下面的内容.直到代码结束.

2.闭包

就是内层函数对外层函数(非全局)变量的引用。

python遇到闭包,有一个机制,会开辟一个空间,将闭包中的所有的变量等存储起来,不随着函数的结束而关闭。
闭包的完美体现:装饰器。

如何判断:内层函数名.__closure__  cell 就是=闭包

例题

def wraaper1():
  name = ‘老男孩‘
  def inner():
    print(name)
  inner()
  print(inner.__closure__)

wraaper1()

# cell返回,则是闭包

name = ‘老男孩‘
def wraaper2():
  name1 = ‘alex‘
  inner()

   print(name)

   print(name1)
print(inner.__closure__) # None
wraaper2()
变量name为全局变量,不属于外层函数的,所以不是闭包

装饰器初识:

什么是装饰器:

装饰器是在不改变现有函数的调用方式的情况下,对函数功能改变或者添加新的功能的新函数叫做装饰器.

也可以描述为在不改变原函数的执行的情况下,为原函数增加额外的功能

装饰器的固定格式:(被装饰函数带参数的装饰器)

def wrapper(funcl):

  def inner(*args,**kwargs):

    ‘‘‘被装饰函数运行之前‘‘

    retsalt = funcl(*args,**kwargs)

    ‘‘‘被装饰函数运行之后‘‘‘

    return retsalt

  return inner

@wrapper   #funcl = wrapper(funcl)  可以理解为这个等式这种形式  @wrapper 叫做语法糖

def  funcl(a,b)

  pass

funcl()

例题:(不带参数版本)

def timmer(f): # f = func1
  def inner():
    start_time = time.time()
    f() # func1()
    time.sleep(0.3)
    end_time = time.time()
    print(‘此函数的执行效率%s‘ % (end_time - start_time))
  return inner
# 语法糖@

@timmer # func1 = timmer(func1)
def func1():
  print(‘你有病呀,领导,测试我的执行效率干甚。‘)

func1() # inner()

例题(被装饰函数带参数的版本)

def timmer(f): # f = func1 函数名
  def inner(*args,**kwargs):
    start_time = time.time()
    f(*args,**kwargs)
    time.sleep(0.3)
    end_time = time.time()
    print(‘此函数的执行效率%s‘ % (end_time - start_time))
  return inner

@timmer # func1 = timmer(func1) # inner
def func1(a,b):
  print(a,b)
  print(‘你有病呀,领导,测试我的执行效率干甚。‘)

func1(a,b)

如果能把这个过程理解了就明白了,装饰器的基本流程.

原文地址:https://www.cnblogs.com/tom2ling/p/8678826.html

时间: 2024-10-09 22:18:35

Python 基础第十一天(闭包和装饰器初识)的相关文章

python基础(三)闭包与装饰器

闭包(closure): 内嵌函数通过调用外部嵌套函数作用域内的变量,则这个内嵌函数就是闭包. 闭包必须满足三个条件: 必须有一个内嵌函数 内嵌函数必须引用外部嵌套函数中的变量 外部函数的返回值必须是内嵌函数 eg: def make_power(y): def fn(x): return x ** y return fn pow = make_power(2) print pow(5) #25 #声明pow时返回了函数fn并将2作为嵌套函数的参数传入 #闭包内嵌套函数传递参数时,参数保留 装饰

13、python中的函数(闭包与装饰器)

一.嵌套函数 函数的内部又再定义另一个函数,这个函数就叫嵌套函数,里面含函数就叫内部函数. 示例: 二.返回函数 函数可以接收函数对象作为参数,同理函数也能返回一个函数对象作为返回值. 示例: 返回函数可以用来延迟函数的执行. 三.命名空间与变量作用域 变量作用域指的是变量的存活的范围.命名空间指的是属于一个对象的所有属性(对象)的集合. 示例: A的命名空间是A函数对象里面的所有对象的集合,包括变量a.函数B.变量b:B的命名空间就是属于函数B的所有对象的集合,包括变量b: a的变量作用域就是

Python虚拟机函数机制之闭包和装饰器(七)

函数中局部变量的访问 在完成了对函数参数的剖析后,我们再来看看,在Python中,函数的局部变量时如何实现的.前面提到过,函数参数也是一种局部变量.所以,其实局部变量的实现机制与函数参数的实现机制是完全一样的.这个"一样"是什么意思呢? 之前我们剖析过Python虚拟机的一些指令,如果要访问一个变量,应该使用LOAD_NAME指令,应该依照local.global.builtin这三个名字空间里去检索变量名所对应的变量值.然后在调用函数时,Python虚拟机通过PyFrame_New创

Python 基础 - Day 4 Learning Note - Decorator 装饰器

装饰器的知识准备 函数,函数参数 作用域: 全局变量,局部变量 变量解析规则:LEGB法则 - 假设嵌套函数(第二层函数),解析器查找内部函数的变量的顺序如下. 在任何一层先找到了符合要求的变量,则不再向外查找.如果没有,则抛出N Local - 本地函数内部,通过任何方式赋值的,而且没有被global关键字声明为全局变量的变量 Enclosing - 直接该内部函数的外围空间(即它的上层函数)的本地作用域.多层嵌套,则有内而外逐层查找,直至最外层的函数 Global - 全局空间(模块encl

python基础-第五篇-5.3装饰器

小白发呆的看着窗外,同事们陆陆续续的地来到公司,想起算法,小白就飘飘然了.突然后面传来一声呼唤,原来是小刘! 小刘:不好意思啊!堵车了,就来晚了点,不耽误你的时间,咱们就开启的今天的培训内容吧! 小白连忙说:没事,可以开始啦! 函数内存与执行函数 小刘:那我给你看一段代码,你看看会得到什么结果 def f1(): return 'F1' x = f1() print(x) x2 = f1 print(x2) 小白看了看,很快说出了x的输出值为‘F1’,但是看到x2这里,小白就有点想不通,小白就执

Python基础-----带参数验证功能的装饰器

#带参数,可以根据不同的认证类型进行认证 user_list = [ {'name':'a','password':'123'}, {'name':'b','password':'123'}, {'name':'c','password':'123'}, {'name':'d','password':'123'}] #所有用户信息列表(值为字符串类型) current_user = {'username':None,'login':False} #记录用户当前登录状态 def auth(auth

21.python中的闭包和装饰器

python中的闭包从表现形式上定义(解释)为:如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是闭包(closure). 以下说明主要针对 python2.7,其他版本可能存在差异. 也许直接看定义并不太能明白,下面我们先来看一下什么叫做内部函数: def wai_hanshu(canshu_1): def nei_hanshu(canshu_2): # 我在函数内部有定义了一个函数 return canshu_1*canshu_2 return

Python核心编程的四大神兽:迭代器、生成器、闭包以及装饰器

生成器 生成器是生成一个值的特殊函数,它具有这样的特点:第一次执行该函数时,先从头按顺序执行,在碰到yield关键字时该函数会暂停执行该函数后续的代码,并且返回一个值:在下一次调用该函数执行时,程序将从上一次暂停的位置继续往下执行. 通过一个例子来理解生成器的执行过程.求1-10的所有整数的立方并将结果打印输出,正常使用列表的实现如下: 输出结果如下: 当数据量很少时,可以很快得到结果.但是如果范围扩大到10000甚至是100000000,就会发现程序执行时间会变长,变卡,甚至有可能会因超出内存

Python之闭包and装饰器

闭包和装饰器是Python中非常重要的一种语法格式,在日常工作中应用非常广泛. 首先,我先为大家简单的接受一下闭包的概念. 闭包:闭包是在函数嵌套的基础上,内层函数使用到外层函数的变量,且外层函数返回内层函数的引用的一种语法格式. 闭包的基本格式,代码实现: def outer(): num = 0 def inner(): # 使用外部函数的变量 print(num) return inner # 返回inner函数在内存空间中的地址 # 将outer函数的返回值赋值给变量f,也就是说将f指向