zoukankan      html  css  js  c++  java
  • 0510Python基础-动态参数-名称空间

    1、昨日内容回顾

        函数:避免重复代码,增强可读性。

        特点:以功能为导向。

        def 函数名():

            函数体

         函数的返回值:return

            1,函数中遇到return结束函数。

            2,return将函数内部的值返回给函数的执行者。

                return    None

                return None     None

                return 单个值

                return 多个值  返回的是元组。

        函数的参数。

        实参:

            位置参数。按顺序一一对应。

            关键字参数。可以不按照顺序但是也必须一一对应。

            混合传参:关键字参数永远在位置参数后面。

         形参:

             位置参数:按顺序一一对应。

             默认参数:默认参数在位置参数的后面。

             动态参数。

    2、动态参数 *args,**kwargs

    用户传入到函数中的实参数量不定时,或者是为了以后拓展,此时要用到动态参数*args,**kwargs(万能参数。)

    *args接收的是所有的位置参数;**kwargs接收的是所有的关键字参数。

    位置参数,*args,默认参数, **kwargs

    def func1(*args, **kwargs):

        print(args)

        print(kwargs)

    # func1(1, 2, 3, 4)

    # func1(x=4, y=5, z=6)

    func1(1, 2, 3, x=4, y=5, z=6)

      

    def func3(a):

        pass

    func3(11)

    位置参数,默认参数

    def func2(a, b, sex='男'):

        print(a)

        print(b)

        print(sex)

    func2(1, 2, '女')

    # 位置参数,*args,默认参数

    def func2(a, b, *args, sex='男'):

        print(a)

        print(b)

        print(args)

        print(sex)

    func2(1, 2, 5,6,7,8,9,sex='女')

      

    位置参数,*args,默认参数, **kwargs

    def func2(a, b, *args, sex='男',age=20, **kwargs):

        print(a)

        print(b)

        print(args)

        print(sex)

        print(age)

        print(kwargs)

    func2(1, 2, 5, 6, 7, 8, 9, x=6, y=5, name='alex')

    def sum1(*args):

        ret = 0

        for i in args:

            ret += i

        return ret

    print(sum1(1, 2, 3,))

      

    def func3(*args,**kwargs):  # 函数的定义 *用意是聚合。

        print(args)  # (1,2,3,11,21,32)

        print(kwargs)

    # *的魔性用法

    l1 = [1, 2, 3]

    l2 = [11, 21, 32]

    s1 = 'fjskalgf'

    s2 = 'fjskrrrf'

    tu1 = (1, 2, 3)

    tu2 = (11, 22, 33)

    func3(*l1, *tu1, *tu2)

    func3(1,2,3,1,2,3,11,22,33)

    dic ={'name': 'alex'}

    dic1 ={'age': 1000}

    func3(*l1, **dic, **dic1)  # func3(name='alex',age=1000)

    在函数的执行时,*的用意是打撒。

      

    def func3(*args,**kwargs):

        l = []

        for i in args:  # ([1, 2, 3], [11, 21, 32])

            l.extend(i)

        args = tuple(l)

        print(args)

        print(kwargs)

    l1 = [1, 2, 3]

    l2 = [11, 21, 32]

    func3(l1,l2)

     

     3、名称空间,作用域,作用域链,加载顺序等。

    当程序运行时,代码从上至下一次读取,遇到变量与值,

    他会在内存中开辟一个空间,存放变量与值的内存地址的对应关系。

    这样存储变量与值得对应关系的空间叫做名称空间(命名空间)。

    当解释器遇到函数时,他会将函数名存储在内存中,但是对于函数体莫不关心。

    当函数执行时,他会通过函数名找到函数体,然后将函数体里面的变量等对应关系存放在一个临时开辟的空间中,随着函数的结束,临时的空间关闭,

    这样的空间叫做临时名称空间。

    name = 'alex'

    age = 1000

    def func1():

        a = 2

        b = 3

    func1()

    内置名称空间:

    len() print() input() list

    list

    name

    print(666)

    名称空间:

        内置名称空间

        全局名称空间

        局部名称空间

    加载顺序:内置名称空间  ---> 全局名称空间(程序运行时) ---->局部名称空间(函数执行时)

    作用域:

        全局作用域:内置名称空间 全局名称空间

        局部作用域:局部名称空间

    取值顺序(单项):局部名称空间(函数执行时) ---> 全局名称空间 ---> 内置名称空间

    L local

    E eclose

    G global

    B Built-in

      

    sum = 666

    name = '老男孩'

    def func1():

        # sum = 555

        print(sum)

    func1()

    sum = 666

    print(sum)

    sum = 666  # global

    def func1():

        sum = 555  # eclose

        print(sum)

        def inner():

            pass

            sum = 111   # local

            # print(sum)

        inner()

    func1()

    4、函数的嵌套,判断一下代码执行结果

    print(111)

    def func1():

        name = 'alex'

        print(name)

        def inner():

            a = 2

            print(a)

        inner()

    print(333)

    func1()

    print(444)

      

    print(111)

    def func1():

        name = 'alex'

        print(name)

        def inner():

            a = 2

            print(a)

        print(444)

        inner()

        print(555)

    func1()

    111 alex 444 2 555

      

    def func1():

        a = 666

        print(666)

    def func2():

        name = 'taibai'

        print(name)

        func1()

    print(333)

    func2()

    print(555)

     5、global,nonlocal。

    global

    def func1():

        global name

        name = 'alex'

    func1()

    print(name)

    name = '老男孩'

    def func1():

        global name

        name = 'alex'

    func1()

    print(name)

    在全局名称空间里得到局部名称空间的变量

    1,return

    2,global

        1,在局部作用域中声明一个全局变量。

        2,在局部作用域中,更改一个全局变量。

        补充:

            对于可变的数据类型,函数中如果对其进行操作,改变全局不用引用global.

    l1 = [1, 2, 3]

    def func1():

        l1.append(666)

    func1()

    print(l1)

      

    nonlocal

    1,不能改变一个全局变量。

    在局部作用域中,对父级作用域(或者更外层作用域非全局作用域)的变量进行引用和修改,

    并且引用的哪层,从那层及以下此变量全部发生改变。

    name = "老男孩"

    def func1():

        nonlocal name

        print(name)

    func1()

    name = "老男孩"

    def func1():

        name = 'alex'

        print(name)  # 1, alex

        def inner():

            nonlocal name

            name = '老男孩'

            print(name)  # 2 老男孩

        inner()

        print(name)  # 3,alex 老男孩

    func1()

      

  • 相关阅读:
    Celery
    高并发架构
    websocket
    git分支管理
    auto_ptr与shared_ptr
    UDP信号驱动IO
    TCP带外数据
    UDP广播
    获取mac地址
    char数组初始化
  • 原文地址:https://www.cnblogs.com/dzh0394/p/9019928.html
Copyright © 2011-2022 走看看