金沙官网线上day 10 函数的进阶

3.global和nonlocal

global:

1 a = 10#全局变量,本身不安全,不能随意修改
2 def fun():
3     global a#  1.可以把全局中的内容引入到函数内部,2.在全局创建一个变量
4     a = 20
5     a += 10
6     print(a)
7 fun()

nonlocal:

1 a = 10
2 def outer():
3     def inner():  #在inner中改变a的值
4         nonlocal a  #寻找外层函数中离他最近的那个变量
5             a = 20
6     inner()
7 outer()

函数可以互相嵌套

 

动态传参 * **形参*args在形参位置, *表示不定参数--接受的是位置参数 接受到的位置参数的动态传参: 都是元组形参的顺序:位置 *args默认值 **kwargs 以后写参数,可以随意的进行搭配def chi(zhushi, cai, fushi, tang, tiandian):print(zhushi,cai,fushi,tang,tiandian)chi("大碗大米饭", "火爆大头菜", "把子肉", "西红柿鸡蛋汤", "烤地瓜")chi("小碗大米饭", "火爆大头菜") # 参数不够形参的顺序:位置*args默认值**kwargs以后写参数. 可以随意的进行搭配, 但是, 顺序不能串**kwargs在形参表示动态传参--关键字参数,关键字动态传参接收到的是字典**在形参表示动态传参-关键字参数关键字动态传参接收到的是字典def func:# 也是聚合. ** 聚合成字典print# func(1,2,3,4,5,6,7) # 位置参数. 报错func(a=1, b=2, c=3, haha="呵呵", good="not bad")实参*在实参的是打散,把列表,元组,字符串打散成位置参数进行传递**在形参表示动态传参--关键字参数;打散,打散成关键字关于*和** 形参: 聚合 位置参数* ->元组 关键字** -> 字典 实参: 打散 列表,字符串,元素 -> * 字典 ->**无敌传参def func(*args, **kwargs): arguments参数keyword-arguments关键字参数pass作用域和名称空间名称空间:用来存放名字(变量,函数名,类名,引入的模块)的1.全局名称空间:我们在py文件中自己写的变量, 函数.....2.内置名称空间;我们python解释器提供好的一些内置内容 (print,input..........)3.局部名称空间:在我们执行函数的时候,会产生一个局部名称空间.放的是:函数内部的内容名称空间可能会有无数个,对于局部名称空间.相对是独立的,一般互不干扰作用域:1.全局作用域: 内置+全局2.局部作用域: 局部从全局找局部->找不到从局部找全局->可以找到怎么查看全局或局部中的内容: globals 全局作用域:内置+全局名称空间 locals 查看当前作用域的内容def chi():a = 20b = 30print # 查看当前作用域中的内容print) # alex,老男孩儿, 武sir, 全局作用域中的内容chi()print # 全局print) # 全局函数的嵌套nonlocal和global 关键字global 表示从全局把一个变量引入局部,后面使用的都是全局变量nonlocal 在局部,寻找离他最近的外层的一个变量如果没有global和nonlocal ,查找的顺序:自己,上一层,上一层,上一层函数的互相调用def func1():print("我是神器的func1")def func2():func1()print("我是神器的func2")def func3():print("我是神器的func3")# func5()def func4():func3()print("我是神器的func4")def func5():func2()func3()print("我是神器的func5")def func6():func5()print("我是神器的func6")func3()func1()func6()def outer():def inner():printprint("还可以这样写???")inner()outer()inner() # 在全局不能找到局部的内容def func1():printdef func2():printdef func3():printprintfunc3()printprintfunc2()printfunc1()全局变量一般是不能随意的修改的a = 10def func():# 慎用.global a# global 表示从全局把一个变量引入到局部, 后面使用的a都是全局变量a += 10 # ?? a = a + 10 # 现在的a是全局的, 你现在视图改全局变量print("里面的打印",a)func()print("外面的打印", a)a = 10def func():def inner():# 慎用.global a# global 表示从全局把一个变量引入到局部, 后面使用的a都是全局变量a += 10 # ?? a = a + 10 # 现在的a是全局的, 你现在视图改全局变量print("里面的打印",a)inner()func()print("外面的打印", a)nonlocal在局部, 寻找离他最近的外层的一个变量a = 50def func1():# a = 10 # 局部def func2():nonlocal a # 不找全局, global找全局a += 10 # a = a + 10 python不让这么干print("func2", a)func2()printfunc1()print如果没有nonlocal和global 查找的顺序: 自己, 上一层, 上一层, 上一层def func0():a = 50def func1():a = 10 # 局部def func2():nonlocal a # 不找全局, global找全局a += 10 # a = a + 10 python不让这么干print("func2", a)func2()printfunc1()printfunc0()a = 1def fun_1():a = 2def fun_2():nonlocal aa = 3def fun_3():a = 4printprintfun_3()printprintfun_2()printprintfun_1()printflag = Falsedef login():global flaguname = inputupwd = inputif uname == "alex" and upwd == "123":flag = Trueelse:flag = Falsedef fatie():if flag == True:printelse:printlogin()fatie()fatie()fatie()fatie()

2.命名空间

  1.内置名称空间

  2.全局名称空间

  3.局部名称空间

1 a = 10#全局名称空间    
2 def fun():#fn也在全局名称空间
3     b = 20#局部名称空间
4     print(a)
5 fun()

 

globals()可以查看全局作用域中的内容

locals()可以查看当前作用域中的内容

本文由金沙官网线上发布于编程,转载请注明出处:金沙官网线上day 10 函数的进阶

您可能还会对下面的文章感兴趣: