python装饰器之函数作用域
1.函数作用域LEGB
L:local函数内部作用域
E:enclosing函数内部与内嵌函数之间
G:global全局作用域
B:build-in内置作用域
passline = 60
def func(val):
passline = 90
if 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#
def func(val):
print('%x'%id(val))
passline = 90
if val >= passline:
print('pass')
else:
print('failed')
def in_func():#(val,)
print(val)
in_func()
return in_func f = 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 = 90
if val >= passline:
print('%d pass'%val)
else:
print('failed') def func_100(val):
passline = 60
if 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 0
for val in arg:
if not isinstance(val, int):
return 0
return 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, ''))
print(my_averge(1, 2, 3, 4, 5))
my_averge = dec(my_averge)
print(my_averge(1, 2, 3, 4, 5, ''))
('in dec arg = ', (1, 2, 3, 4, 5))
in my_sum
15
('in dec arg = ', (1, 2, 3, 4, 5, ''))
0
in my_averge
3
('in dec arg = ', (1, 2, 3, 4, 5, ''))
0
[Finished in 0.0s]
3.装饰器
1:装饰器用来装饰函数
2:返回一个函数对象
3:被装饰函数标识符指向返回的函数对象
4:语法糖 @deco
def dec(func):
print('call dec')
def in_dec(*arg):#my_sum
print('in dec arg = ', arg)
if len(arg) == 0:
return 0
for val in arg:
if not isinstance(val, int):
return 0
return func(*arg)
return in_dec @dec
def my_sum(*arg):#my_sum = in_dec
print('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]
python装饰器之函数作用域的更多相关文章
- Python装饰器之functools.wraps的作用
# -*- coding: utf-8 -*- # author:baoshan def wrapper(func): def inner_function(): pass return inner_ ...
- python基础11_函数作用域_global_递归
看到了一个16进制转换的小知识点,就验证了一下运行结果. #!/usr/bin/env python # coding:utf-8 # 看到了16进制转换的问题.顺便验证一下. a = 255 b = ...
- python 装饰器函数基础知识
1.装饰器的本质--一个闭包函数 2.装饰器的功能--在不改变原函数及其调用方式情况下对原函数功能进行拓展 3.带参数和返回值的装饰器 def timer(func): @wraps(func) #使 ...
- Python装饰器之 property()
1. 何为装饰器? 官方定义:装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志.性能测试.事务处理等.装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量函数 ...
- Python 装饰器之 functools.wraps
在看 Bottle 代码中看见 functools.wraps 这种用法. def make_default_app_wrapper(name): """ Return ...
- python 装饰器之应用示例
import time import hashlib import pickle import threading #装饰函数缓存应用 cache ={} def is_obsolete(entry, ...
- python学习-26 函数作用域
举例说明: 1. name = 'john' def foo(): name = 'xiaomming' def bar(): print(name) return bar a=foo() print ...
- python装饰器之使用情景分析
http://blog.csdn.net/yueguanghaidao/article/details/10089181
- python基础篇_004_装饰器函数
python装饰器函数 1.装饰器函数引导 功能:计算函数执行时长 import time """ 方式一: 函数首位添加时间,差值就是函数执行时间 缺点:每个函数都要加 ...
随机推荐
- 用logstash 作数据的聚合统计
用logstash 作数据的聚合统计 以spark-streaming 处理消费数据,统计日志经spark sql存储在mysql中 日志写入方式为append val wordsDataFrame ...
- js之意想不到的结果
js 是弱类型语言 ,在进行计算时 如果遇到不能计算的单位,就会进行默认转换 1.typeof NaN 结果为 “number” 原因:NaN 表示 不是不是一个数字(Not a Number), ...
- VSTO外接程序项目只用1个文件实现Ribbon CustomUI和CustomTaskpane定制【C#版】
VSTO中的自定义功能区和自定义任务窗格需要用到各种命名空间.添加所需文件,才能实现.后来我发现可以把所有代码都写在ThisAddin.cs这个默认文件中. 大家可以在Visual Studio中创建 ...
- Redis为什么这么快以及持久化机制
1.首先我们谈一下为什么Redis快: 一. Redis是纯内存数据库,一般都是简单的存取操作,线程占用的时间很多,时间的花费主要集中在IO上,所以读取速度快. 二. 再说一下IO,Redis使用的是 ...
- EncryptUtils
package me.zhengjie.core.utils; import org.springframework.util.DigestUtils; import javax.crypto.Cip ...
- CAS 5.3.x 相关信息
CAS 5.3.x 相关信息 单点登录系统 学习网站: https://www.apereo.org/projects/cas 官方网站 https://github.com/apereo/cas-o ...
- css样式表---样式表分类、选择器
一.样式表分三类: 1.内联样式表.——放在元素的开始标记中.——只对当前元素起作用.<input name="txt" style="border:0px; bo ...
- Java子类和父类的初始化执行顺序
要明白子类和父类的初始化执行顺序,只需要知晓以下三点,就不会再弄错了. 1.创建子类对象时,子类和父类的静态块和构造方法的执行顺序为:父类静态块->子类静态块->父类构造器->子类构 ...
- MAYA 卸载工具,完美彻底卸载清除干净maya各种残留注册表和文件
是不是遇到MAYA/CAD/3DSMAX/INVENTOR安装失败?AUTODESK系列软件着实令人头疼,MAYA/CAD/3DSMAX/INVENTOR安装失败之后不能完全卸载!!!(比如maya, ...
- leetcode第23题:合并K个排序链表
首先我想到的是采用一般递归法,将K个链表合并化为(k-1)两个链表合并 class Solution: def mergeKLists(self, lists: List[ListNode]) -&g ...