zoukankan      html  css  js  c++  java
  • 环境小硕的转行之路-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
    
  • 相关阅读:
    算法之--回溯法-迷宫问题【python实现】
    awk积累
    mysql自动化安装脚本(二进制安装)
    ${FUNCNAME[@]}和$LINENO使用
    shell脚本配置ssh免密登陆
    /etc/passwd和/etc/group文件详解
    Bagging与随机森林算法原理小结
    js之如何获取css样式
    Jetty源码学习-编译Jetty源码二三事
    maven安装和与IDE集成
  • 原文地址:https://www.cnblogs.com/negu/p/11510276.html
Copyright © 2011-2022 走看看