python函数2_闭包和装饰器

变量的范围(局部/全局)

  • 局部变量

    • 在函数内部声明的变量
    • 在函数体外部无法获取
  • 全局变量
    • 在函数外部声明的变量
    • 所有函数都可以访问

在函数内,局部变量和全局变量同名,优先使用局部变量

name = '月月'
def fun2():
    name = '小月月'
    name += '会弹吉他'
    print(name)

fun2()
小月月会弹吉他

当在函数体内,尝试更改全局变量会报错

name = '月月'
def fun2():
    print(name)
    name += '会弹吉他'

fun2()

当需要在函数体内修改全局变量时,需要加global

只是获取不需要加

name = '月月'
def fun2():
    global name
    name += '会弹吉他'
    print(name)
fun2()
print(name)
月月会弹吉他
月月会弹吉他

当在函数中要修改的全局变量是可变类型的,如列表,则不需要添加global关键字

list1 = ['python','php','go']
def fun2():
    list1.append('java')
fun2()
print(list1)
['python', 'php', 'go', 'java']

内部函数

可以访问外部函数的变量

a = 10
def func1():
    b = 20
    def func2():
        print(a,b)
    func2()
func1()
10 20

内部函数可以修改外部函数的可变类型的变量比如:list

list1 = ['python','php','go']
def func1():
    list2 = ['html','css']
    def func2():
        list1.append('java')
        list2.append('javascript')
        print(list1,list2,sep='\n')
    func2()
func1()
['python', 'php', 'go', 'java']
['html', 'css', 'javascript']

内部函数修改全局的不可变变量时,需要在内部函数声明global 变量名

a = 10
def func1():
    b = 20
    def func2():
        global a
        a += b
        print(a,b)
    func2()
func1()

内部函数修改外部函数的不可变变量时,需要在内部函数中声明,nonlocal 变量名

a = 10
def func1():
    b = 20
    def func2():
        nonlocal b
        b += a
        print(a,b)
    func2()
func1()

4.1, locals(),可以看到当前函数中声明的变量有哪些,以字典的形式输出

a = 10
def func1():
    b = 20
    def func2():
        nonlocal b
        b += a
        print(locals())
    func2()
    print(locals())
func1()
{'b': 30}
{'func2': <function func1.<locals>.func2 at 0x000001BF232F4730>, 'b': 30}

globals(),查看全局变量有那些,以字典的形式输出(会有一些系统中的键值对)

a = 10
def func1():
    b = 20
    def func2():
        nonlocal b
        b += a
        print(globals())
    func2()
func1()

原文地址:https://www.cnblogs.com/inmeditation/p/12337883.html

时间: 2024-11-05 21:56:56

python函数2_闭包和装饰器的相关文章

13、python中的函数(闭包与装饰器)

一.嵌套函数 函数的内部又再定义另一个函数,这个函数就叫嵌套函数,里面含函数就叫内部函数. 示例: 二.返回函数 函数可以接收函数对象作为参数,同理函数也能返回一个函数对象作为返回值. 示例: 返回函数可以用来延迟函数的执行. 三.命名空间与变量作用域 变量作用域指的是变量的存活的范围.命名空间指的是属于一个对象的所有属性(对象)的集合. 示例: A的命名空间是A函数对象里面的所有对象的集合,包括变量a.函数B.变量b:B的命名空间就是属于函数B的所有对象的集合,包括变量b: a的变量作用域就是

21.python中的闭包和装饰器

python中的闭包从表现形式上定义(解释)为:如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是闭包(closure). 以下说明主要针对 python2.7,其他版本可能存在差异. 也许直接看定义并不太能明白,下面我们先来看一下什么叫做内部函数: def wai_hanshu(canshu_1): def nei_hanshu(canshu_2): # 我在函数内部有定义了一个函数 return canshu_1*canshu_2 return

轻松理解python中的闭包和装饰器 (下)

