浅谈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 25 Python
Python 的 with 语句详解
Jun 13 Python
Python标准库urllib2的一些使用细节总结
Mar 16 Python
python使用xlrd与xlwt对excel的读写和格式设定
Jan 21 Python
tensorflow学习笔记之简单的神经网络训练和测试
Apr 15 Python
在python 中split()使用多符号分割的例子
Jul 15 Python
关于Python-faker的函数效果一览
Nov 28 Python
mac使用python识别图形验证码功能
Jan 10 Python
python图形开发GUI库pyqt5的基本使用方法详解
Feb 14 Python
tensorflow 实现数据类型转换
Feb 17 Python
Flask response响应的具体使用
Jul 15 Python
python实现简单石头剪刀布游戏
Oct 24 Python
Python-OpenCV教程之图像的位运算详解
Python中的套接字编程是什么?
教你如何使用Python开发一个钉钉群应答机器人
详解Python requests模块
Jun 21 #Python
Python pandas读取CSV文件的注意事项(适合新手)
python简单验证码识别的实现过程
Python pygame实现中国象棋单机版源码
You might like
PHP中让curl支持sock5的代码实例
2015/01/21 PHP
php实现购物车功能(下)
2016/01/05 PHP
浅谈Laravel队列实现原理解决问题记录
2017/08/19 PHP
Prototype 工具函数 学习
2009/07/23 Javascript
jquer之ajaxQueue简单实现代码
2011/09/15 Javascript
JavaScript在多浏览器下for循环的使用方法
2012/11/07 Javascript
javascript字符串替换及字符串分割示例代码
2013/12/12 Javascript
js调用iframe实现打印页面内容的方法
2014/03/04 Javascript
javascript 对象数组根据对象object key的值排序
2015/03/09 Javascript
浅谈Node.js中的定时器
2015/06/18 Javascript
js实现的在线调色板功能完整实例
2016/12/21 Javascript
vue.js事件处理器是什么
2017/03/20 Javascript
jQuery+Ajax实现用户名重名实时检测
2017/06/01 jQuery
详解用node.js实现简单的反向代理
2017/06/26 Javascript
BootStrap模态框和select2合用时input无法获取焦点的解决方法
2017/09/01 Javascript
详解开源的JavaScript插件化框架MinimaJS
2017/10/26 Javascript
jQuery实现checkbox的简单操作
2017/11/18 jQuery
使用JS获取SessionStorage的值
2018/01/12 Javascript
使用Vue Composition API写出清晰、可扩展的表单实现
2020/06/10 Javascript
vue3+typescript实现图片懒加载插件
2020/10/26 Javascript
python smtplib发送带附件邮件小程序
2018/05/22 Python
利用Pycharm断点调试Python程序的方法
2018/11/29 Python
Python实现 PS 图像调整中的亮度调整
2019/06/28 Python
在PyCharm中控制台输出日志分层级分颜色显示的方法
2019/07/11 Python
python导包的几种方法(自定义包的生成以及导入详解)
2019/07/15 Python
python GUI库图形界面开发之PyQt5多线程中信号与槽的详细使用方法与实例
2020/03/08 Python
python virtualenv虚拟环境配置与使用教程详解
2020/07/13 Python
python 数据类型强制转换的总结
2021/01/25 Python
全球酒店预订网站:Hotels.com
2016/08/10 全球购物
Canal官网:巴西女性时尚品牌
2019/10/16 全球购物
一些PHP的面试题
2015/05/06 面试题
安全生产宣传标语
2014/06/06 职场文书
2015年干部教育培训工作总结
2015/05/15 职场文书
诺贝尔奖获得者名言100句:句句启人心智,值永久收藏
2019/08/09 职场文书
小型企业的绩效考核制度模板
2019/11/21 职场文书
win10电脑老是死机怎么办?win10系统老是死机的解决方法
2022/08/05 数码科技