【函数篇】初识函数,函数的定义、返回值、参数

函数的定义用def:

def func():  #func为函数名,定义方式与变量一样
    i = '你好,函数'
    return i  #返回值
l = func()   #以函数名方式直接调用函数
print(l)

函数的返回值return:

  可以为一个值

  可以为多个值:接收时可以用一个变量接收,一个变量接收时返回为元组类型;可以用多个变量分别接收

def func():
    i = '你好,函数','你好,艾克','你好,李'
    return i
l = func()
l1,l2,l3 = func()
print(l)
print(l1,l2,l3)

输出:

('你好,函数', '你好,艾克', '你好,李')
你好,函数 你好,艾克 你好,李

函数的参数:

  形参(接收的参数):

    位置参数,*args,默认参数(关键字参数),**kwargs:

      总共四种,可以相互结合,结合使用时,位置参数必须放在第一位;可以为空;四种一起使用时,必须按照这个顺序;

      位置参数必须传,*args可以接收多个参数;默认参数可以不传,传送时必须在**kwargs前面;**kwargs可以接收多个关键字参数;

      *args返回为元组,**kwargs返回为字典

      位置参数,多个返回值以一个变量接收时,返回为元组,可以分别用多个变量对应接收,返回值为原始数据类型

      关键字参数(默认参数)传送可以打乱位置,多个返回值以一个变量接收时,返回为元组,可以分别用多个变量对应接收,返回值为原始数据类型。

  实参(传送的参数):按位置传;按关键字传;前两者混合使用时,传送的位置参数必须在前

def func(a,b,c):
    return a,b,c
l = func('你好,函数','你好,艾克','你好,李')
l1,l2,l3 = func('你好,函数','你好,艾克','你好,李')
print(l)
print(l1,l2,l3)


#打印:
('你好,函数', '你好,艾克', '你好,李')
你好,函数 你好,艾克 你好,李
位置参数,按位置传送,多个返回值以一个变量接收时,返回为元组,可以分别用多个变量对应接收,返回为原始数据类型
def func(a='',b='',c=''):
    return a,b,c
l = func(b='你好,函数',a='你好,艾克',c='你好,李')
print(l)

#打印:
('你好,艾克', '你好,函数', '你好,李')


def func(d,a='',b='',c=''):
    return a,b,c,d
l = func('aike',b='你好,函数',a='你好,艾克',c='你好,李',)
print(l)

#打印:
('你好,艾克', '你好,函数', '你好,李', 'aike')
关键字(默认参数)传送可以打乱位置,多个返回值以一个变量接收时,返回为元组,可以分别用多个变量对应接收,返回为原始数据类型。但和位置传输混合使用时,位置参数必须在第一位,否则会报错
def func(a,*args,b = 'ak'):
    return a,args,b
l = func('你好,函数','你好,艾克','你好,李',b = 'aike')
l1 = func(1,2,3,4)
print(l)
print(l1)

#打印:
('你好,函数', ('你好,艾克', '你好,李'), 'aike')
(1, (2, 3, 4), 'ak')
*args,可以接收多个参数,不能以关键字传输,可以为任意数据类型,和位置参数混合使用时,位置参数必须在第一位,如果放在后边,传值时传不到,会报错 如果和默认参数混合使用时,默认参数必须放在*args后边,且默认参数进行传值时,同样需要在最后边
def li(**kwargs):
    return kwargs
l = li(s = '柚柚柚切克闹',d = '小李小李可爱无比',f = '是的')
print(l)

#打印:
{'s': '柚柚柚切克闹', 'd': '小李小李可爱无比', 'f': '是的'}


def func(a,*args,b = 'ak',**kwargs):
    return a,args,b,kwargs
l = func('你好,函数','你好,艾克','你好,李',b = 'aike',s = '柚柚柚切克闹',d = '小李小李可爱无比')
l1 = func(1,2,3,4)
print(l)
print(l1)

#打印:
('你好,函数', ('你好,艾克', '你好,李'), 'aike', {'s': '柚柚柚切克闹', 'd': '小李小李可爱无比'})
(1, (2, 3, 4), 'ak', {})
**kwargs,可以接收多个关键字参数,返回为字典,不能按照位置传,混合使用时,排最后,否则传输顺序错乱,会报错

上面的*args和**kwargs称为动态传参,是站在形参的角度。那么站在实参的角度如何进行动态传输:
def func(*args):
    return args
l = ['你好','函数','你好','艾克','你好','']
print(func(*l))
print(func(*['你好','函数','你好','艾克','你好','']))
print(func(l))

#打印:
('你好', '函数', '你好', '艾克', '你好', '')
('你好', '函数', '你好', '艾克', '你好', '')
(['你好', '函数', '你好', '艾克', '你好', ''],)
形参为*args时,在传参时给序列加一个*即可,如果不添加*,打印出来的是将它以一个整体当作元组的方式打印
def func(**kwargs):
    return kwargs
l = {'a':'你好函数','b':'你好艾克','c':'你好李'}
l1 = {'a':'你好函数'}
print(func(**l))
print(func(**{'a':'你好函数','b':'你好艾克','c':'你好李'}))
print(func(**l1))

打印:
{'a': '你好函数', 'b': '你好艾克', 'c': '你好李'}
{'a': '你好函数', 'b': '你好艾克', 'c': '你好李'}
{'a': '你好函数'}
形参为**kwargs时,在传参时在字典前加两个*即可,即**。由于**kwargs的返回值是字典,所以在实参的角度进行动态传输必须以字典形式传入参数,否则会报错
原文地址:https://www.cnblogs.com/aizhinong/p/11347752.html