浅谈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遍历文件夹并删除特定格式文件的示例
Mar 05 Python
pymongo实现多结果进行多列排序的方法
May 16 Python
python登录豆瓣并发帖的方法
Jul 08 Python
简单谈谈Python中的闭包
Nov 30 Python
python扫描proxy并获取可用代理ip的实例
Aug 07 Python
Python编程实现的简单神经网络算法示例
Jan 26 Python
python3+PyQt5使用数据库窗口视图
Apr 24 Python
python 列表,数组和矩阵sum的用法及区别介绍
Jun 28 Python
详解基于django实现的webssh简单例子
Jul 17 Python
Django自定义用户登录认证示例代码
Jun 30 Python
PyCharm更改字体和界面样式的方法步骤
Sep 27 Python
Python3批量创建Crowd用户并分配组
May 20 Python
Python-OpenCV教程之图像的位运算详解
Python中的套接字编程是什么?
教你如何使用Python开发一个钉钉群应答机器人
详解Python requests模块
Jun 21 #Python
Python pandas读取CSV文件的注意事项(适合新手)
python简单验证码识别的实现过程
Python pygame实现中国象棋单机版源码
You might like
深入HTTP响应状态码速查表的详解
2013/06/07 PHP
eaglephp使用微信api接口开发微信框架
2014/01/09 PHP
PHP判断数据库中的记录是否存在的方法
2014/11/14 PHP
wordpress安装过程中遇到中文乱码的处理方法
2015/04/21 PHP
Yii2中设置与获取别名的函数(setAlias和getAlias)用法分析
2016/07/25 PHP
基于JavaScript实现全屏透明遮罩div层锁屏效果
2016/01/26 Javascript
图文详解Heap Sort堆排序算法及JavaScript的代码实现
2016/05/04 Javascript
JS/jQ实现免费获取手机验证码倒计时效果
2016/06/13 Javascript
Javascript点击其他任意地方隐藏关闭DIV实例
2016/06/21 Javascript
JavaScript中的事件委托及好处
2016/07/12 Javascript
node.js实现博客小爬虫的实例代码
2016/10/08 Javascript
用 js 的 selection range 操作选择区域内容和图片
2017/04/18 Javascript
详解vue-cli + webpack 多页面实例应用
2017/04/25 Javascript
利用jQuery异步上传文件的插件用法详解
2017/07/19 jQuery
vue 插值 v-once,v-text, v-html详解
2018/01/19 Javascript
axios 处理 302 状态码的解决方法
2018/04/10 Javascript
vue实现固定位置显示功能
2019/05/30 Javascript
微信小程序HTTP接口请求封装代码实例
2019/09/05 Javascript
深入理解 TypeScript Reflect Metadata
2019/12/12 Javascript
Node.js API详解之 zlib模块用法分析
2020/05/19 Javascript
详解JavaScript中的this指向问题
2021/02/05 Javascript
[47:42]Fnatic vs Liquid 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
ptyhon实现sitemap生成示例
2014/03/30 Python
PyChar学习教程之自定义文件与代码模板详解
2017/07/17 Python
python获取文件真实链接的方法,针对于302返回码
2018/05/14 Python
python 统计一个列表当中的每一个元素出现了多少次的方法
2018/11/14 Python
python读取.mat文件的数据及实例代码
2019/07/12 Python
Python 网络编程之UDP发送接收数据功能示例【基于socket套接字】
2019/10/11 Python
Python函数参数类型及排序原理总结
2019/12/19 Python
matplotlib 曲线图 和 折线图 plt.plot()实例
2020/04/17 Python
python 如何在测试中使用 Mock
2021/03/01 Python
jupyter notebook指定启动目录的方法
2021/03/02 Python
css3设置box-pack和box-align让div里面的元素垂直居中
2014/09/01 HTML / CSS
健康家庭事迹材料
2014/05/02 职场文书
新教师个人总结
2015/02/06 职场文书
关于清明节的演讲稿2015
2015/03/18 职场文书