函数的简单概要
在使用上,函数在各大语言中的应用场景都大同小异(在一些语言当中,函数被称为方法,如oc),主要是为了提高代码的可维护性,python的函数语法也相对简洁,用关键字def来定义。重点在于参数的传递和引用,本文尽量不去讨论形参实参之类的概念,直接用代码对函数的使用做一些简单实例。
首先来看一下函数的定义和使用。python的函数可以自由选择是否有返回值,如果没有返回值则默认为null,并不会报错。python不支持前向引用,因此函数调用必须在函数实现以后,先看一下两个简单的python函数如下:
def simple_func():#定义一个名为simple_func的函数 print("func test")#函数主体 simple_func()#调用函数 def simple_func_two():#定义函数 return "func_two test"#函数的返回值 str = simple_func_two()#调用函数,并用一个变量接收函数的返回值 print(str)#打印变量 #输出结果如下# #/Library/Frameworks/Python.framework/Versions/3.5/bin/python3.5 /Users/penglong/Documents/python/s10/day3/func.py #func test #func_two test #Process finished with exit code 0
在函数使用的时候,大多数是无法离开参数的,因为函数本身就是对数据或者事件进行处理。这个过程会大量涉及对象和变量等相关数据。因此参数是函数中相对比较重要的一点。python的参数可以分为三类,普通参数、默认参数、动态参数。其中动态参数又分为元组和字典两种形式。python属于弱语言,没有指定参数类型的机制,从可读性来说,这一点略坑。示例代码如下:
####普通参数##### def argument_func(name,age,sex):#定义一个函数,它接收三个参数 print("argument_func结果:\nname is:%s,age is:%s,sex is:%s"%(name,age,sex))#函数主体,输出带引用参数的内容 argument_func("lixin",24,"female")#调用函数,直接传入参数 ####输出结果#### #argument_func结果: #name is:lixin,age is:24,sex is:female对于普通参数,没什么值得特别注意的地方,包括类型,python会自动识别 ##默认参数## def static_argument_func(name,age,sex="female"):#定义函数,最后一个参数在定义函数的时候就赋值 print("argument_func_two:结果:\nname is:%s,age is:%s,sex is:%s"%(name,age,sex))#函数主体 static_argument_func("lixin",24)#调用函数,注意我们只传了两个参数 ####输出结果#### argument_func_two:结果: name is:lixin,age is:24,sex is:female#仍然可以输出正确数值 """关于默认参数要注意的是,默认参数只能放在最后的位置。在不传入的值得情况,默认参数使用其函数定义时候的值 如果传入,则使用传入的值""" ##多参数,以元组形式传值## def lot_argument_func(*arg):#定义一个函数,接收多个参数 print("lot_argument_func:结果:\nname is:%s,age is:%s,sex is:%s" %(arg[0],arg[1],arg[2])) lot_argument_func("lixin",24,"female")#调用函数,第一种传值形式 #lot_argument_func(*("lixin",24,"female"))#调用函数,第二种传值形式,仅说明,代码被注释,无输出 ####输出结果#### lot_argument_func:结果: name is:lixin,age is:24,sex is:female """在多参数(元组型)接收时候,我们可以任意传入值且不用变量来接收值,函数默认会生成一个元组存放这些值,使用时 通过元组下标来获取数据,同时,我们也可以直接传入元组。需要注意的是下标不可越界""" ##多参数,以字典形式传值## def lot_argument_func_two(**arg): print("lot_argument_func_two:结果:\nname is:%s,age is:%s,sex is:%s" % (arg["name"], arg["age"], arg["sex"])) lot_argument_func_two(name="lixin",age = 24,sex ="female")#调用函数,第一种传值形式 # lot_argument_func_two(**{"name":"lixin","age":24,"sex":"female"})#调用函数 #第二种传值形式仅说明,代码被注释,无输出 ####输出结果#### lot_argument_func_two:结果: name is:lixin,age is:24,sex is:female """多参数(字典型)是对元组的补充,有时候我们可能需要对数据进行命名,那元组形式的参数就不能满足需求, 从而需要用到字典形式的传参方法。用法如图所示,函数默认生成字典,也可以直接传入字典。python3废 弃了has_key方法检测字典是否含有元素,转而使用if key in dict"""
以上代码是对python函数传参形式一个基本概括。需要说明的是,只作为函数示例。在运用当中,无论是对元组的取值,还是对字典的运用都是极为不对的。对于元组而言,要防止下标越界。对于字典而言,应该先检测是否含有key,或者给出错误防御机制。在多参数的时候,其实我们也可以要求使用者传入必须参数,例如在函数中给一个判断,如果某参数不存在,则抛异常等。
匿名函数:
从使用上来讲,匿名函数用的相对较少,但在某些场景确实很方便,也让代码更为简洁。python的匿名函数也是用关键字定义,代码如下:
g = lambda x:x**3 #匿名函数 关键字lambda。后面是函数主体例如求x的3次幂 print(g(5))#调用函数,传入5。输出结果为125. #以上例子看不太出匿名函数的好处,下面给个实例 print(list(map(lambda x:x**2,range(10))))#map例子 python3之后map函数必须要使用list接收 输出结果如下: /Library/Frameworks/Python.framework/Versions/3.5/bin/python3.5 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81] Process finished with exit code 0 """如上,当函数极为简短,比如单纯处理一下数据或者简单字符串且 只使用一次的时候,我们无需特意去定义一个函数而直接可以用一行 代码完成需求。这就是匿名函数"""
以上大致是python函数的基础内容,只有基本使用方法,python中也有闭包的概念,可以在函数的参数中传入一个函数,本文并未做实例。大多数功能,还需要在实践中摸索。