python入门day10 局部变量&全局变量&嵌套函数(内部函数)

局部变量&全局

#局部变量--某个班级的风扇和空调
#全局变量--公共的,饮水机,每个班级都可以去打水
name='yueyue'#全局变量
def func():
    s='abc'#局部变量,仅限于在函数内部使用
    print(s)#abc
# print(s)# 报错

def func1():
    print(name)#yueyue
print(name)#yueyue

def func2():
    name='小月月'#局部变量与全局变量同名
    name+='弹吉他的小美女'
    print(name)#小月月弹吉他的小美女

def func3():
    print(name)
    # name+='会弹吉他'  报错,全局的改变不了,上面那个改的了是因为他改的其实是局部变量的name

#函数内部的变量可以随便修改赋值,但是全局的变量就不能随便在函数体中修改
#解决方案 ---在全局变量前声明global  且声明在函数体的第一句

def func4():
    global name  #如果要修改全局的name则需要加上global
    print(name)#yueyue
    name+='会弹吉他'
    print(name)#yueyue会弹吉他


func()
func1()
func2()
func4()

例子

#局部与全局
name='月月'

list1=[1,2,4,6]

def func():
    name='蕾蕾'
    print('func:',name)
    print('func:',list1)

def func1():
    global name
    print('func1:',name)
    name+='真漂亮'
    print('func1:',name)
    list1.append(8)#由于list是可变类型的,我可以在函数体内直接修改,无须声明global
    print('func1:',list1)

func1()
func()
'''
func1: 月月
func1: 月月真漂亮
func1: [1, 2, 4, 6, 8]
func: 蕾蕾
func: [1, 2, 4, 6, 8]

总结:如果全局变量是不可变的,在函数内进行修改则需要添加global关键字,如果是可变的,则在函数内修改时不需要声明
'''

#在函数内既用局部的又用全局的---不能这么用,可以把局部变量用另外一个名字
# def func2():
#     name='lucy'
#     name+='hhh'
#     print(name)
#     global name
#     print(name)

总结

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

内部函数

#内部函数
'''
特点:
1.可以访问外部函数的变量
2.内部函数可以修改外部函数的《可变类型》的变量,比如list1
'''
def func():
    #声明变量
    n=100 #局部变量
    list1=[3,6,9,4] #局部变量

    #声明内部函数
    def inner_func():
        nonlocal n
        #对list1里面的元素进行加n操作
        for index,i in enumerate(list1):
            list1[index]=i+n  #可以直接修改外部函数的可变类型变量
        list1.sort()

        # 外部函数的不可类型变量如果要修改必须要声明
        n+=101

    inner_func() #调用内部函数

    print(list1)
    print(n)

#调用外部函数
func()



a=100
list2=[1,2]
def func2():
    b=99

    def inner_func():
        nonlocal b
        global a
        c=88
        #尝试修改
        c+=12
        b+=1
        a+=10
        list2.append(3)
        print(a,b,c,list2)
    inner_func()
    print(locals())#看func有哪些孩子{'inner_func': <function func2.<locals>.inner_func at 0x00000249C60FA048>, 'b': 100}
func2()

'''
[103, 104, 106, 109]
201
110 100 100 [1, 2, 3]

'''

总结

总结:内部函数可以访问外部函数的局部变量
内部函数可以直接修改外部函数的可变类型变量
内部函数不可以直接修改外部函数的不可变类型变量,变量需要在内部函数里面用nonlocal声明
内部函数可以访问函数外的全局变量
内部函数可以直接修改全局变量的可变类型变量
内部函数不可以直接修改全局变量的不可变类型变量,变量需要在内部函数里面用local声明

a=100
def func2():
    b=99

    def inner_func():
        c=88
        print(a,b,c)
    inner_func()
func2()

在这里插入图片描述

变量作用域

#变量作用域
'''
LEGB

L:local 本地 本层局部变量

E:enclosing 外层局部变量

G:Global 全局

B:built-in python内置的

搜索规则:从里往外
'''

'''
嵌套函数 :可以直接调用内层函数也可以把内层函数返回出来
闭包:1.内层引用外层的变量
     2.返回内存函数
装饰器:用于修饰函数,把函数作为参数
1.内存函数
2.内存函数引用外层函数的变量
3.返出内存函数
4.函数作为外层函数参数

使用装饰器:
@装饰器名字
def 函数名():
    pass
    
双层装饰器(两个@xxx)
装饰器带参数(嵌套三层函数)
'''
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值