浅谈Python从全局与局部变量到装饰器的相关知识


Posted in Python onJune 21, 2021

全局变量与局部变量

# num1是全局变量
num1 = 1

# num2是局部变量
def func():
	num2 = 2

在函数外(且不在函数里)定义的变量是全局变量;
在函数里定义的变量是局部变量。

在函数外无法引用局部变量,但在函数里面可以引用全局变量,不过需要注意的是,一般函数里不能修改全局变量,如果在函数里修改全局变量,那么python会自动创建一个与之名字相同的变量,使用global关键字可以将局部变量变为全局变量,进而修改。

# 这是全局变量
 num1 = 1
 
 # 函数里的num1是局部变量
 def func1():
	num1 = 2

 #调用函数
 func1()
 
 # 输出num1来验证全局变量是否改变
 print(num1)
 # 输出为1

 # 定义局部变量num2 
 def func2():
	num2 = 2

# 尝试在函数外引用局部变量
 print(num2)
 # 输出:NameError: name 'num2' is not defined
 
  # 在函数里引用全局变量
 def func3():
	print(num1)

 # 调用函数
 func3()
# 输出:1

 # 使用global关键字来修改局部变量
 def func4():
	global num1
	num1 = 2

 # 调用函数
 func4()

 # 验证num1是否被修改
 print(num1)
 # 输出为2

内嵌函数

# 在函数内部定义另一个函数,这种函数称为内嵌函数或者内部函数
def func1(): 
	num1 = 1
	def func2():
		num2 = 2
 # num1和num2都是局部变量
 # 我们称func2是内部函数,而func1是外部函数
  # 内部函数的作用域在整个外部函数里面,且内部函数可以引用外部函数里的局部变量

LEGB原则:
• L-Local:函数内的名字空间。
• E-Enclosing function locals:嵌套函数中外部函数的名字空间。
• G-Global:函数定义所在模块的名字空间。
• B-Builtin:Python内置模块的名字空间。
变量的查找顺序依次是L→E→G→B。

内部函数中,只能对外部函数的局部变量进行访问,但一般不能进行修改。(这一点和全局变量与局部变量一样),使用nonlocal关键字可以进行修改

闭包

Python中的闭包:封闭环境中的函数
定义:如果在一个内部函数里,对在外部作用域但不是在全局作用域的变量进行引用(简言之:就是在嵌套函数的环境下,内部函数引用了外部函数的局部变量),那么内部函数就被认为是闭包
注:因为闭包的概念是由内部函数而来,所以不能在外部函数以外的地方对内部函数进行调用。

def func1():
	num1 = 1
	def func2():
		print(num1)
	return func2

func3 = func1()
func3()

闭包的作用:为了尽可能地避免使用全局变量,闭包允许将函数与其所操作的某些数据(环境)关联起来,这样外部函数就为内部函数构成了一个封闭的环境

装饰器

装饰器:在Python中装饰器(decorator)的功能是将被装饰的函数当作参数传递给与装饰器对应的函数(名称相同的函数),并返回包装后的被装饰的函数。

def func1(func2):
	def func3():
		print("程序开始执行 ")
		func2()
		print("程序结束执行")
	return func3 # **必须返回函数,如果后面加括号,那么内部返回的函数会直接执行**
def func4():
	print("hello world")
func4 = func1(func4)
func4()
# 输出:
'''程序开始执行 
hello world
程序结束执行'''

大多数装饰器会定义内部函数,但是为了方便,也可以不在内部定义函数,而是直接让装饰器返回原来的函数。但当我们定义的函数中有参数时,就必须在内部定义一个函数。但建议使用内部函数,因为内部函数内的代码不会在传递过程直接执行

@语法糖

@语法糖可以快速将原函数当成参数传递给外部函数并返回给与原函数名字相同的新函数

def func1(func2):
	def func3():
		print("程序开始执行 ")
		func2()
		print("程序结束执行")
	return func3 # **必须返回函数,如果后面加括号,那么内部返回的函数会直接执行**

@func1
def func4():
	print("hello world")
func4()

对于装饰器,加入内部函数参数[,收集参数],可以实现更多的功能
另外还有参数化装饰器,叠放装饰器,完善装饰器,以及一些内置装饰器可以用来更深度的学习

