[TOC] >[success] # 函数的使用 >[danger] ##### 经典的 *args 和**kwargs ~~~ 1.*arg 代表的是元祖 2.** kwargs 代表是字典 接受的a = b 这种形式参数变成字典,这里面接受字典不是指的是传的{字典} ~~~ >[danger] ##### 案例 ~~~ def arg(first, *args, **kwargs): print(first,args,kwargs) arg(1, 2, 3, 4) arg(1, [2, 3, 4]) arg(1, {"a": 1, "b": 21}) arg(1, a=1) 打印结果: 1 (2, 3, 4) {} 1 ([2, 3, 4],) {} 1 ({'a': 1, 'b': 21},) {} 1 () {'a': 1} ~~~ >[danger] ##### 也可以返回多个值,是元祖类型 ~~~ def arg(first, *args, **kwargs): return first,args,kwargs print(arg(1,2,c=3)) 打印结果: (1, (2,), {'c': 3}) ~~~ >[danger] ##### 不传递任何值和传递None的区别 * 不传递任何值 ~~~ # 定一个私有变量 _no_value = object() def spam(a, b=_no_value): if b is not _no_value: print(1) ~~~ * 定义一个传入为None ,目前我认为两者区别前者更谨慎 ~~~ def spam(a, b=None): if b is not None: print(1) ~~~ * 超级错误写法,如果b 是一些0 Flase 本身一些表述错误的,这段代码运行就会有问题 ~~~ def spam(a, b=None): if not b: print(1) ~~~ >[danger] ##### 使用初始化变量禁忌 ~~~ 1.不用去使用 那些可变的变量例如[] ~~~ * 错误示范 ~~~ # 错误示范 def a(a,b=[]) ~~~ >[danger] ##### 关于定义默认函数的参数问题 ~~~ 1.不建议下面的这种使用,因为变量声明是在,函数创建的时候就已经声明完毕 2.所以不会因为那你 调用的时候重新定义变量,结果发生改变 ~~~ ~~~ z = 10 def a(x, y=z): print(x, y) a(1) z = 20 a(1) 打印结果: 10 10 ~~~