python函数函数的参数-实参与形参

发布于 2021-04-17 05:29 ,所属分类:知识学习综合资讯


目录

实参角度:

位置参数

关键字参数

混合参数


形参角度:

位置参数

默认值参数

动态参数*args,**kwargs

仅限关键字参数

形参角度参数的顺序




函数的参数

实参角度

(点击查看大图)



位置参数


位置参数 就是从左至右,实参与形参 按照顺序 一一对应。


def data(name, age, sex):  print('姓名:{}'.format(name))  print('年龄:{}'.format(age))  print('性别:{}'.format(sex))
data('pamela', 18, '女')

(左右滑动查看完整代码)




补充:三元运算符


三元运算符 针对简单的 if...else...

def big_num(a, b):  c = a if a > b else b # 当a>b就把a赋值给c,否则就把b赋值给c  return c
print(big_num(5, 7)) # 7

(左右滑动查看完整代码)




关键字参数


关键字参数 不需要记住每个参数的位置, 只需要记住每个参数的名字,实参与形参 根据参数名字 一一对应。


def data(name, age, sex):  print('姓名:{}'.format(name))  print('年龄:{}'.format(age))  print('性别:{}'.format(sex))
data(sex='女', name='pamela', age=18)

(左右滑动查看完整代码)




混合参数


在调用函数的时候既可以给出位置参数,也可以指定关键字参数。


注意:位置参数必须在关键字参数的前面。


def data(name, age, sex):  print('姓名:{}'.format(name))  print('年龄:{}'.format(age))  print('性别:{}'.format(sex))
data('pamela', sex='女', age=18) # 关键字参数必须在位置参数后面

(左右滑动查看完整代码)





形参角度

(点击查看大图)



位置参数


位置参数 与实参角度的位置参数是一样的,实参与形参 按照位置从左至右,一一对应。


def data(name, age, sex):  print('姓名:{}'.format(name))  print('年龄:{}'.format(age))  print('性别:{}'.format(sex))
data('pamela', 18, '女')

(左右滑动查看完整代码)




默认值参数


在定义函数的时候,就可以给出函数参数的默认值,默认值参数 一般是这个参数使用频率较高,才会设置默认值参数。


注意:位置参数必须在默认值参数的前面。


如果实参不传参,则形参使用默认参数;如果实参传参,则形参使用实参传的参数。


def data(name, age, sex='女'): # 默认值参数必须在位置参数后面  print('姓名:{}'.format(name))  print('年龄:{}'.format(age))  print('性别:{}'.format(sex))
data('pamela', 18)

(左右滑动查看完整代码)




动态参数


位置参数 和 默认值参数,函数调用时传入多少实参,必须写等数量的形参去对应接收,如果在传参时不清楚有哪些形参,或者给一个函数传了很多实参,就要对应写很多形参,这样会很麻烦,这时候就可以使用动态参数(也叫万能参数)。


动态参数是一种形参,可以接收所有的实参。


动态参数分为两种:动态接收位置参数 *args,动态接收关键字参数**kwargs。



1.动态接收位置参数 *args


def data(*args):  print(args, type(args)) # ('pamela', 18, '女') <class 'tuple'>  print(*args) # pamela 18 女  print('姓名:{},年龄:{},性别:{}'.format(*args)) # 姓名:pamela,年龄:18,性别:女
data('pamela', 18, '女')

(左右滑动查看完整代码)


解释:


args:args就是一个普通的形参,可以换成其他变量名,但是约定俗成写成args;


*:在定义函数的时候,args前面加 *,就拥有了特殊的意义,这个形参会将实参所有的位置参数接收,放置在一个元组中,并将这个元组赋值给args这个形参。


'''传入函数中数量不定的int型数据,函数计算所有数的和并返回'''
def num_sum(*args): sum = 0 for i in args: sum += i return sum
print(num_sum(1, 2, 3, 4, 5, 6, 7, 8, 9)) # 45

(左右滑动查看完整代码)




2.动态接收关键字参数**kwargs


def data(**kwargs):  print(kwargs, type(kwargs)) # {'name': 'pamela', 'age': 18, 'sex': '女'} <class 'dict'>  print(*kwargs) # name age sex  data(name='pamela', age=18, sex='女')

(左右滑动查看完整代码)


解释:


kwargs:kwargs就是一个普通的形参,可以换成其他变量名,但是约定俗成写成kwargs;


*:在定义函数的时候,kwargs前面加 **,就拥有了特殊的意义,这个形参会将实参所有的关键字参数接收,放置在一个字典中,并将这个字典赋值给kwargs这个形参。



'''动态参数的写法'''
def data(*args,**kwargs): print(args) # ('pamela', 1, 2, 3) print(kwargs) # {'age': 18, 'sex': '女'}
data('pamela', 1, 2, 3, age=18, sex='女')

(左右滑动查看完整代码)


