浅谈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

标签:Python,全局与局部变量,装饰器
0
投稿

猜你喜欢

  • Python从零开始创建区块链

    2021-02-12 12:21:14
  • linux环境下安装python虚拟环境及注意事项

    2023-12-09 08:02:47
  • JDBC-idea导入mysql连接java的jar包(mac)的方法

    2024-01-22 22:51:08
  • Asp.net清空控件值的方法(可自定义控件类型)

    2023-07-22 23:23:16
  • Python.append()与Python.expand()用法详解

    2022-01-22 20:51:42
  • Python测试线程应用程序过程解析

    2023-09-11 03:04:25
  • 对python函数签名的方法详解

    2021-09-22 10:14:25
  • Django中的ajax请求

    2022-10-19 10:28:14
  • Python中列表list以及list与数组array的相互转换实现方法

    2023-08-24 06:30:15
  • SEO与“nofollow”及“external nofollow”

    2007-12-15 09:31:00
  • sqlserver 动态创建临时表的语句分享

    2012-01-29 17:54:37
  • python归并排序算法过程实例讲解

    2023-12-02 23:28:06
  • Echarts利用多X轴实现七天天气预报效果的示例代码

    2024-03-11 10:33:05
  • Python装饰器使用你可能不知道的几种姿势

    2023-01-23 23:56:09
  • Cython处理C字符串的示例详解

    2021-12-03 01:17:27
  • mysql数据库锁的产生原因及解决办法

    2024-01-20 14:09:46
  • Django使用Mysql数据库已经存在的数据表方法

    2023-07-21 15:24:59
  • NumPy 如何生成多维数组的方法

    2022-06-26 20:40:51
  • MySQL索引概念及七种索引类型分享介绍

    2024-01-23 03:55:27
  • BootStrap实现响应式布局导航栏折叠隐藏效果(在小屏幕、手机屏幕浏览时自动折叠隐藏)

    2023-08-29 17:16:11
  • asp之家 网络编程 m.aspxhome.com