函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。
函数能提高应用的模块性和代码的重复利用率。
Python有很多内置函数可以供开发者直接使用。
也可以在交互式命令行通过help(函数名)查看函数的帮助信息。
Python内置函数
自定义函数规则:
调用Python的函数,需要根据函数定义,传入正确的参数。
def area(width, height): # 计算面积函数 return width * height width = int(input('宽:')) height = int(input('长:')) print('面积是:{0}'.format(area(width,height)))
位置参数须以正确的顺序传入函数,且调用时的数量和声明时一样
area(5,10)
关键字参数允许你传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict
关键字参数的表现形式:
1. 在参数前加两个*,可以传入任意不受限制的关键字参数 2. 命名关键字参数,限制传入关键字参数的名字,命名关键字参数需要一个特殊分隔符*
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')
默认参数可以简化函数的调用,降低调用函数的难度
设置默认参数时需要注意以下几点:
1. 默认参数必须指向不可变对象 2. 默认参数必须放在必须参数后 3. 当存在多个默认参数时,如果某个参数非默认值,需要把参数名写上
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个。
可变参数有两种表现形式:
1. 定义位置参数,调用的时候,先组装成一个list或tuple 2. 定义可变参数,在参数前加一个*,调用时可以传任意个参数也可以在list或tuple前加*传入
def sumall1(numbers): sum = 0 for i in numbers: sum = sum + i*i return sum sumall1((1,3,5))
def sumall(*numbers): sum = 0 for i in numbers: sum = sum + i*i return sum list = [2,4,5] sumall(*list)
Python中各种参数可以组合使用,但定义顺序必须是:位置参数、默认参数、可变参数、命名关键字参数和关键字参数。
建议不要同时使用太多的参数组合,否则函数接口的可理解性很差。
默认参数一定要用不可变对象,如果是可变对象,程序运行时会有逻辑错误!
*args是可变参数,args接收的是一个tuple;
**kw是关键字参数,kw接收的是一个dict
命名的关键字参数是为了限制调用者可以传入的参数名,同时可以提供默认值。
定义命名的关键字参数在没有可变参数的情况下不要忘了写分隔符*,否则定义的将是位置参数。
Python也可通过lambda创建函数,不需要像def那样标准的形式去定义
lambda的主体是一个表达式,而不是一个代码块。仅仅能在lambda表达式中封装有限的逻辑进去。
lambda 函数拥有自己的命名空间,且不能访问自己参数列表之外或全局命名空间里的参数。
语法格式如下:
lambda [arg1 [,arg2,.....argn]]:expression
for_x = lambda arg1,arg2: arg1*arg2 for_x(5,10)
函数在内部调用自身本身
递归函数的优点是逻辑简单清晰,缺点是过深的调用会导致栈溢出。
每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出。