环境小硕的转行之路-14-动态传参、命名空间、nonlocal和global

前言

几天没更新的原因是这几天忙转导师的事情,终于成功转到一个偏计算机研究领域的导师了。曲线救国的道路已经开始,这几天其实也没落下多少,就是没总结而已。而且所看的视频也换成了全栈,感觉全栈的基础课程讲的更好。
把上个视频老师没讲的坑都记了下来,接下来几天应该都在填坑。

动态传参

一些基本概念的复习

基本概念  
1.实参(传入)  
    a.位置  
    b.关键字  
    c.混合  
2.形参(接受)  
    a.位置  
    b.默认  
    c.动态  
    c1动态位置传参  
    c2动态关键字传参  

顺序:最终顺序(位置参数,args,默认值参数,*kwargs)参数可以随意搭配使用。

动态传参

#位置动态传参:参数前面加一个*
def chi(*food):
    print(1,food)
chi('盖浇饭','拌面','扁肉','蒸饺')

def chi_1(name,*food,location = '福州'):#关键字传参得放在动态传参后面
    print(2,name+'要吃',food,'于'+location)
chi_1('negu','佛跳墙','蒸饺')

#关键字的动态传参
def chi_2(**food):#不能有两个**形参,因为第一个**形参会接收所有关键字实参
    print(3,food)
chi_2(drunk_food = '汉堡',drunk_drink ='可乐')

#无敌传参
def chi_3(*args,**kwargs):#任何位置参数和关键字参数都能接受.但接受的时候也应该先收位置再收关键字.
    pass

函数注释

#函数注释,在def下一行输入三个双引号敲回车,若每个函数都尽量注释,则职业生涯会很顺利!
def chi_4(a,b,c):
    """
    西里呼噜
    :param a:
    :param b:
    :param c:
    :return:
    """
    return b+c
print(chi_4.__doc__)#document文档注释 (可以使用__doc__进行查看)。

函数的打散

lst=['鸡蛋','煎饼果子','油条','莲子羹']#
#chi_5(lst[1],lst[2],lst[3],lst[4])
chi_5(*lst)#用于实参时候将列表打散成一个个元素进行迭代传入函数,若不加*则只传入一个列表
def func(**kwargs):
    print(5,kwargs)
dic = {name:'alex',age:'18'}
func(6,**dic)#若不加**只传入一个列表

命名空间

基本概念

函数的调用机理:在python解释器开始执行之后,就会在内存中开辟一片空间,每当遇到一个变量的时候,就把变量值和值之间的的关系记录下来,但是当遇到函数定义的时候,解释器只是读入内存,不关心函数内部的逻辑和变量,只有当函数被调用和访问的时候,解释器才会根据函数内部声明的变量来进行开辟变量的内部空间.随着函数执行完毕,这些函数内部变量占用的空间也会随着函数执行完毕而被清空。

我们给存放名字和值的关系的空间起一个名字叫: 命名空间. 我们的变量数据存储的时候就
是存储在这片空间中的.
命名空间分类:
    1. 全局命名空间--> 我们直接在py文件中,函数外声明的变量存储于于全局命名空间。(例如在py中直接声明a = 1)
    2. 局部命名空间--> 在函数中声明的变量存储在在局部命名空间
    3. 内置命名空间--> 存放python解释器为我们提供的名字, list, tuple, str, int这些都是内置命名空间
加载顺序:
    1. 内置命名空间
    2. 全局命名空间
    3. 局部命名空间(函数被执行的时候)
取值顺序:
    1. 局部命名空间
    2. 全局命名空间
    3. 内置命名空间   

展示

 a=10#全局名称空间的内容
 def fn():#fn也在全局名称空间
     b=20#局部名称空间
     print(a)
 def gm():
     print(a)
 fn()#10
 gm()#10

查看作用域的变量

    a = 10
def fn():
    b = 20
    def gn():#局部
        c = 30
        print(3,locals())#输出c:30
    gn()

print(1,globals())#可以查看全局作用域中的内容,除了gn()函数其它都有。。
print(2,locals())#查看当前作用域中的内容,写在顶格和print(globals())没区别.
fn()

函数的嵌套

def outer():#2
    print('outer')#3
    def inner():
        print('inner')#5 inner 函数结束跳出后outer函数结束
    inner()#4
outer()#1

a = 1
def wrapper():
    print(a)
wrapper()#a =1 不会报错
wrapper()
def wrapper_1():
    a+=1#此时函数想要修改全局变量,会报错.除非加global函数
    print(a)
wrapper()

global和nonlocal

a=10#全局变量本身就是不安全的 ,访问权限太大所有人都能看见,不能随意修改,在函数中修改全局变量会报错 .解决方法:闭包
def func():
    '访问func之后把全局a换成20'
    global a#1.将全局变量内容引入函数内部 2.在全局创建一个变量
    a = 20
func()
print(a)

def outer():
    a = 10
    def inner():#在inner中改变a的值
        nonlocal a #一层层往外找a,找到离它最近的a然后引进(可改变),但永远不会找全局.找不到也会报错
        a = 20
    inner()
    print(a)
outer()

#地狱特训

a = 1
def fun_1():
    a = 2
    def fun_2():
        nonlocal a
        a = 3
        def fun_3():
            a = 4
            print(a)
        print(a)
        fun_3()
        print(a)
    print(a)
    fun_2()
    print(a)
print(a)
fun_1()
print(a)
#1 2 3 4 3 3 1
原文地址:https://www.cnblogs.com/negu/p/11510276.html