py 5.10

一、形参的第三种:动态参数(*args,**kwargs)

#一、形参的第三种:动态参数(*args,**kwargs),当实参传入的参数不止一个时,或者为了以后拓展,要用动态形参来接收更多的数据。
#*args:接收的是所有的位置参数,形成一个元祖。
#**kwargs:接收的是所有的关键字参数,形成一个字典。键:等号左边的变量。 值:等号右边的值
# def func(*args,**kwargs):
#     print(args)
#     print(kwargs)
# func(1,2,3,4,3,2,1,x = 8,y = 2)
#位置关系:在形参中,(位置参数 , *args , 默认参数 , **kwargs)  关键字参数必须在位置参数后面
# def func(a,*args,sex = '男',**kwargs):
#     print(a)
#     print(args)
#     print(sex)
#     print(kwargs)
# func(1,4,5,6,sex = '女',x = 8 , y = 10)
#*的魔性用法。
# *+list或dic/tuple,表示打散列表或字典或元祖,形成最小组成单元。
#**表示聚合,把执行函数中*打散的元素聚合起来。
#加法计算器
# def func(*args):
#     sum = 0
#     for i in args:
#         sum = sum + int(i)
#     return sum
# lis = input('请输入内容:').strip().split('+')
# print(lis)
# print(func(*lis))
# def func(*args,**kwargs):
#     print(args)                     #(1,3,5,3,2,9,9,9,9)
#     print(kwargs)                   #{'name': 'liujj','age':100,'cat' : 'xiaolang'}
# li = [1,3,5,3,2]
# li1 = [9,9,9,9]
# dic = {'name': 'liujj','age':100}
# dic1 = {'cat' : 'xiaolang'}
# func(*li,*li1,**dic,**dic1)         #(1,3,5,3,2,9,9,9,9,name = 'liujj',age = 100 ,cat = 'xiaolang')
# def func(*args):
#     sum = 0
#     for j in args:
#         sum = sum + int(j)
#     return sum
#
# li = input('请输入:').strip().split('+')
# print(func(*li))

# def func3(*args,**kwargs): #*args 接收所有的位置参数。*打散几个它都聚合在一起。**kwargs,接收所有的关键字参数,**打散几个
#     print(args)             #它就聚合几个成为一个大字典。
#     print(kwargs)
#
# l1 = [1, 2, 3]
# msg = 'skskksks'
# dic = {'name':'liu','age':33}
# dic1 = {'1':'数字'}
# func3(*l1,*msg,**dic,**dic1)  #**dic,打散的结果为键 = 值 ,成为了实参里的关键字参数,然后传给**kwargs聚合起来。
动态参数

二、名称空间、作用域

#名称空间,作用域
#名称空间存储的是变量与值的内存地址的关系。
# 打开解释器时,内置名称空间同时被打开,执行程序时,全局名称空间打开,遇到变量和值时,将其对应关系存入。当遇到函数时,
#将函数名存到内存中,但是里面的函数体不予理会,当遇见调用函数时,返回找到函数名,开辟一个临时名称空间(局部名称空间),
#函数体中,遇到变量和值时将其关系存入局部名称空间内,当函数结束后,局部名称空间关闭。
#加载顺序:内置名称空间-----》全局名称空间-----》局部名称空间
#作用域:全局作用域:内置、全局名称空间。  局部作用域:局部名称空间
#取值顺序:局部-----》全局------》内置。   L  E  G  B        只能往后取,不能从前面找往前取。
# name = 'liujj'
# print(name)
# def func():
#     name = 'jiasp'
#     print(name)
# print(222)
# print(333)
# func()                   #'liujj',222,333,'jiasp'

# name = 'liujj'
# print(name)
# def func():
#     name = 'jiasp'
#     print(name)
#     def func2():
#         name = 'xiaolang'
#         print(name)
#     func2()
# print(222)
# print(333)
# func()               #'liujj',222,333,'jiasp','xiaolang'

# name = 'liujj'
# print(name)
# def func():
#     name = 'jiasp'
#     print(name)
#
# def func2():
#     name = 'xiaolang'
#     print(name)
#     func()
# func2()
# print(222)
# print(333)             #'liujj','xiaolang','jiasp',222,333
名称空间、加载取值顺序


三、global / nonlocal

# #global: 更改全局变量。 将全局变量变成局部变量,将局部变量变成全局变量。
#在局部作用域中声明一个全局变量/ 在局部作用域中更改一个全局变量
#注意:当函数体中改的是列表(可变类型)时,不需要global/nonlocal变量,直接就会修改全局中的列表!
# def func():
#     global name        #name本来是局部变量,但是global以后,变成了全局都可以使用的变量。
#     name = 'liujj'
# func()
# print(name)

# name = 'jiasp'
# def func():
#     global name          #将全局变量name改进局部变量中,使其在函数中也可以打印,以下任何时候name都是局部变量里的值。
#     print(name)
# func()
# print(name)
global
#nonlocal: 更改局部变量。与global用法相同,只不过global改的是全局,nonlocal改的是局部。
#          只改动父级、上一层或更高的非全局作用域函数中的变量。
#          引用哪层,以下的全部变量均被改变。
# def func():
#     name = 'liujj'
#     print(name)
#     def func2():
#         nonlocal name
#         name = 'jiasp'
#         print(name)
#     func2()
#     print(name)          #改的必须是上一层函数体内的,如果此打印顶行则属于全局里(函数外面)的了,没法改。
# func()
nonlocal
原文地址:https://www.cnblogs.com/liujjpeipei/p/9020535.html