您的位置:首页 > 编程语言 > Python开发

Python基础概念_5_函数

2017-06-16 08:57 239 查看

函数

6 函数

6.1 简介

函数是被定义的完成指定功能的可被反复使用的代码段。比如我们想实现一个功能,想知道当前的时间,格式是:年-月-日 时:分:秒。我们就可以这么写:

import time

def getCurrentTime():

    return time.strftime('%Y-%m-%d%H:%M:%S',time.localtime(time.time()))

然后调用它

print("当前系统时间是:\t"+getCurrentTime())

结果是:

2017-03-08 22:40:20

6.2 函数的定义

通过以上例子我们不难发现,函数一般有以下特征:

a) 函数要先定义再使用

b) 函数可以被反复调用

c) 函数一般都带有返回值,代表它完成的功能。返回的可以是个字符串、列表、字典当然也可是是空,也就是None。

 

函数定义时一般以def关键字开始,空格之后起个函数名字,然后紧跟个括号,括号里可以指定参数,然后是冒号,这个冒号后面的缩进行就是函数体(即函数真正的实现的功能)。函数一般是有返回值即要return的,如果不加则返回None。

 

 

6.3 函数的参数

关于函数的参数,一般我们按照形参和实参来区分。这里先定义一个取长方形面积的函数,然后我们再调用它,结合整个过程来说明下。

defgetRectangleArea(length,breadth):

    return length*breadth

len = 6

width=4

print("当前长方形的面积是:\t"+str(getRectangleArea(len, width))+"平方米")

结果:

当前长方形的面积是: 24平方米

 

分析下代码:这里len和width是在函数外定义的变量也就是实参,即函数getRectangleArea被调用时传过来的值,而函数内部的length和breadth则是形参,当函数被调用时len和width分别将值拷贝给了length和breadth,这两个形参参与函数体里的乘运算,将length*breadth返回。函数执行后形参length、breadth将不复存在。而实参len和width还是保留原来的值。

形参、实参可以通俗的这么理解:实参是调用时参数的实际值而形参则是一种抽象的参数。比如这里我们抽象出两个参数长和宽,那么无论什么样的长方形都可以套用长乘以宽这个公式计算面积。即实参是可变的,而形参是固定的抽象值。

 

按照函数的使用情况,一般将将函数的参数分为以下几类:

Ø  必须参数

Ø  关键字参数

Ø  默认参数

Ø  不定长参数

6.3.1 必须参数

即参数必须得传的,如上例,如果我们像下面这样执行时会报缺少参数的错误。

print("当前长方形的面积是:\t"+str(getRectangleArea(len))+"平方米")

错误提示:

TypeError:getRectangleArea() missing 1 required positional argument: 'breadth'

原因很简单,这里我们定义函数getRectangleArea时指明了需要2个参数,但是我们调用时只给了1个参数,所以报错了。

6.3.2 关键字参数

关键字参数是函数调用时,在函数括号里对参数进行赋值时可以通过参数名自动匹配,而不需严格函数定义的参数顺序。这里需要实参和形参的名字要严格一致。所以getRectangleArea我们还可以这么调用:

 

 

#为了更好的说明关键字参数,这里新增我们打印出形参的值的功能。

def getRectangleArea(length,breadth):

return "形参里的长度是:"+str(length)+"\t形参里的宽度是"+str(breadth)+"\n当前长方形的面积是:"+str(length*breadth)

#注意这里的参数传递并不是严格按照函数定义的length在前,breadth在后。Python会自动通过参数名匹配到函数里的形参。

print(getRectangleArea(breadth=4,length=6))

结果:

 

内部的长度是:6  内部的长度是4

当前长方形的面积是:24

 

但是如果我们使用关键字函数时调用参数里的名字不跟形参一致则会不合法的关键字参数的报错。比如调用时这么写:

print(getRectangleArea(breadth1=4,length=6))

TypeError:getRectangleArea() got an unexpected keyword argument 'breadth1'

6.3.3 默认参数

函数被调用时,如果没对参数指定可以使用函数定义里的默认值。

 

#这里给宽度定义个默认值是2

defgetRectangleArea(length,breadth=2):

return "形参里的长度是:"+str(length)+"\t形参里的宽度是"+str(breadth)+"\n当前长方形的面积是:"+str(length*breadth)

来看下我们之前的调用:

print(getRectangleArea(breadth=4,length=6))

 

结果:

内部的长度是:6  内部的长度是4

当前长方形的面积是:24

再对比默认值的调用:

#这里没传宽度breadth,但会按照默认2参与面积的计算即5*2=10

print(getRectangleArea(length=5))

结果:

内部的长度是:5  内部的长度是2

当前长方形的面积是10

 

注:函数默认值定义有一个注意的地方:

如果一个函数的参数列表里有一个参数指定了默认值,那么它后面的参数必须得指定默认值。

比如;我们指定了长度的默认值是4,但是没有指定宽度的默认值。

defgetRectangleArea(length=4,breadth):

    return "内部的长度是:"+str(length)+"\t内部的长度是"+str(breadth)+"\n当前长方形的面积是"+str(length*breadth)

 

那么我们调用时会报没有指定默认值的错,这是python的一个规定,大家要紧记。

print(getRectangleArea(length=5))

 

结果:

SyntaxError:non-default argument follows default argumentault argument

6.3.4 不定长参数

以上的函数参数都是我们在函数定义时指定好的,也就是说参数的多少是固定的。如果有一个需求:灵活的给函数传递参数,换句话说函数的参数不固定。怎么做到呢?我们可以通过在参数前加个*来代表参数是可变的。还是赶紧上代码吧:

 

这里假设有个抽象的方法可以计算“多边形面积”的公式即是不定的参数的乘积。类似数学里的阶乘的概念。

 

defgetPolygonArea(area,*vars):

    for var in vars:

        area*=var   

return "多边形的面积/体积是:"+str(area);

 

那么我们用这个函数计算长方形的面积时可以这样调用:

print(getPolygonArea(1,10,2))

结果:

多边形的面积/体积是:20

 

计算长方体的体积时以这样调用:

print(getPolygonArea(1,10,2,4))

结果:

多边形的面积/体积是:80

6.4 变量的作用域

6.4.1 全局变量

在函数外定义的变量一般叫做全局变量,它不会随函数的调用而改变。

6.4.2 局部变量

在函数内定义的变量一般叫做局部变量,它的生命周期仅限于函数内。

 

6.5 总结

本章我们学习了很多关于函数的基础知识,这里有函数的定义、函数的参数声明方式,变量的作用域等,当然一些函数的高级部分并没有涉及,但这些足以满足我们的基本使用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: