首页 > 编程语言 >Python 函数和变量作用域

Python 函数和变量作用域

时间:2024-04-23 19:24:36浏览次数:11  
标签:闭包 count 变量 作用域 Python func 函数

变量引用顺序

Python 引用变量的顺序:当前作用域局部变量->外层作用域变量->当前模块中的全局变量->Python内置变量。

1、 global

global 关键字用来在函数或其他局部作用域中使用全局变量,如果不对全局变量进行修改,那么可以不使用global关键字;如果想要在函数或局部作用域中对全局变量进行修改操作,那么必须在函数或局部作用域中使用global关键字进行声明,否则报错:UnboundLocalError

count = 1
def foo():
  global count  #如果不加这个那么就会报错
  count += 1
  print(count)
foo()

2、 nonlocal

使用情况:闭包,嵌套函数中

如果内部函数想要对外部函数的局部变量进行修改时,需要在内部函数中声明:

nonlocal <变量名>

nonlocal语句会搜索当前调用栈中的下一层函数的定义。

def a():
  count = 1
  def b():
    nonlocal count
    count += 1
    print(count)
  return b
a()()

  

3、 装饰器

介绍:装饰器的作用是将被修饰的函数当作参数传递给与装饰器对应的函数,并返回包装后的被装饰的函数。装饰器其实是闭包的一种特殊情况

 def a(func):
  return func
 
@a
def b():
  pass
b()

  

执行示意图:
在这里插入图片描述
解析过程:

发现@a,那么就将会执行a(b),返回b
b(),这一步调用的其实是a返回的同一名的b函数,并且开始执行b函数中的操作

4、 闭包

闭包概念:在计算机科学中,闭包(Closure)是词法闭包的简称,是引用了自由变量的函数,这个被引用的自由变量将和这个函数一同存在,即使已经离开了创造它的环境也不例外。

简单介绍:可以理解为一个封闭的包裹,这个包裹就是一个函数和函数内部对应的逻辑,包裹里面的东西就是自由变量,自由变量可以随着包裹到处游荡,比如:装饰器是一个闭包,随着装饰器进行传递的函数名就是自由变量(函数),装饰器和内部逻辑结构就是闭包中的函数和内部逻辑。

def func(name):
  def inner_func(age):
    print(‘name:’+name+’ age:’+age)
  return inner_func
 
a = func(‘liyang’)
a(20)   #>>> name:liyang age:20

  

上面的例子中:调用func函数时就产生了闭包inner_func,该闭包所持有的自由变量是name。

当函数func的生命周期结束之后,name这个变量依然存在,因为它被闭包引用了,所以不会被回收。

5、 延迟绑定

Python函数的作用域是由代码决定的,也就是静态的,但是使用是动态的,是在执行时确定的

闭包中遇到的问题

fs = [lambda x: x*I for i in range(4)]
print(fs[0](1))     #>>> 3

期望输出结果是:0,但是结果却是:3

这是因为只有在函数foo被执行的时候才会搜索变量i的值,由于循环已结束,i指向最终值3,所以最终会发现结果都是一样。

使用下面的闭包方式,就会得到期望的结果:

def foo(i):
  return lambad x: x*i
#学习中遇到问题没人解答?小编创建了一个Python学习交流群:153708845 
fs = [foo(i) for i in range(4)]
print(fs[0](1))

标签:闭包,count,变量,作用域,Python,func,函数
From: https://www.cnblogs.com/djdjdj123/p/18153611

相关文章

  • 用Python程序如何捕获Ctrl+C终止信号?
    对于一些连续运行或者长时间运行的Python程序而言,如服务器的后端,或者是长时间运行的科学计算程序。当我们涉及到一些中途退出的操作时,比如使用Ctrl+C来退出正在运行的程序。这种场景的出现一般有两个可能性:一是程序出现了问题,需要终止程序来对其进行调整。另一种是程序本身是正......
  • Python中列表和字符串的反转
    一、Python现成的反转功能:在Python中有专门进行列表反转的函数--reverse()l=[13,30,42,85,9,45]l.reverse()#[45,9,85,42,30,13]还可以使用切片操作进行列表反转l=[13,30,42,85,9,45]print(l[::-1])#[45,9,85,42,30,13]关于字符串的反转,并没......
  • Python中的私有属性与私有方法
    关于Python中的私有属性和私有方法Python对于类的成员没有严格的访问控制限制,这与其他面相对对象语言有区别。关于私有属性和私有方法,有如下要点:1、通常我们约定,两个下划线开头的属性是私有的(private)。其他为公共的(public);2、类内部可以访问私有属性(方法);3、类外部不能直接访问......
  • python3下安装mysqlclient各种报错 raise OSError mysql_config not found
    linux下载地址:https://files.pythonhosted.org/packages/a5/e1/e5f2b231c05dc51d9d87fa5066f90d1405345c54b14b0b11a1c859020f21/mysqlclient-2.0.1.tar.gz#sha256=fb2f75aea14722390d2d8ddf384ad99da708c707a96656210a7be8af20a2c5e5在服务器执行pipinstallmysqlclient-2.0.......
  • 接口测试方法:Spring boot Test、python、postman
    一般的rest接口在pom.xml中加入org.springframework.bootspring-boot-starter-testtest新建测试类@RunWith(SpringRunner.class)@SpringBootTestpublicclassUserControllerTest{privateMockMvcmvc;//初始化执行@BeforepublicvoidsetUp()throwsException......
  • Python 中删除文件夹下文件的方法详解
    前言在编写和维护Python脚本时,经常会遇到需要删除文件夹中特定文件的情况。Python提供了多种方法来实现这一目标,本文将介绍几种常用的方法,以及它们的优缺点和适用场景。方法一:使用os模块Python的os模块提供了操作文件系统的功能,可以轻松实现删除文件夹下的文件。下面......
  • 使用 Python 循环创建多个列表
    前言在Python中,我们可以使用循环来动态创建多个列表,这在处理数据、进行数据分析或进行算法实现时非常有用。本文将介绍几种常见的方法,以帮助大家学习如何使用循环创建多个列表。方法一:使用列表推导式列表推导式是Python中一种简洁的语法,可以快速生成列表。我们可以结合循......
  • Python 字符串格式化指南
    前言在Python中,字符串格式化是一种常见且重要的操作,用于将变量或值插入到字符串中,并控制输出的格式。本文将介绍几种常见的字符串格式化方法,帮助大家掌握在Python中有效地处理字符串的技巧。方法一:使用%操作符格式化字符串使用%操作符是一种传统的字符串格式化方法,可......
  • 批量将excle文档用例转为python脚本
    #-*-coding:utf-8-*-importtimeimportpandasaspdimportosallure_param={"epic":"用例版本名","feature":"用例特性名","story":"用例场景名"}df=pd.read_excel(r'D:\aaaaaa.xlsx......
  • python 基础习题2--字符串切片技术
    1. 有如下字符串str='123456789'字符串切片技术,例如,返回输出从第三个开始到第六个的字符(不包含)即得到:345利用字符串切片技术,代码可以这么写:print(str[2:5])如果想返回如下八行结果,利用字符串切片技术,如何编写代码?12345678912345678134534567892412345678912345678......