函数基础--函数的定义和调用,参数与返回值

来源:互联网 发布:博微预算软件 编辑:程序博客网 时间:2024/05/16 15:30

函数的定义和调用:

def func(para,para1,para2...): # 定义函数        funct_body        return value    value = func(arg, arg1, arg2...)#调用函数,传递参数,接收返回值    print(value)

返回值

返回值为None:函数中没有return 或者 return后面没有值 。

return关键字:返回函数计算的值,结束函数
返回一个值,可以是任意的数据类型,返回什么就接收什么
返回多个值:
1,用一个变量去接收,得到打包多个值的元组
2,用多个变量去接收,返回值的个数和接收变量的个数要保持一致

def func(*args):    return argsprint(func(1, 2, 3, 4, 5))>>>(1, 2, 3, 4, 5)

参数(argument):

函数参数分为实际参数(实参),形式参数(形参)。
实参是传递给函数执行的对象,形参则是供实参指向的变量
因此看一段函数代码,看实参不看形参,形参就是实参的指向。

站在传参(实参)的角度考虑参数,有两种传参类型:

位置参数(positional argument) 实参对象位置发生变化,返回值也会发什么变化(其实还是“引用”吧)
关键字参数(keyword argument) 在实参中可设置参数为 arg = ‘para’ , arg1 =’para1’
,arg2 = ‘para2’ 无论arg,arg1,arg2的位置怎么变化, 返回值都会按关键字参数规定检索返回相应的值。
注意:位置参数和关键字参数混用时, 关键字参数要在后。为什么?规定,要不报错。

站在接收参数的角度考虑:

位置参数(positional argument)

默认参数 (default argument) 处理数据时,可将数据中重复量比较大的值设为默认参数。 def func(para,
default=): func_body return values 如果实参给默认参数传递了数据,传什么接收什么。
‘陷阱’—>默认参数尽量避免可变数据类型,同样位置参数要在默认参数的前面。
动态参数

#关于默认参数的‘陷阱’问题def extendlist(val, list=[]):    list.append(val)    return listlist1 = extendlist(10)  # list1和list2共用的是一个列表list2 = extendlist(123, []) # list3传了一个新列表list3 = extendlist('a')print(list1)print(list2)print(list3)

动态参数:
当不确定传参个数时可以使用动态参数接收传参。

*参数名,常用*args,接收所有的位置参数。

def func(*args):    return valueprint(func(arg1,arg2,arg3,arg4....))
#求和函数def my_sum(*args):    sum = 0    for i in args:        sum += i    return sumret = my_sum(1, 2, 3, 4)print(ret)# 那如果要传一个列表呢,会返回什么?ret = my_sum([1, 2, 3, 4, 5])print(ret)  # >>> TypeError: unsupported operand type(s) for +=: 'int' and 'list'#动态参数的陷阱
def func(*args):    print(args)func([1, 2, 3, 4, 5])#>>>([1, 2, 3, 4, 5],)#可以看到传递不是列表中的元素,而是整个列表如果要实现传递元素的效果,在列表前面加*就可以。不仅仅适用于列表,对于元组,字符串也同样适用,*list,*tuple, *string可以迭代的传入自身所包含的元素def func(*args):    print(args)func(*[1, 2, 3, 4, 5])func(*[1, 2, 4, 5, 6], *[7, 8, 9, 10, 11])func(*'abc', *'efg', *'khi')#>>>(1, 2, 3, 4, 5)(1, 2, 4, 5, 6, 7, 8, 9, 10, 11)('a', 'b', 'c', 'e', 'f', 'g', 'k', 'h', 'i')

因此,
*args 的陷阱:
如果想把一个可迭代对象传进函数执行,但是执行对象是可迭代对象中的元素,这时需要在可迭代对象前面加上*,可以把每一个元素迭代的传入函数。

**参数名,常用**kwargs,接收所有的关键字参数。

def func(**kwargs):    print(kwargs)func(name='mui', age=19, hobby='movies')  # >>> {'name': 'mui', 'age': 19, 'hobby': 'movies'}会以字典的形式返回

形参角度,所有的参数类型混合时

def func(para, *args, key=None, **kwargs):    pass

原因:

位置参数必须在前, 如果*args在前会接收所有的位置参数,
而默认参数(关键字参数)又不能在位置参数前面。
默认参数不能在*arg前面,如果传多个位置参数,
可能前面的位置参数接收不过来,而默认参数只能接收一个值,
多的就不知道接收哪个了就会报错。>>>func() got multiple values for argument ‘key’
**kwargs也不能在默认参数前面,会接收所有的关键字参数。
且传什么返回什么,动态参数可以不传,但是位置参数必须得传。

def func(a,*args,key = 'qqxing',**kwargs):    print('a : ',a)    print('args : ',args)    print('key : ',key)    print('kwargs : ',kwargs)func(5)func(5,6,7)func(5,6,7,b='hahaha',c='hehehe')func(5,6,7,key='小小酥',b='hahaha',c='hehehe')func(5,b='hahaha',c='hehehe')
阅读全文
1 0
原创粉丝点击