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入门之函数的嵌套/名称空间/作用域/函数对象/闭包函数
本篇目录: 一.函数嵌套 二.函数名称空间与作用域 三.函数对象 四.闭包函数 ============================================================ ...
随机推荐
- 大话前端解析Json对象
一.对于标准的json对象如: var result=[{"flag":1,"macId":"2","mbId":0,& ...
- Spring配置动态数据源-读写分离和多数据源
在现在互联网系统中,随着用户量的增长,单数据源通常无法满足系统的负载要求.因此为了解决用户量增长带来的压力,在数据库层面会采用读写分离技术和数据库拆分等技术.读写分离就是就是一个Master数据库,多 ...
- Windows 性能监视器的基本指标说明(CPU,内存,硬盘参数)
[转]Windows 性能监视器的基本指标说明(CPU,内存,硬盘参数) 作为一个系统工程师来说,要看懂监控的数据至关重要,关系着优化和分析出现的问题.我是在运维过程中要用到的.因此,今天给出Wind ...
- MA5680T OLT管理软件,全智能判断板卡,无人值守策略,根据光猫类型自动扫描添加光猫
轻量型的ONU查询工具,智能查询板卡,查询自动发现,搜索ONU等功能,需要更多智能功能,可联系QQ:561454825 下载地址:下载地址1
- 【ERROR】no matching function for call to 'std::basic_ifstream<char>::basic_ifstream
错误记录:QT中使用 no matching function for call to 'std::basic_ifstream<char>::basic_ifstream(QString ...
- cdh 安装调研
解决:No module named site http://blog.csdn.net/amgang/article/details/7030642 因为安装greenplum导致yum报如下错误: ...
- ssh: connect to host xx.xx.xxx.xxx port 22: Connection refused
执行 ssh root@47.94.142.215 报错 首先要开启ssh 系统偏好设置-共享 选上远程登陆 选上远程管理 检测openssh-server是否安装成功 ,安装成功的如下 ps -e ...
- phpadmin dvwa sqli-labs xsser.me
下载phpadmin,安装后网站根目录 phpStudy\PHPTutorial\WWW 将下载的dvwa文件夹放到该目录下,修改config/config.inc.php文件中的mysql连接信息. ...
- python基础类型—字典
字典 字典是python中唯一的映射类型,采用键值对(key-value)的形式存储数据.python对key进行哈希函数运算,根据计算的结果决定value的存储地址,所以字典是无序存储的,且key必 ...
- vue中key的作用 v-for里警告 v-if的复用
vue总是会复用页面上已经存在的dom,区别的方法是加上key就可以,还设有v-for时候的警告也是如此key的作用是区别这条跟那条的.<body> <div id="ap ...