• 动态参数 命名空间


    动态参数:
    用户传入到函数的实参数量不定时,或者是为了以后拓展,此时要用到动态参数*args,**kwargs(万能参数)
    *args 接收的是所有的位置参数(接收的是元组类型)
    **kwargs接收的是所有的关键字参数。(接收的是字典类型)
    def func1(a,b,c):
           pass
    func1(1,2,3)
    func1(1,2,3,4,5,6)
    print()
    def func1(*args,  **kwargs):
          print(args)
          print(kwaigs)
    func1(1,2,3,4)
    fnc1(x=4, y=5, z=6)
    #func1(1,2,3, x=4, y=5, z=6)
    View Code
    他们的顺序:
    位置参数,*arge,默认参数,**kwargs
    1def func2(a, b,*args,sex=''):
        print(a)
        print(b)
        print(args)
        print(sex)
    func2(1,2,5,6,7,8,9,sex='')
    View Code
    2def func2(a, b,*args,sex='',**kwargs):
        print(a)
        print(b)
        print(args)
        print(sex)
        print(kwargs)
    func2(1,2,5,6,7,8,9,sex='',x=6, y=5, name='alex')
    ######
    1
    2
    (5, 6, 7, 8, 9)          *args 元组的形式
    女
    {'x': 6, 'y': 5, 'name': 'alex'}    **kwargs  字典的形式
    3def func2(a,b,sex=''):
        print(a)    #1
        print(b)      #  2
        print(sex)    #
    func2(1,2,'')
    View Code
    
    
    4def func2(a,b,sex='',*args):
        print(a)      #1
        print(b)       #2
        print(args)   #(55,66)
        print(sex)     #44
    func2(1, 2, 44,  55, 66)
    View Code
    简单的加法计算:
    def sum1(*args):
        ret = 0
        for i in args:
            ret += i
        return ret
    print(sum1(1,2,3))
    View Code
    def func3(*args,**kwargs):     函数的定义,* 用意是聚合
        print(args)   #(1,2,3,11,21,32)
        print(**kwargs)
    l1 = [1,2,3]
    l2 = [11,21,32]
    func3(l1,l2)    #[1,2,3],]11,21,32]
    def func3(*args,**kwargs):     函数的定义,* 用意是聚合
        print(args)   #(1,2,3,11,21,32)
        print(**kwargs)
    l1 = [1,2,3]
    l2 = [11,21,32]
    func3(l1,l2)    #[1,2,3],]11,21,32]
    把上面的结果变成没有列表形式
    def func3(*args,**kwargs):   函数的定义,* 用意是聚合
        l = []
        for i in args:  #([1,2,3],[11,21,32])
            l.extend(i)
        args = tuple(l)
        print(args)    #(1,2,3,11,21,32)
        print(kwargs)    #{}
    l1 = [1,2,3]
    l1 = [1,2,3]
    l2 = [11,21,32]
    func3(l1,l2)
    View Code
    *args,**kwargs:函数的定义,* 用意是聚合。
    在函数的执行时,*的用意是打散。
    *的魔性用法:
    def func3(*args,**kwargs):
        print(args)  # (1,2,3,11,21,32)
        print(**kwargs)
    l1 = [1,2,3]
    l2 = [11,21,32]
    func3(*l1,*l2)###(1, 2, 3, 11, 21, 32)
    
    s1 = 'bfhfbdb'
    s2 = 'jdfjdgsgg'
    func3(*s1,*s2)
    #tu1 = (1,2,3)
    #tu2 = (11,22,33)
    #func3(*tu1,*tu2)   #(1, 2, 3, 11, 22, 33)
    View Code
    def func3(*args,**kwargs):
        print(args)  # (1,2,3,11,21,32)
        print(**kwargs)
    l1 = [1,2,3]
    l2 = [11,21,32]
    func3(*l1,*l2)###(1, 2, 3, 11, 21, 32)
    
    s1 = 'bfhfbdb'
    s2 = 'jdfjdgsgg'
    func3(*s1,*s2)
    #tu1 = (1,2,3)
    #tu2 = (11,22,33)
    #func3(*tu1,*tu2)   #(1, 2, 3, 11, 22, 33)
    View Code
    def func3(*args,**kwargs):
        print(args)  # (1,2,3,11,21,32)
        print(**kwargs)
    l1 = [1,2,3]
    l2 = [11,21,32]
    func3(*l1,*l2)###(1, 2, 3, 11, 21, 32)
    View Code
    s1 = 'bfhfbdb'
    s2 = 'jdfjdgsgg'
    func3(*s1,*s2)
    #tu1 = (1,2,3)
    #tu2 = (11,22,33)
    #func3(*tu1,*tu2)   #(1, 2, 3, 11, 22, 33)
    View Code
    当程序运行时,代码从上至下一次读取,遇到变量与值,
    他会在内存中开辟一个空间,存放变量与值的内存地址的对应关系。
    这样存储变量与值得对应关系的空间叫做名称空间(命名空间)。
    当解释器遇到函数时,他会将函数名存储在内存中,但是对于函数体莫不关心。
    当函数执行时,他会通过函数名找到函数体,然后将函数体里面的变量等对应关系存放在一个
    临时开辟的空间中,随着函数的结束,临时的空间关闭,这样的空间叫做临时名称空间。
    name = 'alex'
    age = 1000
    
    def func1():
        a = 2
        b = 3
    func1()
    View Code
    内置名称空间:
    len() print() input() list
    名称空间:
    内置名称空间
    全局名称空间
    局部名称空间
    加载顺序内置名称空间---->  全局名称空间(程序运行时)------>局部名称空间(函数执行时)
    执行顺序:当代码执行时,从上至下一次执行。
    作用域:
       全局作用域:内置名称空间  全局名称空间
       局部作用域:局部名称空间
    取值顺序单项):局部名称空间(函数执行时)--->全部名称空间---->内置名称空间
    加载顺序:
    name = 'alex'
    def func1():
        a = 3
    func1()
    View Code
    取值顺序:
    1,
    name = '老男孩'
    def func1():
        name = 'alex'
        print(name)
    func1()
    View Code
    name = '老男孩'
    def func1():
        print(name)
    func1()
    View Code
    sum = 666
    name = '老男孩'
    def func1():
        #sum = 555
        print(sum)
    func1()
    View Code
    L local     (本地)
    E  eclose   (关闭)
    G   global   (全局变量)
    B  Built-in     (内置)
    sum = 666     # global
    def func1():
        #sum = 555 #eclose
        def inner():
            # sum = 111   #  local
            print(sum)
        inner()
    func1()
    View Code

    练习题;

    1, print(111)
     def func1():
        name = 'alex'
        print(name)
        def inner():
            a = 2
            print(a)
        inner()
    print(333)
    func1()
    print(444)       #111   333  alex  2  444
    View Code
    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
    View Code
    def func1():
        a = 666
        print(666)
    View Code
    def func2():
        name = 'taibai'
        print(name)
        func1()
    View Code
    print(333)
    func2()
    print(555)  #333  taibai  666   555
    global
    View Code
    global:
    def func1():
        name = 'alex'
        print(name)
    
    
    print(name)     会报错
    View Code
    1def func1():
        name = 'alex'
        print(name)
        return name
    ret = func1()
    print(ret)
    2def func1():
        global name
        name = 'alex'
    func1()
    print(name)      # alex
    3,
    name = '老男孩'
    def func1():
        global name
        name = 'alex'
    func1()
    print(name)     # alex
    View Code
    global:
    在全局名称空间里得到局部名称空间的变量
    1,return
    2,global
       1),在局部作用域中声明一个全局变量。
       2),在局部作用域中,更改一个全局变量。
    (改变全局变量,遇到global,global下面变量的值将覆盖全局变量的值)
    补充:
    对于可变的数据类型,函数中如果对其进行操作,改变全局不用引用global
    函数中如果使用global + 变量 必须是第一次使用这个变量。
    
    
    flag = True
    def func1():
        if flag:
            print(333)
        global flag
        flag = False
    func1()
    View Code
    
    

    作用域的问题:
    1,globals()获取全局作用域中的内容
    2,locals() 获取局部作用域中的内容


    locals():函数会以字典的类型返回当前位置的全部局部变量。 globals():函数以字典的类型返回全部全局变量。
    def extendList(val,list=[]):
        list.append(val)
        print(locals())  #{'list': [1],'val':1]
        return list
    
    ret = extendList(1)
    print(globals())     #'ret':[1]
    View Code
    nonlocal:(改变全局会报错)
    1,不能改变一个全局变量。
    2,在局部作用域中,对父级作用域(或者更外层作用域非全局作用域)的变革进行引用和修改,并且引用的哪层,从那层及以下此变量全部发生改变。
    (nonlocal不能改变全局变量,如果改变父级(它的上一级),那么以下执行的都是改变的值,与父级的值没有关系。)
    global和nonlocal
    global:寻找全局作用域中的内容
    nonlocal:寻找上一级作用域中的内容,但不能是全局的
    a = 10  #全局
    def func():  #全局
        a = 40   #局部
        b = 20   #局部
        def abc():  #局部
            d = 30   #局部
            print('哈哈')
            print(a,b)   #这使得是局部作用域
        # print(locals()) #打印全局作用域中的内容
    func()
    # print(globals())  #打印全局作用域中的内容
    a = 10
    def func():
        global a #全局
        a = 20
        print(a)
    func()
    print(a)   #20
    
    a=10
    def func1():
        a = 20      #30
        print(a)     #20
        def func2():
            nonlocal a
            a = 30
            print(a)   #30
        func2()
        print(a)   #30
    func1()
    print(a)  #20 30 30 10
    
    
    
     
    name = '老男孩'    #
    def func1():
        nonlocal name
        print(name)
    func1()    #           改变全局报错
    练习:
    def add_b():
        b = 42
        def do_global():
            b = 10
            print(b)
            def dd_nonlocal():
                nonlocal b
                b = b + 20
                print(b)
            dd_nonlocal()
            print(b)
        do_global()
        print(b)
    add_b()
    View Code
    
    
    def func1():
        name = 'alex'
        print(name)   # 1,alex
        def inner():
            nonlocal name
            name ='老男孩'
            print(name)   #2,老男孩
        inner()
        print(name)  # 3,   老男孩
    func1()
    View Code
    def func1(*args,**kwargs):
        print(**kwargs)
    func1(*[1,2,3],**{'name':'alex'})   #
    print接收不了关键字参数,会报错
    View Code
    2、写函数,接收n个数字,求这些参数数字的和。(动态传参)
    def sum1(*args):
        ret = 0
        for i in args:
            ret += i
        return ret
    print(sum1(1,2,3))
    View Code
    3、读代码,回答:代码中,打印出来的值a,b,c分别是什么?为什么?
    a=10
    b=20
    def test5(a,b):
        print(a,b)
    c = test5(b,a)
    print(c)
    a = 10 ,  b = 20 , c = None
    View Code
    4、读代码,回答:代码中,打印出来的值a,b,c分别是什么?为什么?
    a=10
    a=10
    b=20
    def test5(a,b):
        a=3
        b=5
        print(a,b)
    c = test5(b,a)
    print(c)
    
    a = 3, b = 5, c = None
    View Code
    相关面试题
    1,有函数定义如下:
    2、Error、24、8、10、Error
    def calc(a,b,c,d=1,e=2):
    return (a+b)*(c-d)+e
    请分别写出下列标号代码的输出结果,如果出错请写出Error。
    print(calc(1,2,3,4,5))__2___ #print(calc(1,2))_Error___print(calc(e=4,c=5,a=2,b=3))_24_
    print(calc(1,2,3))___8_ print(calc(1,2,3,e=4))_10__print(calc(1,2,3,d=5,4))_Error___
    2,下面代码打印的结果分别是__#[10,'a']_______,_#[123]_______,__# [10,'a']______.
    def extendList(val,list=[]):
        list.append(val)
        return list
    list1 = extendList(10)
    list2 = extendList(123,[])
    list3 = extendList('a')
    
    print('list1=%s'%list1)    #[10,'a']
    print('list2=%s'%list2)     #[123]
    print('list3=%s'%list3)    # [10,'a']
    View Code
  • 相关阅读:
    LintCode 17.子集
    JS时间操作
    Ajax总结
    Ajax请求文件下载操作失败的原因和解决办法
    遍历Map的几种方式
    java获取文件大小的方法
    Ajax详细介绍
    第31课
    30-React JSX IN DEPTH
    28-React state提升、组件组合或继承
  • 原文地址:https://www.cnblogs.com/ls13691357174/p/9097488.html
Copyright © 2020-2023  润新知