Python记录9:函数4:名称空间作用域+闭包函数+装饰器
'''
一: 名称空间namespaces
名称空间就是存放名字与值绑定关系的内存空间 二: 名称空间分为三种
内置名称空间:
1. 特点: 存放是python解释器自带的名字,len,print
2. 生命周期: 解释器启动则产生,解释器关闭则销毁
全局名称空间
1. 特点: 存放是全局的名字(没有任何缩进\顶头定义的名字)
x=10
y=20
def func():
pass
print(x) if True:
x=1111
2. 生命周期: python文件执行时则创建,文件执行完毕则销毁
局部名称空间:
1. 特点: 在函数内定义的名字
2. 生命周期: 在函数调用时临时创建,函数调用完毕则立即销毁 三 名称空间总结:
1. 加载顺序:
先产生内置名称空间
再产生全局名称空间
如果调用函数则会临时局部名称空间 2. 名字的查找顺序:
从当前位置向上查找
def func():
# # len=2222
# print(len)
# len=1111
# func()
3. 函数的局部名称空间彼此隔离,但是全局名称空间与内置名称空间是所有函数共享的
4. 名称空间的嵌套关系是在函数定义(检测语法)就固定死的与调用位置无关,即无论在
何处调用函数都必须老老实实地按照定义阶段规定的嵌套关系去查找名字
'''
#示范一
# mmm=11111111111111
# # x='aaaa'
# def f1():
# x=1
# def f2():
# # x=2
# def f3():
# # x=3
# print(x)
# f3()
# f2()
#
#
# f1()
#
# def foo():
# xxx=1111
# print(mmm)
# print(len)
#
# def bar():
# yyy=2222
# print(mmm)
# print(len)
#
#
# foo()
# bar() #示范二
# def f1():
# # x=1111
# def f2():
# # x=333333333333333333333
# print('from f2',x)
# return f2
#
# xxx=f1()
# x='全局'
#
# def foo():
# x='foo'
# xxx()
#
# def bar():
# x='bar'
# xxx()
#
# def func():
# x='func'
# xxx()
#
#
# foo()
# bar()
# func() #示范三
# yyy=111
# def func():
# print(yyy)
# xxx=2222
#
# func() '''
全局作用域:内置名称空间+全局名称空间
特点:全局存活,全局有效
局部作用域:局部名称空间
特点:临时存活,函数内有效 '''
# 关键字: global
# 如果想要在局部修改全局名字对应的值是不可变类型时.必须在局部用global关键字加以声明
# x=111
# def func():
# global x
# x=222
#
# func()
# print(x) #如果想要在局部修改全局名字对应的值是可变类型时,直接修改即可
# l=[1,2,3]
# def func():
# l.append(4)
#
# func()
# print(l) # nonlocal
# x=2222
# def f1():
# x=1111
# def f2():
# # global x
# nonlocal x
# x=0
# f2()
# print('在f1内的x的值===>',x)
#
# f1()
# print(x) aaaaaa=1111111111111
# print(globals()) def func():
x=1
y=2
print(locals()) func()
'''
1. 什么是闭包函数=>函数嵌套+函数对象+名称空间与作用域
闭:定义在函数内的函数
包:该内部函数需要访问一个名字,该名字属于外层函数作用域的(强调:不是全局作用域)
2. 为何要用闭包函数
为了实现装饰器
3. 如何用闭包函数
def outter(xxx):
def inner():
xxx
return inner
'''
# def outter():
# xxx=111
# def inner():
# print(xxx)
# return inner
#
# f=outter()
# def foo():
# xxx=2222
# f()
# foo() # 为函数体传参的两种解决方案
# 方案一: 直接以参数的形式传入
# def func(xxx):
# print(xxx)
# func(111) #方案二:
def outter(xxx):
# xxx=111
def func():
print(xxx)
return func func=outter(111)
'''
1. 什么是装饰器
装饰器就是用来为被装饰的对象新增功能的工具/函数
被装饰的对象可以是任意可调用的对象
装饰器本事也可以是任意可调用的对象 2. 为何要用装饰器
开放封闭原则:对修改封闭,对扩展开放
也就是不可以修改源代码,而对原有的功能进行扩展
装饰器需要遵循的原则:
1. 不能修改被装饰对象的源代码
2. 不能修改被装饰对象的调用方式 装饰器的目标:就是要在遵循原则1和2的前提下,为被装饰对象新增功能 3. 如何实现装饰器 '''
# # 阶段一:
###计算出一段程序执行的时间并打印出来
# import time
# def index():
# time.sleep(1)
# print('welcome to index page')
#
# start=time.time()
# index()
# stop=time.time()
# print('run time is %s' %(stop - start)) # # 阶段二:
# import time
# def index():
# time.sleep(1)
# print('welcome to index page')
#
# def wrapper():
# start=time.time()
# index()
# stop=time.time()
# print('run time is %s' %(stop - start)) # wrapper() # # 阶段三:
# import time
#
# def index():
# time.sleep(1)
# print('welcome to index page')
#
# def wrapper(func):
# start=time.time()
# func()
# stop=time.time()
# print('run time is %s' %(stop - start))
#
# wrapper(index) # 阶段四:
# import time
#
# def index():
# time.sleep(1)
# print('welcome to index page')
#
# def timmer(func):
# # func=最原始那个index的内存地址
# def wrapper():
# start=time.time()
# func()
# stop=time.time()
# print('run time is %s' %(stop - start))
# return wrapper
#
# index=timmer(index) #index=wrapper的内存地址
# index() #wrapper() #############################################################################################################
# 装饰器语法糖
# 在被装饰器对象正上方单独一行写: @装饰器的名字
# 解释器一旦执行到@装饰器的名字就会: 原函数名=装饰器的名字(正下方那个函数) # import time
#
# def timmer(func):
# # func=最原始那个index的内存地址
# def wrapper():
# start=time.time()
# func()
# stop=time.time()
# print('run time is %s' %(stop - start))
# return wrapper
#
# @timmer #index=timmer(index) #index=wrapper的内存地址
# def index():
# time.sleep(1)
# print('welcome to index page')
#
# index() #wrapper() # 装饰器修订:
# import time
#
# def timmer(func):
# # func=最原始那个index的内存地址
# def wrapper(*args,**kwargs):
# start=time.time()
# res=func(*args,**kwargs)
# stop=time.time()
# print('run time is %s' %(stop - start))
# return res
# return wrapper
#
# @timmer #index=timmer(最原始那个index的内存地址) #index=wrapper的内存地址
# def index():
# time.sleep(1)
# print('welcome to index page')
#
#
# @timmer # home=timmer(最原始那个home的内存地址) #home=wrapper的内存地址
# def home(name):
# time.sleep(2)
# print('welcome %s to home page' %name)
# return 11111
#
# res=index() #wrapper()
# print('index====>',res)
# res=home('egon') #wrapper('egon')
# print('home====>',res) 装饰器补充:
import time
from functools import wraps def timmer(func):
@wraps(func)
def wrapper(*args,**kwargs):
start=time.time()
res=func(*args,**kwargs)
stop=time.time()
print('run time is %s' %(stop - start))
return res
# wrapper.__doc__=func.__doc__
# wrapper.__name__=func.__name__
return wrapper # @timmer #index=timmer(最原始那个index的内存地址) #index=wrapper的内存地址
def index():
"""
这是一个index函数
:return:
"""
time.sleep(1)
print('welcome to index page') # index() #wrapper() # print(help(index)) #print(index.__doc__)
# print(index.__doc__) # print(help(index)) #print(wrapper.__doc__)
print(index.__name__)
Python记录9:函数4:名称空间作用域+闭包函数+装饰器的更多相关文章
- Day11名称空间,作用域,闭包函数
Day11 1.函数对象: ①可以被引用 ②可以作为另一个函数的参数 ③可以作为另一个函数的返回值0 ④可以被存储到容器类型中 2.函数嵌套: ①嵌套调用:在一个函数中调用了另一个函数 ...
- python12--字符串的比较 函数的默认值的细节 三元表达式 函数对象 名称空间 作用域 列表与字典的推导式 四则运算 函数的嵌套
复习 1.字符串的比较; 2.函数的参数; ******实参与形参的分类: 3.函数的嵌套调用: # 字符串的比较# -- 按照从左往右比较每一个字符,通过字符对应的ascii进行比较 ...
- 【Python 函数对象 命名空间与作用域 闭包函数 装饰器 迭代器 内置函数】
一.函数对象 函数(Function)作为程序语言中不可或缺的一部分,但函数作为第一类对象(First-Class Object)却是 Python 函数的一大特性. 那到底什么是第一类对象(Firs ...
- day 12 名称空间和闭包函数
函数嵌套 按照函数的两个阶段分为: 嵌套调用:在一个函数内部调用另一个函数 嵌套定义:在一个函数内部定义另一个函数 名称空间(namespace):存储名字的内存区域 名称空间的分类: 内置名称空间: ...
- Python函数名做参数,闭包,装饰器
简单讲解闭包的写法和应用,在这之前,先声明,你定义的任意一个函数都可以作为其他函数的参数.就像下面这段代码的参数func,接收的参数就是一个函数名,在函数体内部使用了func()调用执行函数. 请看下 ...
- python_函数名的应用、闭包、装饰器
0.动态传参内容补充: 0.1 单纯运行如下函数不会报错. def func1(*args,**kwargs): pass func1() 0.2 *的魔性用法 * 在函数定义的时候,代表聚合. *在 ...
- 13、python中的函数(闭包与装饰器)
一.嵌套函数 函数的内部又再定义另一个函数,这个函数就叫嵌套函数,里面含函数就叫内部函数. 示例: 二.返回函数 函数可以接收函数对象作为参数,同理函数也能返回一个函数对象作为返回值. 示例: 返回函 ...
- Python之闭包and装饰器
闭包和装饰器是Python中非常重要的一种语法格式,在日常工作中应用非常广泛. 首先,我先为大家简单的介绍一下闭包的概念. 闭包:闭包是在函数嵌套的基础上,内层函数使用到外层函数的变量,且外层函数返回 ...
- Python入门之函数的嵌套/名称空间/作用域/函数对象/闭包函数
本篇目录: 一.函数嵌套 二.函数名称空间与作用域 三.函数对象 四.闭包函数 ============================================================ ...
随机推荐
- bash计算上下行数据差值
for i in {1..60000}; do echo "`date +'%F %T'` `df /dev/md0 | grep 'data1'` "; sleep 1; don ...
- SQL 性能分析
SELECT s2.dbid, s1.sql_handle, (SELECT TOP SUBSTRING(s2.text,statement_start_offset / + , ( (CASE WH ...
- 手动安装mysql
需要在本机(mac)上装个mysql,看到压缩版的体积最小,结果进入了手工安装的坑(正常有界面可以安装,但安装目录将是/usr/local/mysql),既然入了坑就填上吧. 1.解压到自己选择的目录 ...
- 再整合ssh时,关于Spring IOC注入问题
No matching editors or conversion strategy found IOC问题: EmpService bean 实现了 Iemp接口,就不能直接作为参数传入Action ...
- OpenGL 获取当前屏幕坐标的三维坐标(gluUnProject使用例子 Qt)
之前使用VS+glut实现了gluUnProject使用例子,用于渲染管道的逆过程,将屏幕坐标转换为opengl三维坐标,本文将尝试使用QT来实现. 代码如下: main.cpp 12345678 ...
- 并发编程基础之ThreadLocal
一:概念 在多线程并发访问的情况下,为了解决线程安全,一般我们会使用synchronized关键字,如果并发访问量不是很大,可以使用synchronized, 但是如果数据量比较大,我们可以考虑使用T ...
- a,abbr,address,area,article, aside, audio标签文档
<a>标签 download属性 <!-- 下载hello.txt --> <a href="test.txt" download="hel ...
- init_ir_技术实现篇
1. 中断的初始化 中断向量号是8位的,那么它一共有256项(0-255),所以中断描述符表最多只有256项,中断向量表也是256项. 对于不同的中断,在中断初始化和中断处理过程中,其处理方式是不一样 ...
- 解决vscode更新后Ext Js插件无法使用问题
解决方案来至于https://www.sencha.com/forum/showthread.php?471410-Bug-in-VS-Code-Plugin-since-VS-Code-Update ...
- I - All X
F(x,m) 代表一个全是由数字x组成的m位数字.请计算,以下式子是否成立: F(x,m) mod k ≡ c Input 第一行一个整数T,表示T组数据. 每组测试数据占一行,包含四个数字x,m,k ...