Python 装饰器

一、作用域

Python 的作用域分四种情况:

L:local,局部作用域,即函数中定义的变量;

E:enclosing,嵌套的父级函数的局部作用域,即包含此函数的上级函数的局部作用域,但不是全局的;

G:globa,全局变量,就是模块级别定义的变量;

B:built-in,系统固定模块里面的变量,比如int, bytearray等。

搜索变量的优先级顺序依次是:作用域局部>外层作用域>当前模块中的全局>python内置作用域

实例:

def out():
name = 'Ami'
def inner():
name = 'Amily'
print(name)
inner()
print(name)

out()
#内嵌函数作用域由内而外查找
输出结果:

 

可以看到内嵌函数可以访问外部函数定义的作用域中的变量,事实上内嵌函数解析名称时首先检查局部作用域,

然后从最内层调用函数的作用域开始,搜索所有调用函数的作用域,它们包含非局部但也非全局的命名。

二、装饰器

装饰器的本质还是一个函数,在不改变函数调用方式的情况下,对函数进行额外功能的封装

装饰一个函数,给它加一个其他功能

 

功能:1.引入日志;2.函数执行时间统计;3.执行函数前预备处理;4.执行函数后清理功能;5.权限校验;6.缓存

 

常见实例:给函数加上时间

import time
import random

def cal_time(func):#定义一个计时器,传入一个函数,并返回另一个附加了计时功能的方法
def wrapper(*args, **kwargs):#定义一个内嵌的包装函数,给传入的函数加上计时功能的包装
t1 = time.time()
result = func(*args, **kwargs)
t2 = time.time()
print("%s running time: %s secs." % (func.__name__, t2 - t1))
return result
return wrapper # 将包装后的函数返回

@cal_time #@cal_time == cal_time(bin_search)
def bin_search(data_set, val):
low = 0
high = len(data_set) - 1
while low <= high:
mid = (low+high)//2
if data_set[mid] == val:
return mid
elif data_set[mid] < val:
low = mid + 1
else:
high = mid - 1
return
函数调用:
data = list(range(100000000))
print(bin_search(data, 173320))
创建一个装饰器将下面函数输入的字符串首字母大写
from functools import wraps
def start_word_upper(func):
@wraps(func)
def inner(*args,**kwargs):
word = func(*args,**kwargs)
return word.capitalize()
return inner

@start_word_upper
def greetins(word='hi there'):
return word.lower()

result = greetins('hello python')
print(result)
输出结果:Hello python

posted @ 2018-04-18 12:46  我家小海星  Views(241)  Comments(0Edit  收藏  举报