一,简介

编程语言的函数都可以分为两类:内置函数和自定义函数。在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参数列表中的参数(无法访问全局参数)。