python函数学习-day10

一,函数动态参数

首先要了解,动态参数只会出现在形参的位置:它诞生的意义在于之前讲的形参的位置参数,默认参数在有很多值需要传入的情况下会非常麻烦,定义许多参数,因此诞生了动态参数

动态参数:不论用户输入多少参数,都可以接收

1,动态参数分类:

  1,形参接收动态位置参数

    使用一个*号+变量名表示即可(但是程序员约定俗成使用“*args”表示);注意这里是把传入的值变成元组返回

  2,形参接收动态关键字参数

    使用两个**号+变量名即可(但是程序员约定俗成使用**kwargs表示):注意这里是把传入的值变成字典返回

动态参数示例:

def func(*x,**y):  # 注意这里的变量名是可以随便写的
    print(x)
    print(y)
func(1,2,3,4,5,c=3,v=6)  # 前面的单个字符是位置参数,后面的是关键字参数
View Code

2,动态参数优先级

上面讲了动态参数,那么它和之前讲的位置参数默认参数之间有什么关系呢?      她们之间存在优先级问题,看如下代码:

def func(*args,a,b):
    print(args)
    print(a)
    print(b)
func(1,2,3,4,5)

  File "D:/python-file/python练习/练习测试.py", line 12, in <module>
    func(1,2,3,4,5)
TypeError: func() missing 2 required keyword-only arguments: 'a' and 'b'
动态位置参数优先级和位置参数优先级的关系

由上图可以看出,由于*args已经把全部的位置参数都取走了,导致后面的a,b根本无法取到值,因此报错。由此得出结论:位置参数优先级>动态位置参数

def func(a,b,*args):
    print(args)
    print(a)
    print(b)
func(1,2,3,4,5)

打印结果:
(3, 4, 5)
1
2
正确写法

那么接下来再看动态关键字参数:

def func(**kwargs,b=1,c=2):
    print(kwargs)
    print(c)
    print(b)
func(b=3,c=5)

报错信息:
    def func(**kwargs,b=1,c=2):
                      ^
SyntaxError: invalid syntax
动态关键字参数和默认参数的关系

由上图看出,由于**kwargs已经把所有的关键字参数取走啦,之后定义的默认参数变得无意义。由此得出结论:默认参数优先级>动态关键字参数

def func(b=1,c=2,**kwargs):
    print(kwargs)
    print(c)
    print(b)
func(b=3,c=5,v=6,h=9)


返回结果:
{'v': 6, 'h': 9}     # 注意此处返回的是一个字典
5
3
正确写法

那么位置参数和默认参数的优先级关系呢:位置参数 > 动态位置参数 > 默认参数 > 动态关键字参数 

二,函数的注释

就是对函数的描述信息:需要写在函数中(三个引号,和之前的多行注释一样)

def func(*args,b=1,c=2,**kwargs):
    '''
    :param args:    # 具体描述函数体的意思 
    :param b: 
    :param c: 
    :param kwargs: 
    :return: 
    '''
    print(args)
    print(kwargs)
    print(c)
    print(b)
func(1,2,3,4,5,b=3,c=5,v=6,h=9)
函数注释信息

这里主要涉及一个方法

不进入函数,查看函数的描述信息:print(‘函数名’.__doc__)【注意这里是双杠】

def func(*args, b=1, c=2, **kwargs):
    '''
    :param args:    # 具体描述函数体的意思
    :param b:
    :param c:
    :param kwargs:
    :return:
    '''
    print(args)
    print(kwargs)
func(1, 2, 3, 4, 5, b=3, c=5, v=6, h=9)
print(func.__doc__)


会在下面显示你的注释信息
View Code

三,命名空间

1,命名空间分类:

  1,内置命名空间:python内置的一些方法,例如:list tuple

  2,全局命名空间:在一个py文件中定义的变量,但是不在函数内就是全局命名空间

  3,局部命名空间:在函数内的声明的变量

2,命名空间加载顺序:

  当你打开一个py文件,首先开始加载内置命名空间  >  全局命名空间  >   局部命名空间

3,命名空间取值顺序:

  和加载顺序正好相反:局部命名空间  >  全局命名空间  >  内置命名空间

三,函数的嵌套

 顾名思义就是函数内部还存在函数

def func():
    print('666')
    def func1():
        print('您好')
    func1()
函数嵌套

四,函数的返回值

return:可以使用return给调用者返回一个值,如果不写return默认返回None

五,global,nonlocal

global:调用全局变量

nonlocal:调用函数内最近的局部变量(如果在上一层没有找到,就一直往上层找,直到最后也没有找到就报错)【不会找全局变量】

猜你喜欢

转载自www.cnblogs.com/dpStarrysky/p/10533578.html