浅谈Python从全局与局部变量到装饰器的相关知识
作者:Jeff1068 发布时间:2022-06-02 12:23:26
全局变量与局部变量
# 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()
对于装饰器,加入内部函数参数[,收集参数],可以实现更多的功能
另外还有参数化装饰器,叠放装饰器,完善装饰器,以及一些内置装饰器可以用来更深度的学习
来源:https://blog.csdn.net/jeff1068/article/details/117927323


猜你喜欢
- 如下所示:import cv2import os#图片路径im_dir = '/home/suanfa/data/out/20170
- 一 前言pandas学到分组迭代,那么基础的pandas系列就学的差不多了,自我感觉不错,知识追寻者用pandas处理过一些数据,蛮好用的;
- 读写中文需要读取utf-8编码的中文文件,先利用sublime text软件将它改成无DOM的编码,然后用以下代码:with codecs.
- 在python3.x中,可以使用pymysql来MySQL数据库的连接,并实现数据库的各种操作,本次博客主要介绍了pymysql的安装和使用
- turtle(海龟)是Python重要的标准库之一,它能够进行基本的图形绘制。turtle图形绘制的概念诞生于1969年,成功应用于LOGO
- 这篇文章主要介绍了python集合删除多种方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可
- (1)应用于客户需要与不同的数据源进行交互时。数据可能来自不同的数据库,他们都有各自不同的复杂格式。但客户与这些数据库间只通过一种标准语言进
- Python 模块EasyGui详细介绍前言:在Windows想用Python开发一些简单的界面,所以找到了很容易上手的EasyGui库。下
- date() 获取日期,格式:2004-2-28 time() 获取时间,格式:22:24:59 now() 获取日期和时间 格式: 200
- 最近由于公司有一个向谷歌网站上传文件的需求,需要进行web的自动化测试,选择了selenium这个自动化测试框架,以前没有接触过这门技术,所
- 用 Python 做一件很平常的事情: 打开文件, 逐行读入, 最后关掉文件; 进一步的需求是, 这也许是程序中一个可选的功能, 如果有任何
- 问题描述当前使用的PyCharm社区版版本号2022.1.2,配置镜像源时,没有manage repositories解决方案:镜像源:清华
- 因此,在数据库的日常维护工作中,如果只是一次两次碰到ORA-01555错误,一般都先忽略,但是如果经常碰到该错误,则要进行一些调整以避免该错
- 所使用python环境为最新的3.6版本Python中几种对文件的操作方法:将A文件复制到B文件中去(保持原来格式)读取文件中的内容,返回L
- 本文实例为大家分享了python3实现名片管理系统的具体代码,供大家参考,具体内容如下系统主要是:1.新增名片 2.显示全部 3.查询名片
- 一、持续集成简介持续集成:Continuous Integration简单来说就是指,程序员在开发代码的过程中,可以频繁的将代码部署到主干上
- 解决方法之一:如果pytorch在进行model.cuda()操作需要花费的时间很长,长到你怀疑GPU的速度了,那就是不正常的。如果你用的p
- FCKeditor的样式设置涉及到了两个文件,一个是你定义好的样式表文件.css,另一个是告诉fck样式表如何使用的xml文件,两个文件确一
- 1. 前言邮件,作为最正式规范的沟通方式,在日常办公过程中经常被用到我们都知道 Python内置了对 SMTP 的支持,可以发送纯文本、富文
- 第一部分:UI界面设计界面效果图如下:ui文件(可拉动控件自行创建一个button和text)<?xml version="