1.函数作用域LEGB

L:local函数内部作用域

E:enclosing函数内部与内嵌函数之间

G:global全局作用域

B:build-in内置作用域

passline = 60
def func(val):passline = 90if val >= passline:print('pass')else:print('failed')def in_func()print(val)in_func()def Max(val1,val2):return max(val1,val2)
func(89)
print(Max(90,100))

2.闭包理解与使用

闭包概念:Closure:内部函数中对enclosing作用域的变量进行引用

函数实质与属性

1:函数是一个对象

2:函数执行完成后内部变量回收

3:函数属性

4:函数返回值

闭包作用

1:封装

2:代码复用

passline = 60#100
def func(val):print('%x'%id(val))passline = 90if val >= passline:print('pass')else:print('failed')def in_func():#(val,)print(val)in_func()return in_funcf = func(89)
f()
print(f.__closure__)
29198a8
failed
89
89
(<cell at 0x7fe62bbf42f0: int object at 0x29198a8>,)
[Finished in 0.0s]

def func_150(val):passline = 90if val >= passline:print('%d pass'%val)else:print('failed')def func_100(val):passline = 60if val >= passline:print('%d pass'%val)else:print('failed')def set_passline(passline):def cmp(val):if val >= passline:print('pass')else:print('failed')return cmp
f_100 = set_passline(60)
f_150 = set_passline(90)
print(type(f_100))
print(f_100.__closure__)f_100(89)
f_100(59)
f_150(89)
f_150(59)

pass
failed
failed
failed
[Finished in 0.0s]

def my_averge(*arg):print('in my_averge')return sum(arg)/len(arg)def my_sum(*arg):print('in my_sum')return sum(arg)def dec(func):def in_dec(*arg):print('in dec arg = ', arg)if len(arg) == 0:return 0for val in arg:if not isinstance(val, int):return 0return func(*arg)return in_dec#dec return in_dec -> my_sum
#my_sum = in_dec(*arg)
my_sum = dec(my_sum)
print(my_sum(1, 2, 3, 4, 5))
print(my_sum(1, 2, 3, 4, 5, '6'))
print(my_averge(1, 2, 3, 4, 5))
my_averge = dec(my_averge)
print(my_averge(1, 2, 3, 4, 5, '6'))

('in dec arg = ', (1, 2, 3, 4, 5))
in my_sum
15
('in dec arg = ', (1, 2, 3, 4, 5, '6'))
0
in my_averge
3
('in dec arg = ', (1, 2, 3, 4, 5, '6'))
0
[Finished in 0.0s]

3.装饰器

1:装饰器用来装饰函数

2:返回一个函数对象

3:被装饰函数标识符指向返回的函数对象

4:语法糖 @deco

def dec(func):print('call dec')def in_dec(*arg):#my_sumprint('in dec arg = ', arg)if len(arg) == 0:return 0for val in arg:if not isinstance(val, int):return 0return func(*arg)return in_dec@dec
def my_sum(*arg):#my_sum = in_decprint('in my_sum')return sum(arg)print(my_sum(1, 2, 3, 4, 5))#my_sum = dec(my_sum)#deco(bar) -> in_deco
#bar = in_deco
#bar() in_deco() bar()
def deco(func):def in_deco(x,y):print('in deco')func(x,y)print('call deco')return in_deco
@deco
def bar(x,y):print('in bar',x+y)
print(type(bar))
bar(1,2)

call dec
('in dec arg = ', (1, 2, 3, 4, 5))
in my_sum
15
call deco
<type 'function'>
in deco
('in bar', 3)
[Finished in 0.0s]

转载于:https://www.cnblogs.com/zaorunzi/p/9392480.html