如果一个参数设置了动态参数,就可以接收所有的位置参数 以及 关键字参数,这样会大大提升函数拓展性,针对实参较多的情况下,解决了一一对应的麻烦。




3.补充:* 的用法


* 在函数中可以分为打散和聚合,在函数外可以处理剩余的元素。



(1)函数的聚合

在函数的定义时, * 起到的是聚合的作用。


形参中动态参数*args、**kwargs中的 * 就是起的聚合作用。函数定义时,* 将所有的位置参数聚合成一个元组,赋值给了args;** 将所有的关键字参数聚合成一个字典,赋值给了kwargs。


def data(*args,**kwargs): # 在函数的定义时, * 起到的是聚合的作用   print(args) # ('pamela', 1, 2, 3)  print(kwargs) # {'age': 18, 'sex': '女'}
data('pamela', 1, 2, 3, age=18, sex='女')

(左右滑动查看完整代码)




(2)函数的打散

在函数的调用时,*起到的是打散的作用。


* 可以把可迭代对象打散成单个元素,** 可以把多个字典打散成单个键值对。

'''没有打散时'''
def data(*args,**kwargs): # 在函数的定义时, * 起到的是聚合的作用 print(args) # ([1, 2, 3], {'name': 'pamela'}, {'age': 18, 'sex': '女'}) print(kwargs) # {}
li = [1, 2, 3]dic1 = {'name': 'pamela'}dic2 = {'age': 18, 'sex': '女'}data(li, dic1, dic2)

'''函数的打散'''
def data1(*args,**kwargs): # 在函数的定义时, * 起到的是聚合的作用 print(args) # (1, 2, 3) print(kwargs) # {'name': 'pamela', 'age': 18, 'sex': '女'}
li = [1, 2, 3]dic1 = {'name': 'pamela'}dic2 = {'age': 18, 'sex': '女'}data1(*li, **dic1, **dic2) # 在函数的调用时,*起到的是打散的作用

(左右滑动查看完整代码)




(3)* 处理剩下的元素


a, *b = (1, 2, 3, 4)print(a, b) # 1 [2, 3, 4]
*rest, a, b = range(5)print(rest, a, b) # [0, 1, 2] 3 4
print([1, 2, *[3, 4, 5]]) # [1, 2, 3, 4, 5]

(左右滑动查看完整代码)




仅限关键字参数


仅限关键字参数是python3更新的新特性,位置要放在*args后面,**kwargs前面,只能通过关键字参数传参,可以当成不设置默认值的默认参数,并且必须要传参数,不传就会报错。


'''仅限关键字参数只接收关键字参数,不传关键字参数执行会报错'''def data(a, b, *args, c):  print(a, b)  print(args)  print(c)  data(1, 2, 3, 4, 5) # TypeError: func() missing 1 required keyword-only argument: 'c'

'''仅限关键字参数正确传参写法:'''def data1(a, b, *args, c): print(a, b) # 1 2 print(args) # (3, 4) print(c) # 5 data1(1, 2, 3, 4, c=5)

(左右滑动查看完整代码)




形参角度参数的顺序

从形参的角度,参数有位置参数、默认值参数、动态参数*args、**kwargs、仅限关键字参数。


首先,位置参数 必须放在 默认值参数前面。


动态参数*args,不能放在位置参数前面,这样位置参数的参数就接收不到具体的实参了,因为args全部接收完了,会把位置参数当成仅限关键字参数。


def data(*args, a, b, c='apple'):  print(args)  print(a, b)  print(c)  data(1, 2, 3, 4, 5) # TypeError: func() missing 2 required keyword-only arguments: 'a' and 'b'

(左右滑动查看完整代码)



动态参数*args,也不能放在默认值参数的后面,这样实参中与默认值参数对应位置的参数始终都会将默认值参数的值覆盖掉,这样就失去了默认值参数的意义。


def data(a,b,c='apple',*args):  print(a, b) # 1 2  print(c) # 3 # 默认值参数的值始终会被覆盖  print(args) # (4, 5)data(1, 2, 3, 4, 5)

(左右滑动查看完整代码)



所以动态参数 *args一定要放在位置参数与默认值参数中间。


动态参数**kwargs不能放在默认值参数前面,代码会直接报错,因为**kwargs会接收所有的关键字参数,就永远也改变不了默认值参数的值。


def data(a,b,*args,**kwargs,c='apple'): # 代码会直接报错  print(a,b)  print(args)  print(kwargs)  print(c)data(1, 2, 3, 4, 5)

(左右滑动查看完整代码)



仅限关键字参数要放在*args后面,**kwargs前面,与默认值参数的前后顺序无所谓。



所以,形参角度的所有形参的最终顺序为:位置参数,*args,默认值参数,仅限关键字参数,**kwargs


def data(a, b, *args, c, d=None, **kwargs):  print(a, b) # 1 2  print(args) # (3, 4)  print(c) # 6  print(d) # None  print(kwargs) # {}
data(1, 2, 3, 4, c=6)

(左右滑动查看完整代码)




相关资源