20201112-1 函数式编程之参数详解2

  3. 默认参数 3-1-1 def test(x,y=2):     print(x)     print(y) # 在写形参的时候,提前赋值,等于 2 了  test(1) --->  1 2 没有赋值给y,因为 y 是默认等于 2   3-1-2 可以赋值吗? def test(x,y=2):            print(x)     print(y) test(1,y=3)          # 关键字调用 --->  1 3   3-1-3 def test(x,y=2):     print(x)     print(y) test(1,3)           # 位置调用 --->  1 3 # 默认参数特点:调用函数的时候,默认参数非必须传递 # 用途: # 1. 默认安装值   比如,安装软件,默认一键安装,和自定义安装的区别 # 2. 比如连接数据库端口号   3-1-4  1. 默认安装值 def test(x,soft1=True,soft2=True):     print(x) 2. 比如连接数据库端口号 def conn(host,port=3306):     pass   4. 参数组 def test():     pass # 前面提到的,位置参数,关键字参数,默认参数;参数定义好后,都有一个特点,调用个数超过形参,就报错,少了也不行 # 默认参数在参数调用时,可有可无 需求:实参数目不固定,形参应该如何定义? 参数组的定义:*args (变量名随意) 方式1 def test(*args):     print(args) test(1,2,3,4,5,5) # 形参以 *开头,定义一个变量名 方式2 def test(*args):     print(args) test(*[1,2,4,5,5])     # *args = *[1,2,3,4,5] 会变成元组 -→ args = tuple([1,2,3,4,5]) # *代表一个功能,是一个功能代号   4-1 将* 和位置参数结合起来 def test1(x,*args):     print(x)     print(args) test1(1,2,3,4,5,6,7) --->  1 (2,3,4,5,6,7) 应用:函数在定义时,业务发展一段时间后,参数可能会不够,这样只能改源代码,为了避免不多传一个参数就改源代码就会用到了,以后会经常用到 元组就是 只读列表   4-2 可以传字典吗? def test2(**kwargs):     print(kwargs) test2(name='gabriel',age=8,sex = '?')     # name相当于 key  gabriel 相当于 value;可以无限向下传 # 会将 三个 关键字参数传给 kwargs --->  {'name': 'gabriel', 'age': 8, 'sex': '?'} # 这就是把关键字转换成字典的方式 存放起来 # **kwargs: 把关键字参数,转换成字典的方式   4-2-1 可以跟位置参数吗? def test2(**kwargs):     print(kwargs)     print(kwargs['name'])     print(kwargs['age']) test2(**{'name':'gabriel','age':8}) --->  {'name': 'gabriel', 'age': 8} gabriel 8   4-2-2 可以跟位置参数吗? def test3(name,**kwargs):     print(name)     print(kwargs) test3('gabriel') --->  gabriel {} # name 必须指定一个值,kwargs 需要指定一个吗?   4-2-2-1 def test3(name, **kwargs):     print(name)     print(kwargs) test3('gabriel','xxx') # 'xxx' 是位置参数,不是关键字参数,所以会报错,相当于给 name 赋值两个 # 所以,应该用 关键字的方式去写

 

4-2-2-2 def test3(name,**kwargs):     print(name)     print(kwargs) test3('gabriel',age=18000,sex='N') ---> gabriel {'age': 18000, 'sex': 'N'} # 这是和位置参数结合   4-2-3 如果和默认参数加一起 参数组有两种方式 *args 接收多个参数,转成元组的形式 **kwargs 把关键字参数,转换成字典的方式 # 可以把默认参数写在后面吗?不可以!!一定要放前面! 参数组一定要往后放!! def test4(name,age=10000,**kwargs):     print(name)     print(age)     print(kwargs) test4('celestial',sex='N',hobby='sleep') ---> celestial 10000 {'sex': 'N', 'hobby': 'sleep'}

 

4-2-3-1 def test4(name,age=9999,**kwargs):     print(name)     print(age)     print(kwargs) test4('gabriel',sex='N',hobby='fly',age=99999999) ---> gabriel 99999999 {'sex': 'N', 'hobby': 'fly'} # 结果同样可行,给默认参数赋值时,默认参数可以不赋值,可以以位置参数的方式赋值,也可以关键字赋值对应   4-2-3-2 def test4(name,age=0,**kwargs):     print(name)     print(age)     print(kwargs) test4('gabriel',99999,sex='N',hobby='sleep',age=10000) ---> Traceback (most recent call last):   File "f:/Visual Studio Code/PyFiles/MML/Management_Project_2/blank_module_name/tobp_2.py", line 5, in <module>     test4('gabriel',99999,sex='N',hobby='sleep',age=10000) TypeError: test4() got multiple values for argument 'age' # 多个值给 age了,给默认参数赋值,两种方式,位置参数已经对应了,关键字参数又给对应了一遍,所以报错了   4-3 如果全部放在一起弄呢? def test4(name,age=0,*args,**kwargs):     print(name)     print(age)     print(args)     print(kwargs) test4('gabriel',age=10000,sex='N',hobby='sleep') ---> gabriel 10000 () {'sex': 'N', 'hobby': 'sleep'} # *args 接收的是位置参数,不能接收关键字参数 # *args 接收 N 个位置参数,转换成元组的形式 这里的 *args 无法接收位置参数,所以直接变为 空 sex='N',hobby='sleep' 给 kwargs 了,所以是生成字典 位置参数,不能写关键字参数后面
上一篇:13、函数的参数


下一篇:day85