一、位置参数
-
位置形参
函数定义阶段(函数定义第一行)括号内从左往右,依次填写变量名
-
位置实参
函数调用阶段括号内从左往右,依次填写传入的数据值
""" 1.位置形参与位置实参在函数调用时, 按照位置一一对应绑定 2.多一个不行少一个也不行(后面会讲优化,但是也是先设置好形参的内容) 3.格式越简单的越靠前 格式越复杂的越靠后 """
-
关键字实参
函数调用阶段,指定数据值绑定给形参名
!!!关键字实参要跟在位置实参后面
例如: a = 666 b = 777 def test(x, y): print(x, y) test(x = a, y =b) >>>666 777 _________________ test(x = a, 111) >>> SyntaxError: positional argument follows keyword argument!
二、默认参数
-
含义
函数定义阶段赋值某变量名值为啥啥啥,这样就顶下了这个值的默认数据值,如果后续接受实参时对面没说该值为他他他,那就默认值为啥啥啥
-
演示
例: def info(name, age, city='changsha'): print('%s %s %s' % (name, age, city)) info('nike', 18) >>> nike 18 changsha ———————————————————— info('nike', 18, 'beijing') # 用pycharm时,代码栏上方小光标会提醒 >>> nike 18 beijing
-
注意
同样得遵循位置形参优先原则、越简单越靠前原则
三、可变长参数
上述方法传参时都得小心翼翼,一个不留神个数对不上就报错,就很麻 烦,所以有没有办法让函数接受不管多少参数都可以运行
-
可变长形参
-
单一个*
把除开位置参数一一对应的数据值后剩下的数据值打包成一个元组赋值给*后面带的变量名
例1: def fun(*c): print(c) fun(111222) >>> (111222,) # 以前讲过,元组内部就算只有一个数据,也推荐加, ______ fun(111222,666) >>> (111222, 666) ______________________ 例2: def fun(a, b, *c): print(a, b, c) fun(666,777,888) >>> 666 777 (888,) ______ fun(666, 777, 888, 999, ['嘿嘿嘿!', 111]) >>> 666 777 (888, 999, ['嘿嘿嘿!', 111]) # 位置参数的个数对应后剩下的 都是*c的
-
双* ——**
把除开关键字参数一一对应的数据值后剩下的数据值打包成一个字典赋值给**后面的变量名
例1: def fun(**c): print(c) fun(age = 11) >>> {'age': 11} ______ fun(age = 11, name = 'nike', hooby = 'music') >>> {'age': 11, 'name': 'nike', 'hooby': 'music'} _________________ 例2: def fun(a, b, **c): print(a, b, c) fun() >>> 报错!说没有东西填入a b位置 ——————— fun('happy', 'fun', age = 11, name = 'nike', hooby = 'music') >>> happy fun {'age': 11, 'name': 'nike', 'hooby': 'music'}
-
即用*又用**
怎么传位置参数数据值和关键字参数数据值都不影响函数运行
例: def fun(*a, **c): print(a,c) fun(11, 22, 33) # 不给关键字参数数据值就没东西给**c >>> (11, 22, 33) {} ____________ fun(11, 22, 33,name = 'nike', hobby = ['song', 'dance','rap']) >>> (11, 22, 33) {'name': 'nike', 'hobby': ['song', 'dance', 'rap']}
-
推荐星号后面的变量名命名
在设置可变长形参 *与**时,后面的变量名其实写啥都行,但是推荐使用args 和kwargs,pycharm也会智能的提醒,tab快捷按下就可以打全了
-
像上面的def fun(*a, **c) 最推荐的写法
>>>def fun(*args, **kwargs)
-
可变长实参