Hello 小伙伴们大家好!!!
我是猿初
渣渣程序猿,不忘初心,执着向往
前
今天和大家一起来聊聊Python中的函数
言
函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。
函数能提高应用的模块性和代码的重复利用率。
Python函数分类
Function classification

内置函数
自定义函数
匿名函数
递归函数

内置函数


Python 解释器内置了很多函数和类型,您可以在任何时候使用它们。
也可以在交互式命令行通过help(函数名)查看函数的帮助信息。


自定义函数
自定义函数规则
01定义函数以 def 关键词开头,依次写函数名、括号、括号中的参数和冒号
02函数体的第一行语句应使用文档字符串存放函数说明
03通常用return结束函数并返回函数的返回值



调用Python的函数,需要根据函数定义,传入正确的参数。

def area(width, height): # 计算面积函数 return width * heightwidth = int(input('宽:'))height = int(input('长:'))print('面积是:{0}'.format(area(width,height)))
复制
位置参数

位置参数须以正确的顺序传入函数,且调用时的数量和声明时一样
def area(width, height): # 计算面积函数 return width * heightarea(5,10)
复制
关键字参数

关键字参数允许你传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个字典
表现形式

参数前加两个*,可以传入任意不受限制的关键字参数;当需要限制关键字参数的名字时,命名关键字参数需要一个特殊分隔符*
def persion(name,age,**others): print('Name:',name,'age:',age,'other:',others)persion('Henry-chr',26,city = 'Beijing',source = 96)
复制
def persion1(name,age,*,city): print('Name:',name,'age:',age,'city:',city)persion1('Henry-chr',26,city = 'Beijing')
复制
默认参数

默认参数可以简化函数的调用,降低调用函数的难度
注意事项

默认参数必须指向不可变对象;
默认参数必须放在必须参数后;
当存在多个默认参数时,如果某个参数非默认值,需要把参数名写上
;
def persion2(name,age,gender = 'M',city = 'Shanghai'): name = name age = age gender = 'boy' if gender == 'M' else 'girl' city = city print('My name is {0}.\nI am {1} years old.\nI am {2}.\nI am from {3}.'.format(name,age,gender,city))persion2('Henry-chr',26,city = 'Beijing')
复制
可变参数

可变参数就是传入的参数个数是可变的,可以是1个、2个到任意个,还可以是0个。
注意事项

定义位置参数,调用的时候,先组装成一个list或tuple;
定义可变参数,在参数前加一个*,调用时可以传任意个参数也可以在list或tuple前加*传入;
def sumall1(numbers): sum = 0 for i in numbers: sum = sum + i*i return sumsumall1((1,3,5))
复制
def sumall(*numbers): sum = 0 for i in numbers: sum = sum + i*i return sumlist = [2,4,5]sumall(*list)
复制
参数小结
默认参数一定要用不可变对象,如果是可变对象,程序运行时会有逻辑错误!
*args是可变参数,args接收的是一个tuple;
**kw是关键字参数,kw接收的是一个dict
命名的关键字参数是为了限制调用者可以传入的参数名,同时可以提供默认值。
定义命名的关键字参数在没有可变参数的情况下不要忘了写分隔符*,否则定义的将是位置参数。
Python中各种参数可以组合使用,但定义顺序必须是:位置参数、默认参数、可变参数、命名关键字参数和关键字参数。
建议不要同时使用太多的参数组合,否则函数接口的可理解性很差。
Python也可通过lambda创建函数,不需要像def那样标准的形式去定义
lambda的主体是一个表达式,而不是一个代码块。仅仅能在lambda表达式中封装有限的逻辑进去。
lambda 函数拥有自己的命名空间,且不能访问自己参数列表之外或全局命名空间里的参数。
for_x = lambda arg1,arg2: arg1*arg2for_x(5,10)
复制

函数在内部调用自身本身
递归函数的优点是逻辑简单清晰,缺点是过深的调用会导致栈溢出。
每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出。

end