python装饰器之函数作用域相关推荐

  1. python装饰器函数-python函数装饰器之带参数的函数和带参数的装饰器用法示例

    本文实例讲述了python函数装饰器之带参数的函数和带参数的装饰器用法.分享给大家供大家参考,具体如下: 1. 函数带多个参数 # 普通的装饰器, 打印函数的运行时间 def decrator(fun ...

  2. python装饰器函数-python函数装饰器

    什么是装饰器 装饰器是一个可调用的对象,其参数是另一个函数(被装饰的函数).装饰器可能会: 1,处理被装饰的函数,然后把它返回 2,将其替换成另一个函数或者对象 若有个名为decorate的装饰器,则 ...

  3. python装饰器函数-Python函数装饰器指南

    Python 具有强大的功能和富有表现力的语法.我最喜欢的装饰之一.在设计模式的上下文中,装饰器动态更改方法或类功能,而不必直接使用子类.当您需要扩展功能,但不想修改原函数时,这是理想的选择.我们可以 ...

  4. Python 装饰器 函数

    Python装饰器学习(九步入门):http://www.cnblogs.com/rhcad/archive/2011/12/21/2295507.html 浅谈Python装饰器:https://b ...

  5. python装饰器函数-python之路——装饰器函数

    阅读目录 楔子 作为一个会写函数的python开发,我们从今天开始要去公司上班了.写了一个函数,就交给其他开发用了. deffunc1():print('in func1') 季度末,公司的领导要给大 ...

  6. python装饰器函数-Python精进-装饰器与函数对象

    本文为<爬着学Python>系列第四篇文章. 从本篇开始,本专栏在顺序更新的基础上,会有不规则的更新. 在Python的学习与运用中,我们迟早会遇到装饰器,这个概念对于初识装饰器的新手来说 ...

  7. python装饰器函数-【python3】 函数 装饰器

    第一步 : 了解装饰器 装饰器模式,重点在于装饰,装饰的核心仍是被装饰的对象. 举一个栗子:我今天穿了一件短袖,但是突然一阵风,短袖没办法为我御寒,我想到的办法是将短袖变得更厚更长,但是改造之后,它就 ...

  8. python装饰器函数-python装饰器1:函数装饰器详解

    先混个眼熟 谁可以作为装饰器(可以将谁编写成装饰器): 函数 方法 实现了__call__的可调用类 装饰器可以去装饰谁(谁可以被装饰): 函数 方法 类 基础:函数装饰器的表现方式 假如你已经定义了 ...

  9. python装饰器函数-python3 函数:函数装饰器

    装饰器 python装饰器本质上就是一个函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外的功能,装饰器的返回值也是一个函数对象(函数的指针). 实质: 是一个函数. 参数:是你要装饰的函数 ...

最新文章

  1. A monad tutorial for Clojure programmers (part 3)
  2. 开发日记-20190401
  3. 华为鸿蒙15日上市,华为鸿蒙什么时候上市
  4. Hibernate的复合主键映射
  5. 编译VTK的MFC库
  6. eclipse+tomcat开发web程序
  7. (39)VHDL实现移位寄存器(方法1)
  8. 学习pytorch的一些自己犯过的错误而总结的注意事项,估计其他也会使用
  9. 2021年行政区划代码
  10. 前端学习(一):HTML基本语法
  11. WIN7安装IIS后无默认网站(Default Web site)解决方案
  12. uniapp 复制剪贴板
  13. java 线程池超时_Java线程池停止超时任务
  14. 【记坑】大白菜或老毛桃制作U盘后BIOS找不到系统
  15. 第三篇,网络层的IP协议
  16. 后渗透篇:COM劫持及加载技术
  17. 谁来给网络彩票排毒?
  18. P7-Windows与网络基础-虚拟机基本操作
  19. mysql applier_DRC 是唯品会自研的MySQL双向复制方案,主要应用场景是数据库双向复制、单向复制...
  20. VVC/VTM 4.2 帧内编码——亮度预测理解

热门文章

  1. python和易语言爬虫速度_如何优化 Python 爬虫的速度?
  2. fastdfs windows部署_从零搭建分布式文件系统MinIO比FastDFS要更合适
  3. 力扣 填充每个节点的下一个右侧节点指针
  4. ipad air屏幕不能滑动,无法解锁怎么处理
  5. 电脑自动关机设置方法
  6. 普通人买得到国债吗?
  7. 给汽车轮胎内充满水而不是气,行不行?
  8. 如果把电商的经营分为选品、供应链、视觉、营销四个环节
  9. 创业者总认为自己能力很强,但能力之上是认知力
  10. 如何才能招募更多合伙人?合伙人裂变的核心是什么?