函数的进阶

一、函数参数—动态传参

1、动态的接收位置参数

 参数位置编写* 表示接收任意内容,有多个参数传进去,收到的内容是元组tuple

def func(*food):
    print(food)
func("","米饭","面包","馒头")


先位置参数,后动态参数

def chi(a,b,*food):
    print(a,b,food)
chi("米饭","面条","","","小菜")

默认值参数

def chi(a,b,*food,c="哇哈哈"):
    print(a,b,food,c)
chi("腊肠","甜点","油条","大面包")      #默认值生效

2、动态接收关键字参数
在python中使用**来接收动态关键字参数

def fun(**args):
    print(args)
fun(a=1,b=2,c=3,d=4)

在上面的程序中接收到是:字典
最终的顺序:

位置参数>*args>默认值参数>**kwargs

这四种参数可以任意使用

如果想接收所有的参数,用*args和**kwargs

def func(*args,**kwargs):
    print(args,kwargs)
func("小明","18",a=1,b=2)

动态参数的另一种传参方式

def func(*args):
    print(args)
lst = [1,2,3,4,5]
func(lst[0],lst[1],lst[2],lst[3],lst[4])


在实参位置上给一个序列,列表,可迭代对象前面加*表示把这个序列安位置打散

def func(*args):
    print(args)
lst = [1,2,3,4,5]
func(*lst)


在形参的位置上,加*表示聚合

如果是一个字典,也可以进行打散,但需要两个*

def func(**kwargs):
    print(kwargs)
dic = {"a":1,"b":2,"c":3}
func(**dic)

3、函数的注释

def func(a,b):
    '''
                       这里是函数的注释,解释一下这个函数是干什么的
    :param a:          参数a是干什么的
    :param b:          参数b是干什么的
    :return:           返回的是啥
    '''
    print(a,b)

二、命名空间
1、全局命名空间——我们在py文件中,在函数外声明的是变量叫全局命名空间

2、局部命名空间——在函数中声明的变量叫局部命名空间

3、内置命名空间——python解释器为我们提供的名字,如:list  tuple  str  int  都是内置命名空间

加载顺序

内置命名空间、全局命名空间、局部命名空间(函数被执行的时候)

取值顺序

局部命名空间、全局命名空间、内置命名空间

作用域

1、全局作用域:全局命名空间+内置命名空间

2、局部作用域:局部命名空间

我们可以通过globals()查看全局作用域的内容,也可以用locals()查看局部作用域的内容

三、函数的嵌套

global表示:不在使用局部作用域中的内容,而改用全局作用域的变量

nonlocal表示:在局部作用域中,使用父级局部命名空间的变量

原文地址:https://www.cnblogs.com/sypx/p/9449961.html