函数的简单概要

      在使用上,函数在各大语言中的应用场景都大同小异(在一些语言当中,函数被称为方法,如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中也有闭包的概念,可以在函数的参数中传入一个函数,本文并未做实例。大多数功能,还需要在实践中摸索。

  

  

  

  

  

 

posted @ 2016-11-28 23:58  佶屈聱牙  阅读(302)  评论(0编辑  收藏  举报