python-day10-函数动态参数,聚合打散,取值顺序,global和nonlocal关键字

今日大纲:

1.动态参数

2.聚合和打散

3.函数的注释

4.名称空间

5.函数的嵌套

6.global和nonlocal关键字

 

1.动态参数

  不确定传参个数时候要用到,*args 和 **kwargs。

*args:接收的是实参里的位置参数,在函数内部是以元祖形式存储。

**kwargs:接收的是实参里的关键字参数,在函数内部是以字典形式存储。

def test(*args): 
    print(args)   
test(1,2,3,4,5,2,3)
# 以元祖形式存储 (1, 2, 3, 4, 5, 2, 3)

def test2(**kwargs):
    print(kwargs)   
test2(a=1,b=2,c=3)
# 以字典形式存储 {'a': 1, 'b': 2, 'c': 3}

传参的顺序:

形参:
    位置参数 --> 动态位置参数 --> 默认参数 --> 动态(关键字)默认参数

实参:
    位置参数 --> 关键字参数

 

2.聚合和打散

在函数形参定义*args以及**args,表示聚合。

在函数实参写*(可迭代对象),表示打散,形式为,如[1,2,3]表示成1,2,3

在函数实参写**(字典),也表示打散,形式为key=value...

def test(*args,**kwargs):
    print(args)
    print(kwargs)

a = [1,2,3,4,5]
b = {'a':1,'b':2,'c':3}
test(*a,**b)   # 相当于打散成1,2,3,4,5,'a'=1,'b'=2,'c'=3
"""
result:
(1, 2, 3, 4, 5)
{'a': 1, 'b': 2, 'c': 3}
"""

 注:字典的打散,字典的key必须是字符串。

 

3.函数的注释

定义完函数,在函数下面一行以6个双引号注释函数功能。

函数.__doc__  # 返回注释的内容

函数.__name__  # 返回函数名

def test(*args,**kwargs):
    """
    测试打散及聚合。
    :param args: 接收的打散后的列表元素
    :param kwargs: 接收的打散后的字典元素
    :return:
    """
    print(args)
    print(kwargs)

a = [1,2,3,4,5]
b = {'a':1,'b':2,'c':3}
test(*a,**b)   # 相当于打散成1,2,3,4,5,'a'=1,'b'=2,'c'=3
print(test.__doc__)
print(test.__name__)
"""
    测试打散及聚合。
    :param args: 接收的打散后的列表元素
    :param kwargs: 接收的打散后的字典元素
    :return:
test
"""

 

4.名称空间

加载顺序:

    内置名称空间 --> 全局名称空间 --> 局部名称空间

函数内的取值顺序:

    局部名称空间 --> 全局名称空间 --> 内置名称空间

 

5.函数的嵌套

一个函数内的嵌套:

def t1():
    def t2():
        print(66)
    t2()

t1()

多个函数之间的嵌套调用:

# 通过一个函数,在函数内调用其它函数

def t1():
    t2()

def t2():
    print(66)
    t3()

def t3():
    print('t3')

t1()

 

6.global、nonlocal

global:在函数内部修改全局名称空间里的变量,需要用此声明 global a,如果不存在该变量,则创建

nonlocal :在局部名称空间,修改离自己最近的变量,如果上层没有就继续往上找直到全局名称空间还未找到则报错。

global的例子:

def t():
    a = 10
    def t2():
        global a
        a = 20
        print('t2:',a)
    t2()
    print('t:',a)

a = 1
print(a)
t()
print(a)
# result:
"""
1
t2: 20
t: 10
20
"""

注:global只能修改全局名称空间里的变量

 

nonlocal的例子:

def t():
    a = 10
    def t2():
        a = 20
        def t3():
            nonlocal a
            a = 30
            print('t3:', a)
        print('t2:', a)
        t3()
        print('t2:', a)
    print('t:',a)
    t2()
    print('t:', a)

a = 1
t()
"""
t: 10
t2: 20
t3: 30
t2: 30   #t2函数里的a被修改
t: 10
"""

注:如果局部命名空间里没有a,会报错!

 

转载于:https://www.cnblogs.com/zezhou/p/10531041.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值