码迷,mamicode.com
首页 > 编程语言 > 详细

Python 装饰器

时间:2018-04-18 13:35:57      阅读:168      评论:0      收藏:0      [点我收藏+]

标签:img   ecs   port   封装   pre   set   wrapper   image   图片   

一、作用域

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()
#内嵌函数作用域由内而外查找
输出结果:

 技术分享图片

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

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

二、装饰器

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

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

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

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))


Python 装饰器

标签:img   ecs   port   封装   pre   set   wrapper   image   图片   

原文地址:https://www.cnblogs.com/chendai21/p/8863624.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!