• 函数补充:动态参数,函数嵌套,global与nonlocal关键


    一丶动态参数

      1.*args 位置参数,动态传参

    def func(*food):
        print(food)
    
    print(func("米饭","馒头","福建人","犹太人"))

      将所有的位置参数都赋给*food

      2.**kwargs 关键字参数,动态传参

    # 关键字的动态传参
    def eat(**food):
        print(food)
    print(eat(广东人= "福建人",goodeat = "饼干",我的天="飞天"))

      将关键字参数,以字典的形式赋给**food

      3.默认参数与动态参数的关系

      

      如果以位置参数,关键字参数,默认参数排列会报错,我们改一下默认参数的位置,发现只有在位置参数后面,关键字参数前面,默认参数才不会报错

    def func(*name,gender="",**hobby):
        print(name,hobby,gender)
    print(func("周杰伦","谢霆锋","吴京",hobby1="看电影",hobby2="唱歌"))

       总结一下顺序:

          位置参数>*args>默认值参数>**kwargs

      如果想接收所有参数,可以用*arge 和 **kwargs组合

    def trans_para(*args,**kwargs):
        print(args)
        print(kwargs)
    trans_para("jinxin",12,[1,2,3,4],[3,4,],(1,4,7),{"a":"123","c":456},country="china")

     二丶命名空间

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

    a = 10
    def func():
        a = 20      #当函数运行完毕,函数里面的a=20所占空间自动释放,不存在了
    func()
    print(a)    #输出的是10

       我们给存放名字和值的关系的空间起一个名字叫:命名空间,我们的变量在存储的时候就是存储在这片空间中的.

        命名空间分类:

        1.全局命名空间:--->我们直接在py文件中,函数外声明的变量都属于全局命名空间

        2.局部命名空间---->在函数中声明的变量会放在局部命名空间

        3.内置命名空间:---->存放在python解释器为我们提供的名字,list,tuple,str,int这些都是内置命名空间

        加载顺序:

          1.内置命名空间

          2.全局命名空间

          3.局部命名空间(函数被执行的时候)

        取值顺序:

          1.局部命名空间

          2.全局命名空间

          3.内置命名空间

    a = 10
    def func():
        a = 20     
        print(a)    #输出的是20
    func()
    print(a)    #输出的是10

      2.作用域

        作用域:作用域就是作用范围,按照生效范围来看分为 全局作用域和局部作用域 

        全局作用域:包含内置命名空间和全局命名空间,在整个文件的任何位置都可以使用(遵循从上到下逐行执行)

        局部作用域:在函数的内部可以使用.

        

        作用域命名空间:

          1.全局作用域:全局命名空间 + 内置命名空间

          2.局部作用域:局部命名空间

        我们可以通过globals()函数来查看全局作用域中的内容,也可以通过locals()来查看局部作用域中的变量和函数信息

    a = 10
    def func():
        a = 20
        b = 10
        def abc():
            print("哈哈")
        print(a,b)          #这里a,b都是使用的局部作用域
        print(globals())    #打印全局作用域中的内容
        print(locals())     #打印局部作用域中的内容
    func()

    三丶函数的嵌套

        1.只要遇见了()就是函数的调用,如果没有()就不是函数的调用

        2.函数的执行顺序

    #函数的嵌套
    def fun2():
        print(222)
        def fun3():
            print(666)
        print(444)
        fun3()
        print(888)
    print(333)
    fun2()
    print(555)

     四丶关键字 global和nonlocal

      global表示不再使用局部作用域中的内容了,而改用全局作用域中的变量

    a = 10
    def func():
        global a
        a = 20
        print(a)
    func()
    print(a)

       nonlocal表示在局部作用域中,调用父级命名空间中的变量

    a = 10
    def func1():
        a = 20
        def func2():
            nonlocal a
            a = 30
            print(a)
        func2()
        print(a)
    func1()

  • 相关阅读:
    leetcode 279. Perfect Squares
    leetcode 546. Remove Boxes
    leetcode 312. Burst Balloons
    leetcode 160. Intersection of Two Linked Lists
    leetcode 55. Jump Game
    剑指offer 滑动窗口的最大值
    剑指offer 剪绳子
    剑指offer 字符流中第一个不重复的字符
    leetcode 673. Number of Longest Increasing Subsequence
    leetcode 75. Sort Colors (荷兰三色旗问题)
  • 原文地址:https://www.cnblogs.com/qicun/p/9450077.html
Copyright © 2020-2023  润新知