到此这篇关于浅谈Python从全局与局部变量到装饰器的相关知识的文章就介绍到这了,更多相关Python全局与局部变量到装饰器内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python读取ini文件、操作mysql、发送邮件实例
Jan 01 Python
python比较2个xml内容的方法
May 11 Python
将Python代码打包为jar软件的简单方法
Aug 04 Python
Python3学习笔记之列表方法示例详解
Oct 06 Python
python dict 相同key 合并value的实例
Jan 21 Python
python flask安装和命令详解
Apr 02 Python
Pandas DataFrame数据的更改、插入新增的列和行的方法
Jun 25 Python
Python zip函数打包元素实例解析
Dec 11 Python
使用PyTorch将文件夹下的图片分为训练集和验证集实例
Jan 08 Python
python 错误处理 assert详解
Apr 20 Python
matplotlib基础绘图命令之bar的使用方法
Aug 13 Python
anaconda3安装及jupyter环境配置全教程
Aug 24 Python
Python-OpenCV教程之图像的位运算详解
Python中的套接字编程是什么?
教你如何使用Python开发一个钉钉群应答机器人
详解Python requests模块
Jun 21 #Python
Python pandas读取CSV文件的注意事项(适合新手)
python简单验证码识别的实现过程
Python pygame实现中国象棋单机版源码
You might like
PHP网站提速三大“软”招
2006/10/09 PHP
php自动给文章加关键词链接的函数代码
2012/11/29 PHP
php中使用addslashes函数报错问题的解决方法
2013/02/06 PHP
php递归json类实例
2014/12/02 PHP
使用PHP免费发送定时短信的实例
2016/10/24 PHP
thinkPHP5.0框架验证码调用及点击图片刷新简单实现方法
2018/09/07 PHP
实例讲解php将字符串输出到HTML
2019/01/27 PHP
强悍无比的WEB开发好助手FireBug(Firefox Plugin)
2007/01/16 Javascript
jQuery创建自己的插件(自定义插件)的方法
2010/06/10 Javascript
JavaScript中获取未知对象属性的代码
2011/04/27 Javascript
Js如何判断客户端是PC还是手持设备简单分析
2012/11/22 Javascript
原生javascript实现Tab选项卡切换功能
2015/01/12 Javascript
JavaScript数据结构和算法之二叉树详解
2015/02/11 Javascript
手机浏览器 后退按钮强制刷新页面方法总结
2016/10/09 Javascript
js中获取键盘事件的简单实现方法
2016/10/10 Javascript
javascript replace()第二个参数为函数时的参数用法
2016/12/26 Javascript
vue2+el-menu实现路由跳转及当前项的设置方法实例
2017/11/07 Javascript
jQuery阻止事件冒泡实例分析
2018/07/03 jQuery
JS构造一个html文本内容成文件流形式发送到后台
2018/07/31 Javascript
vue.js 添加 fastclick的支持方法
2018/08/28 Javascript
vue-cli3.0使用及部分配置详解
2018/08/29 Javascript
[54:27]TNC vs Serenity 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
[47:45]DOTA2-DPC中国联赛 正赛 Phoenix vs Dragon BO3 第一场 2月26日
2021/03/11 DOTA
python实现的守护进程(Daemon)用法实例
2015/06/02 Python
利用Python将时间或时间间隔转为ISO 8601格式方法示例
2017/09/05 Python
Python内置模块logging用法实例分析
2018/02/12 Python
python斐波那契数列的计算方法
2018/09/27 Python
python 使用pdfminer3k 读取PDF文档的例子
2019/08/27 Python
解决django中form表单设置action后无法回到原页面的问题
2020/03/13 Python
python如何建立全零数组
2020/07/19 Python
python小技巧——将变量保存在本地及读取
2020/11/13 Python
Marlies Dekkers内衣法国官方网上商店:国际知名的荷兰内衣品牌
2019/03/18 全球购物
什么是表空间(tablespace)和系统表空间(System tablespace)
2013/02/25 面试题
国家领导干部党的群众路线教育实践活动批评与自我批评材料
2014/09/23 职场文书
2014年环境整治工作总结
2014/12/10 职场文书
Vue3如何理解ref toRef和toRefs的区别
2022/02/18 Vue.js