定义函数

在python中,使用关键字 def 定义一个函数,依次为函数名,括号、参数和冒号:,python这种脚本语言采用缩进的方式对齐(而不是c++或java中的括号),以指定作用域。因此,在缩进块中编写函数体,并以return语句返回。
注意,在python的函数结构中,是没有C++或java中的声明返回值类型,这是因为函数返回的时候可以根据返回结果自动推导出类型。
例如:
def my_func(x): // 函数声明
    if x>=0:  // if语句,在语句结尾必须以冒号结束,不然会产生编译错误
        return 1 // 注意没有分号
    else:  // 和if语句类似
        return 0
 
空函数
python中使用关键字pass可以定义一个什么都不做的空函数,例如
def nop():
    pass // 如果不加这一句,会报错
 
pass的意义:pass语句在执行的时候,什么都不做。(1)避免出现语法错误;(2)作为占用符,如果在定义接口的时候,由于不需要做什么事或者没有想好做什么,那么可以用pass语句代替。
 
 
函数调用
在python中,所有函数可以看做是函数对象(类似于C++标准库中的函数对象),因此,可以将函数名(如funcA)赋给一个变量(a),那么此时变量(a)就是该函数(funcA)的一个别名,通过a调用函数和通过funcA调用将达到一样的效果。
与C++或java中类似,python中函数调用时,指定函数名和实际参数即可。
如上例中的函数my_func()调用可以如下:
my_func(1);  my_func(2.0);
 
函数参数
在函数调用时,会检查实际参数的个数和类型,如果有一项不对,会抛出TypeError错误提示。
python解释器可以通过函数调用检查出参数个数不一致情形,但是类型匹配却分不同情况:(1)对于内置的函数,如abs()等会自动进行参数类型不一致检查(2)对于自定义函数,python解释器则没有义务去帮我们检查参数类型,此时,需要函数定义者自己进行检查。
python中,数据类型的检查可以使用内置函数isinstance实现。例如my_func函数改装后如下:
def my_func(x): 
    if not isinstance(x, (int,float)): // 这句的意思是,首先判断x是否是int或float类型数据,如果不是,则抛出错误TypeError
        raise TypeError('bad type')
    if x>=0:  
        return 1 
    else: 
        return 0
1、python中,也可以给函数的参数定义默认形参(如C++),如:
def  funcA(x=1)
    return x
2、可变参数
将函数的形参前面加上*符号,可以将该参数变为可变参数,此时,该参数接收到的可以看做是一个tuple,调用该函数时,可以传入任意个参数,包括0个参数。

*args是可变参数,args接收的是一个tuple(元组);

**kw是关键字参数,kw接收的是一个dict(字典)。

函数返回值
python中的函数在语法上可以返回多个返回值,这点不同于c++或java。这种语法特性与tuple(元组)有关。即函数返回多个返回值的时候,实际上返回的是一个元组。
例如:
def getPoint():
    x = 0.0
    y = 0.0
    return x,y
 
x,y = getPoint() 或 
p = getPoint()
 
 
递归函数
递归函数就是在函数内部调用自己的函数,最典型的就是斐波那契函数了。
def fact(x):
    if n==1:
        return 1
    return x*fact(x-1)
使用递归函数需要注意防止栈溢出问题(可以用尾递归优化解决该问题)。所谓栈,一般是指函数调用时使用的栈帧结构,每调用一个函数,栈就会增加一层栈帧,每从一个函数返回,栈就会减少一层栈帧。
与栈相对应的是堆结构,即程序在运行时动态申请的内存空间。
posted on 2016-05-18 20:30  ctw2c  阅读(81)  评论(0)    收藏  举报