python基础学习Day9 函数形参的动态参数、*args **kwargs 命名空间 global 与 nonlocal

一、函数形参的动态参数

原因:为了拓展,对于实参数量不固定,故需要万能参数,即动态参数, *args   **kwargs

# def sum1(*args): # 在函数定义时,在*位置参数,聚合。
#  *args将所有的实参的位置参数聚合到一个元组,并将这个元组赋值给args

1.1*args的聚合

例如:利用函数写个计算器

def sum1(*args):
    count = 0
    for i in args:
        count =count + i
    return count
print(sum1(1,2,3))

需要求和的数据不固定,可以使用*args来代替形参

1.2*args的打散

l1 = [1,2,3]
l2 = [111,22,33,'alex']
l3 = 'alex'
def func(*args):
    print(args)
func(*l1,*l2,*l3)   #(1, 2, 3, 111, 22, 33, 'alex', 'a', 'l', 'e', 'x')

可以将实参内的数据打散。

2.**kwargs

l1 = [1,2,3]
l2 = [111,22,33,'alex']
def func1(*args,**kwargs):
    print(args)
    print(kwargs)
func1(*l1,*l2)
func1(*(1,2,3),*('alex','sb'))
func1(*'alex',*'sb')          # ('a', 'l', 'e', 'x', 's', 'b')
func1(1,2,3,'alex','sb')   # 返回元组
func1(**{'name':'alex',**{'age':1000}})  # {'name': 'alex', 'age': 1000}

可以接受类似字典的键值对的数据

3.形参的顺序 :   位置参数,*args,默认参数 ,**kwargs

def func(a,b,*args,sex ='',**kwargs,):
    print(a,b)
    print(sex)
    print(args)
    print(kwargs)
func(1,2,11,22,34,5,6,sex = 'nv',name = 'alex',age=1000)
结果:

 1 2
 nv
(11, 22, 34, 5, 6)
{'name': 'alex', 'age': 1000}

二、命名空间

命名空间分为:1.全局命名空间

                         2.局部命名空间(临时命名空间)

                         3.内置命名空间

全局命名空间:在函数以外的变量
局部命名空间:在函数内的变量
内置命名空间:内置的函数,python解释器的内置方法
作用域:
全局作用域 :全局名称空间 内置名称空间
局部作用域:局部命名空间(临时)
取值顺序:就近取值
局部名称空间————》全局名称空间————————》内置名称空降 单向从小到大
加载顺序:
       内置名称空降——————》全局名称空间————————————》局部名称空间

三、global 与 nonlocal

def func1():
    # count = 3
    count = count + 1  #local variable 'count' referenced before assignment
    print(count)
func1()

如果你在局部名称空间,对一个变量进行修改,那么解释器会认为你的这个变量在局部中已经定义

但是对于上面的例题,局部中没有定义,也报错。

global的作用

1、在局部名称空降声明一个全局变量

def fun1():
    global name
    name = 'alex'
fun1()
print(name)   

2、在局部名称空间可以对全局变量进行修改

count = 1
def func1():
    global count
    count = count +1
    print(count)
func1()
print(count)

3、nonlacal的作用

子函数对父函数的变量进行修改。此变量不能是全局变量。

def func1():
    count = 666     
    def func2():
        nonlocal count      # count为非全局变量
        count +=1
        return count
    func2()
    print(count)
func1()

猜你喜欢

转载自www.cnblogs.com/youhongliang/p/9489520.html
今日推荐