动态参数 命名空间

动态参数:
用户传入到函数的实参数量不定时,或者是为了以后拓展,此时要用到动态参数*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
原文地址:https://www.cnblogs.com/ls13691357174/p/9097488.html