在 上篇 我们讲了python将函数做为返回值和闭包的概念,下面我们继续讲解函数做参数和装饰器,这个功能相当方便实用,可以极大地简化代码,就让我们go on吧! 能接受函数做参数的函数我们称之为高阶函数,例如filter, map, reduce这些函数 可以定义一个函数作为高阶函数例如: def func(x, y, f): return f(x)+f(y) 可以这样调用func(2,-1,abs) 函数返回结果为3 有些时候,我们不需要显式地定义传入的函数,直接传入匿名函数更方便. 在Pyt

函数进阶——闭包,装饰器,生成器,迭代器

闭包 函数定义和函数表达式位于另一个函数的函数体内(嵌套函数).而且,这些内部函数可以访问他们所在的外部函数中声明的所有局部变量.参数.当其中一个这样的内部函数在包含他们的外部函数之外被调用时,就会形成闭包. 装饰器 在不修改原函数的情况下,给原函数增加新的功能,使得程序变得可扩展 http://www.cnblogs.com/alex3714/articles/5765046.html(转) 列表生成式 1 a = [i+1 for i in range(10)] 2 print(a)#[1,

Day 19 函数之闭包、装饰器

一.什么是装饰器 器即函数 装饰即修饰,意指为其他函数添加新功能 装饰器定义:本质就是函数,功能是为其他函数添加新功能 二.装饰器遵循的原则 1.不修改被装饰函数的源代码(开放封闭原则) 2.为被装饰函数添加新功能后,不修改被修饰函数的调用方式 三.高阶函数 高阶函数总结 1.函数接收的参数是一个函数名 作用:在不修改函数源代码的前提下,为函数添加新功能, 不足:会改变函数的调用方式 2.函数的返回值是一个函数名 作用:不修改函数的调用方式 不足:不能添加新功能 其.程序: work: #! /

函数的闭包和装饰器

函数的闭包: #1.闭 必须是内部的函数 #2.包 引用了外部作用域中的变量 命名空间: 一共有三种命名空间从大范围到小范围的顺序:内置命名空间.全局命名空间.局部命名空间 作用域(包括函数的作用域链): 小范围的可以用大范围的但是大范围的不能用小范围的范围从大到小(图) 在小范围内,如果要用一个变量,是当前这个小范围有的,就用自己的如果在小范围内没有,就用上一级的,上一级没有就用上上一级的,以此类推.如果都没有,报错 函数的嵌套: 嵌套调用 嵌套定义:定义在内部的函数无法直接在全局被调用 函数

Python基础day-7[闭包,装饰器]

闭包: 首先说下闭包是什么? 闭包就是在函数内部定义的函数,包含对外部作用域的引用,但不包含全局作用域.因为函数的作用域在定义的时候就固定死了,所以闭包函数有自带作用域和延迟计算的特点. 闭包函数定义:如果一个内部函数,包含了对外部作用域的引用,但是不是包含全局作用域.那么这个函数就被认为是闭包函数.闭包函数可以使用".__closure__" 来查看闭包函数的属性.下面我们来看一个示例: def t(): money = 100 def s(): print(money) retur

python中的闭包和装饰器

闭包函数介绍 什么是闭包 维基百科中关于闭包的概念: 在一些语言中,在函数中可以(嵌套)定义另一个函数时,如果内部的函数引用了外部的函数的变量,则可能产生闭包.闭包可以用来在一个函数与一组 "私有" 变量之间创建关联关系.在给定函数被多次调用的过程中,这些私有变量能够保持其持久性. 对上面这段话总结一下,即python中的闭包需要满足3个条件:1) 内嵌函数,即函数里定义了函数 -- 这对应函数之间的嵌套2) 内嵌函数必须引用定义在外部函数里中的变量(不是全局作用域中的引用)-- 内部

聊聊Python中的闭包和装饰器

1. 闭包 首先我们明确一下函数的引用,如下所示: def test1(): print("--- in test1 func----") # 调用函数 test1() # 引用函数 ret = test1 print(id(ret)) print(id(test1)) #通过引用调用函数 ret() 运行结果: --- in test1 func---- 140212571149040 140212571149040 --- in test1 func---- 以y=kx+b为例,请