一,简介
编程语言的函数都可以分为两类:内置函数和自定义函数。在Python语言中,直接可以调用的函数如print()就是内置函数,程序开发者也可以将一些功能写成函数以方便反复使用,自己写函数即自定义函数。
本篇将介绍:
函数定义
函数中的参数传递(值传递、引用传递)
函数参数类型
lambda表达式的使用
二,函数定义
举个简单的例子如下,第一行第二行定义了一个函数,第三行调用函数并将函数的返回值赋给了变量result,最后一行输出result。
def add(num1,num2):
return num1+num2
result=add(1,2)
print(result)#输出3
由此可见Python函数定义还是比较简单的,注意几个规则即可:
函数定义的关键字为def
def所在列的最后要加冒号,应该是提示解释器:“哦,后面就是具体函数实现代码了。”
函数体要换行
需要注意一个有趣的例子如下,如果函数中没有返回值,那么返回值就是空,非常合理!
def test():
print("这是函数test()");
result=test()
print(result)#输出为None
三,参数传递(值传递与引用传递)
与C/C++/Java/C#等语言是类似的,Python中对于变量的传递,依然有着值传递和引用传递的区别。
之前也说过,Python中的变量实际保存的是对象的地址,所以变量可以代表任意类型的Python对象。
那么值传递、引用传递的区别就在于,值传递时函数的参数是在一个新的地址上接受了原参数的值,例子如下,可见num的地址和a的地址不同,num只是复制了a的值,改变num的值并不会改变a的值(修改的是不同地址的内容)。
def numAdd(num):
num=100
print(id(num))#输出1853276320
a=0;
print(id(a))#输出1853273120
numAdd(a)
print(a)#输出为0
那么引用传递就不一样了,因为引用传递就是传递的地址,所以修改了引用的内容,原来参数的内容也就改变了,例子如下,可见引用传递时两个参数指向同样地址。
def listAdd(tempList):
tempList.append(-1)
print(id(tempList))#输出48225224
list1=[1,2,3]
print(id(list1))#输出48225224
listAdd(list1)
print(list1)#输出[1, 2, 3, -1]
OK,一把来说,数字、字符串、元祖这种不能改变内容的对象,是值传递的,其他对象一般是引用传递。
四, 函数参数类型
Python语言作为一种脚本语言,参数的定义非常灵活,需要注意一些语法上的用法,包括:
参数的顺序
参数的默认值
参数的个数
在Python中以上三点都是灵活可变的,用得好了十分犀利,但是也别玩大了用混了就非常麻烦了。
1,参数的顺序问题,在Python中调用函数时可以通过指定参数名来调换参数次序,举个例子就明白了:
def testOrder(param1,param2):
print("参数1:"+param1)
print("参数2:"+param2)
testOrder("1","2")#正常顺序
testOrder(param2="2",param1="1")#通过指定参数名更换顺序,效果与上一句一模一样
2,参数的默认值问题。可以通过在函数定义时指定默认值,然后调用时如果不输入该参数的值,则使用默认值,这个功能还是比较实用的,例子如下:
def testOrder(param1,param2="haha"):#默认值"haha"
print(param1)
print(param2)
testOrder("1","2")#正常调用,输出1 2
testOrder("1")#参数2使用默认值,输出1 haha
3,还是因为Python是一种脚本语言,决定了Python的灵活性需求,所以在Python中参数的个数都是可以自定义的。举个例子如下,如果参数类型写的是*nums,则nums参数可以接受0,1,2或者更多个参数,就是这么简单而方便,厉害了我的星号哥。
def printAll(* nums):
for num in nums:
print(num)
printAll(1,"2",True)#输出1,2,True
五,锋利的lambda 表达式
在Java和C#都有lambda 表达式的情况下,更加灵活的Python怎么可能落于人后,这个可以有,而且也是必须得有啊。
其实lambda 表达式本质上就是一种简化的函数定义方法,正常情况下函数使用def定义且需要换行,lambda 为了快速方便换了个关键字就是lambda ,然后把换行去掉,完事!
例如:
#正常定义函数
def add(num1,num2):
return num1+num2
#将def改为lambda,参数列表去掉(),冒号之后不换行,就OK了。
add=lambda num1,num2:num1+num2;
print(add(1,2))
大家可能也看出来了,lambda简单是简单,但是功能有限,因为冒号之后只能写有限的代码,而且只能访问到lambda参数列表中的参数(无法访问全局参数)。