函数的概念:
有一个超市,a要去买西,走一段距离,b去买东西走一段距离,c去买东西也走一段距离,于是就有了公交车,abc都可以搭这一趟公交车去超市买东西,这里的公交车就是函数。函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。
函数的作用:
后面超市所在的位置扩建,有了菜市场、公园,相应的公交车把站台调整一下即可达到目的地。这样就在节约了人力做重复工作的同时还可以因为扩建而自由的调整公交站线路,这就是在函数里体现的作用----方便扩展、节约代码、提高代码复用性
函数的定义:
def function(params):
block return expression/value
(1)在Python中采用def(define)关键字进行函数的定义,不用指定返回值的类型。
(2)函数参数params可以是零个、一个或者多个,同样的,函数参数也不用指定参数类型,因为在Python中变量都是弱类型的,Python会自动根据值来维护其类型。
(3)return语句是可选的,它可以在函数体内任何地方出现,表示函数调用执行到此结束;如果没有return语句,会自动返回NONE,如果有return语句,但是return后面没有接表达式或者值的话也是返回NONE。
调用函数语法:
函数名(参数表)
举例:
def printme():
'''函数体只用来实现打印语句'''
print("Hello")
printme() #函数的调用
输出:
Hello
函数中的相关概念:
形参、实参:
公交车里有老弱病残孕的专坐,有司机专用座,这些在形式上的一个安排,这些坐位就是函数中的形式参数,简称形参;具体坐什么人在函数中叫实际参数,并不是所有坐在这些坐位上的都是老弱病残,具体要看实际所坐的是什么人。
-----函数后面跟的是形参;实际传的是实参
举例:
def add(a,b): #a、b是形参
'''函数体用来实现两位数的加法'''
return a+b
print(add(1,5)) #实参
值传递、引用传递:
搭车买票有两种方式,一种人工售票,上车前买好票,然后拿着票上车,不管上车后是剪票还是收费的形式,这个票跟对象(上车的人)所拥有的钱或是其它都没关系,这是值传递;另一种买票方式就是直接刷卡,根据车费的金额直接刷卡,这个刷卡会直接影响卡上的余额,这种就是引用传递;
------传递修改值不影响本身对象的值;引用传递修改就是修改本身的值
举例1:
def changenum(numa):
'''值传递:传递的是另一个复制的对象,不会影响本对象的值'''
numa = 20
numb = 10
changenum(numb);
print(numb)
输出
10
举例2:
def changenum1(list1):
'''引用传递:传递的是指向对象的地址,修改会影响对象的值'''
list1.append(0)
list2 = [1,2,6,8]
changenum1(list2)
print(list2)
输出
10
[1, 2, 6, 8, 0]
函数的参数类型:
必备类型
不管是公交车还是其它车,车上的每个零件都有自己的作用,假设一个坐位需要大小不一的4个螺丝来固定,如果只拧3个(必须按传指定参数的个数)或没有按指定大小(按顺序传参)拧螺丝,那么坐位必然就会有倒的风险。
-----这种参数通过位置、依次进行匹配的类型叫必备类型
举例:
def printMe(name,age):
'''必备类型:参数个数与位置都严格匹配'''
print("我叫"+name+",我今年"+str(age)+'岁')
printMe('newdream',19)
输出
我叫newdream,我今年19岁
关键字类型
领导出席活动都有陪同一起,出席时,要么就按顺序先站好再入场就坐(不按关键字,按顺序),要么就直接入场后按名字进行就坐(按关键字指定参数)
-----用参数的命名确定传入的参数值,Python解释器能够用参数名匹配参数值
举例:
def printMe(name,age):
'''关键字类型,一般都指定关键字(不指定关键字也允许)'''
print("我叫"+name+",age的值是"+str(age))
printMe('newdream',7) #不指定关键字
printMe(name = 'newdream',age = 7) #指定关键字
输出
我叫newdream,age的值是7
我叫newdream,age的值是7
3.不定长类型
大巴士的坐位是固定的,如果赶上春运那么以往的班次是远远不能满足客运量的,于是就允许在过道上添加一些板凳充当临时坐位,这样就可以一次性上更多的旅客(可以一次性传多个参数),而不用增加班车的次数(不用重新再定义函数)。
-----’*‘ 和’ ** ‘表示能够接受0到任意多个参数,’ * '表示将没有匹配的值都放在同一个元组中; ’ ** '表示将没有匹配的值都放在一个dictionary中。
举例1:
def busCustomer1(a,*args):
'''不定长类型:允许一次性传一个或多个的参数类型
*:将没有匹配的参数放到一个元组中
'''
print("第一个参数是",a)
for i in args:
print(i,end=' ')
busCustomer1(16)
busCustomer1(1,5,7,9,2,'a',True)
输出
第一个参数是 16
第一个参数是 1
5 7 9 2 a True
举例2:
def busCustomer2(a,**args):
'''不定长类型:允许一次性传一个或多个的参数类型
**:将没有匹配的参数放到一个字典中'''
print("第一个参数是",a)
for i in args:
print("%s %s"%(i,args[i]))
busCustomer2(1,a1='a',a2='c')
输出
第一个参数是 1
a1 a
a2 c
4.缺省类型
搭公交车,会买票,中途N个站,可以自由选择下车站点(可以选择传参),如果搭过头了或是忘记下车了,就终点站下(参数的默认值)
------缺省参数的值如果没有传入,则被认为是默认值。且需注意的是,默认值参数应该放在参数的最后一个
举例:
def defaultArgu(name,age = 19):
'''缺省类型:当没有传参时取默认值,传参了则以参数的值为准
'''
print("我叫"+name+",今年"+str(age))
defaultArgu('newdream')
defaultArgu('newdream',25)
输出
我叫newdream,今年19
我叫newdream,今年25
匿名函数类型
如果说函数是公交车,那么匿名函数就是一辆自行车,在构造上(函数的定义)与功能上(只能是一个表达式)要单一的多
----使用 lambda 来创建匿名函数。