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

全局变量与局部变量

# 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全局与局部变量到装饰器内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Python中全局变量和局部变量的理解与区别

    前言 学过编程的人应该对全局变量与局部变量这两个名词并不陌生,Python也同多数编程语言一样,也有全局变量与局部变量的概念 但是与其他编程语言又有所不同 全局变量与局部变量两者的本质区别就是在于作用域 用通俗的话来理解的话, 全局变量是在整个py文件中声明,全局范围内都可以访问 局部变量是在某个函数中声明的,只能在该函数中调用它,如果试图在超出范围的地方调用,程序就爆掉了 如果在函数内部定义与某个全局变量一样名称的局部变量,就可能会导致意外的效果,可能不是你期望的.因此不建议这样使用,这样会使

  • Python3.5局部变量与全局变量作用域实例分析

    本文实例讲述了Python3.5局部变量与全局变量作用域.分享给大家供大家参考,具体如下: 1.局部变量与全局变量定义: 在子程序(函数)中定义的变量称为:局部变量:在程序顶级(一开始)定义的变量称为:全局变量. 2.局部变量与全局变量作用域: 局部变量作用域:定义该变量的子程序:全局变量作用域:整个程序. 当局部变量与全局变量同名时,在定义局部变量的子程序内局部变量其作用:其他地方全局变量起作用. #!/usr/bin/env python # -*- coding:utf-8 -*- # A

  • python函数局部变量、全局变量、递归知识点总结

    函数局部变量 全局变量 及其作用域 #简单类型(int str等)变量的局部变量与全局变量及其作用域的关系 name = "xxx" #第一级顶头定义的变量都称为全局变量,其作用域从变量定义的位置开始到此程序结束 def Print_Name(): print("name before change:", name) #由于name在此函数之前已经被定义为全局变量,此处函数读取变量name是读取的全局变量name "xxx",函数内部就不能再定义

  • 解析python的局部变量和全局变量

    局部变量 什么是局部变量 通俗定义:函数内部定义的变量就叫局部变量. 话不多说,代码如下: def test1(): a = 300 # 定义一个局部变量a,并初始化300 print("--test1--修改前:a=%s" % a) a = 200 # 给变量a重新赋值200 print("--test1--修改后:a=%s" % a) def test2(): a = 400 # 定义另一个局部变量a,并初始化400 print("--test2--修

  • Python全局变量与局部变量区别及用法分析

    本文实例讲述了Python全局变量与局部变量区别及用法.分享给大家供大家参考,具体如下: 对于很多初学的同学,对全局和局部变量容易混淆,看看下面给大家的讲解相信都应该明白两者的区别了. 定义: 全局变量:在模块内.在所有函数的外面.在class外面 局部变量:在函数内.在class的方法内 下面来看看例子 一.函数内部调用全局变量 a="hello" #全局变量a def test(): global a#调用全局变量a b =a #test方法里之后再调用a时,都是全局的a prin

  • 从局部变量和全局变量开始全面解析Python中变量的作用域

    理解全局变量和局部变量 1.定义的函数内部的变量名如果是第一次出现, 且在=符号前,那么就可以认为是被定义为局部变量.在这种情况下,不论全局变量中是否用到该变量名,函数中使用的都是局部变量.例如: num = 100 def func(): num = 123 print num func() 输出结果是123.说明函数中定义的变量名num是一个局部变量,覆盖全局变量.再例如: num = 100 def func(): num += 100 print num func() 输出结果是:Unb

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

    全局变量与局部变量 # num1是全局变量 num1 = 1 # num2是局部变量 def func(): num2 = 2 在函数外(且不在函数里)定义的变量是全局变量: 在函数里定义的变量是局部变量. 在函数外无法引用局部变量,但在函数里面可以引用全局变量,不过需要注意的是,一般函数里不能修改全局变量,如果在函数里修改全局变量,那么python会自动创建一个与之名字相同的变量,使用global关键字可以将局部变量变为全局变量,进而修改. # 这是全局变量 num1 = 1 # 函数里的nu

  • 浅谈Python中的全局锁(GIL)问题

    CPU-bound(计算密集型) 和I/O bound(I/O密集型) 计算密集型任务(CPU-bound) 的特点是要进行大量的计算,占据着主要的任务,消耗CPU资源,一直处于满负荷状态.比如复杂的加减乘除.计算圆周率.对视频进行高清解码等等,全靠CPU的运算能力.这种计算密集型任务虽然也可以用多任务完成,但是任务越多,花在任务切换的时间就越多,CPU执行任务的效率就越低,所以,要最高效地利用CPU,计算密集型任务同时进行的数量应当等于CPU的核心数. 计算密集型任务由于主要消耗CPU资源,因

  • 浅谈python函数之作用域(python3.5)

    1 基本概念 1.1 命名空间 (namespace) 命名空间是变量名到对象的映射(name -> obj).目前大多数的命名空间以类似于python字典的形式实现,实现形式在未来可能发生变化.命名空间举例:内置变量(内置函数abs, 内置的异常等),模块中的全局变量,函数调用时的局部变量.在某种意义上讲,对象的属性也形成一个命名空间.重要的是,不同的命名空间中的变量没有任何关联,两个不同的命名空间中可以包含相同的变量名. 命名空间有不同的创建时间和生命周期: •内置变量命名空间在python

  • 浅谈python和C语言混编的几种方式(推荐)

    Python这些年风头一直很盛,占据了很多领域的位置,Web.大数据.人工智能.运维均有它的身影,甚至图形界面做的也很顺,乃至full-stack这个词语刚出来的时候,似乎就是为了描述它. Python虽有GIL的问题导致多线程无法充分利用多核,但后来的multiprocess可以从多进程的角度来利用多核,甚至affinity可以绑定具体的CPU核,这个问题也算得到解决.虽基本为全栈语言,但有的时候为了效率,可能还是会去考虑和C语言混编.混编是计算机里一个不可回避的话题,涉及的东西很多,技术.架

  • 浅谈Python中函数的定义及其调用方法

    一.函数的定义及其应用 所谓函数,就是把具有独立功能的代码块组织成为一个小模块,在需要的时候调用函数的使用包含两个步骤 1.定义函数–封装独立的功能 2.调用函数–享受封装的成果 函数的作用:在开发时,使用函数可以提高编写的效率以及代码的重用'' 函数: 函数是带名字的代码块,用于完成具体的工作 需要在程序中多次执行同一项任务时,你无需反复编写完成该任务的代码,而只需调用该任务的函数,让python运行其中的代码,你将发现,通过使用函数,程序编写,阅读,测试和修复都将更容易 1.定义函数 def

  • 浅谈Python中文件夹和python package包的区别

    pycharm右键新建时会有目录(文件夹)和python package两个选项,这两个到底有什么不同呢 1.原来在python模块的每一个包中,都有一个__init__.py文件(这个文件定义了包的属性和方法)然后是一些模块文件和子目录,假如子目录中也有__init__.py那么它就是这个包的子包了. 当你将一个包作为模块导入(比如从 xml导入 dom)的时候,实际上导入了它的__init__.py 文件. 2.而目录跟包唯一不同的就是没有__init__.py 文件,一个包是一个带有特殊文

  • 浅谈Python数学建模之整数规划

    目录 一.从线性规划到整数规划 1.1.为什么会有整数规划? 1.2.四舍五入就能得到整数解吗? 二.整数规划的求解方法 2.1.分支定界法(Branch and bound) 2.2.割平面法(Cutting plane) 2.3.整数规划的编程方案 三.PuLP 求解整数规划问题 3.1.案例问题描述 3.2.建模过程分析 3.2.1.问题定义 3.2.2.模型构建 3.2.3.模型求解 3.3.Python 例程 3.4.Python 例程运行结果 一.从线性规划到整数规划 1.1.为什么

  • 浅谈Python flask框架

    目录 1. flask 框架概述 1.1flask 框架优势 1.2flask 框架获取 1.3flask 框架使用 2. flask demo步骤 3. flask 基础功能 3.1路由功能 3.2模版提供 4.总结  前言: Python 面向对象的高级编程语言,以其语法简单.免费开源.免编译扩展性高,同时也可以嵌入到C/C++程序和丰富的第三方库,Python运用到大数据分析.人工智能.web后端等应用场景上. Python 目前主要流行的web框架:flask.Django.Tornad

  • 浅谈python中copy和deepcopy中的区别

    在下是个编程爱好者,最近将魔爪伸向了Python编程.....遇到copy和deepcopy感到很困惑,现在针对这两个方法进行区分,一种是浅复制(copy),一种是深度复制(deepcopy). 首先说一下deepcopy,所谓的深度复制,在这里我理解的是完全复制然后变成一个新的对象,复制的对象和被复制的对象没有任何关系,彼此之间无论怎么改变都相互不影响. 然后说一下copy,在这里我分为两类来说,一种是字典数据类型的copy函数,一种是copy包的copy函数. 一.字典数据类型的copy函数

  • 浅谈python中列表、字符串、字典的常用操作

    列表操作如此下: a = ["haha","xixi","baba"] 增:a.append[gg] a.insert[1,gg] 在下标为1的地方,新增 gg 删:a.remove(haha) 删除列表中从左往右,第一个匹配到的 haha del a.[0] 删除下标为0 对应的值 a.pop(0) 括号里不写内容,默认删除最后一个,写了,就删除对应下标的内容 改:a.[0] = "gg" 查:a[0] a.index(&q

随机推荐