如果在开发程序时,需要某块代码多次,但是为了提高编写的效率以及代码的重用,所以把具有独立功能的代码块组织为一个小模块,这就是函数
1.定义函数的格式如下:
def 函数名():
代码
# 定义一个函数,能够完成打印信息的功能
def printInfo():
print('------------------------------------')
print( ' 人生苦短,我用Python')
print( '------------------------------------')
定义了函数之后,就相当于有了一个具有某些功能的代码,想要让这些代码能够执行,需要调用它
调用函数很简单的,通过 函数名() 即可完成调用
# 定义完函数后,函数是不会自动执行的,需要调用它才可以
printInfo()
运行结果:
>>> def test(a,b):
... "用来完成对2个数求和"
... print("%d"%(a+b))...
>>>
>>> test(11,22)
33
如果执行,以下代码
>>> help(test)
其中括号中的变量就是参数,其中有实际数值的变量称为实参,方法中带表任意变量的称为形参
以调用上面的add2num(a, b)函数为例:
def add2num(a, b):
c = a+b
print(c)
add2num(11, 22) #调用带有参数的函数时,需要在小括号中,传递数据
>>> def test(a,b):
... print(a,b)...
>>> test(1,2)
1 2
>>> test(b=1,a=2)
2 1
>>>
test(b=1,2)
File "
SyntaxError: positional argument follows keyword argument
定义时小括号中的参数,用来接收参数用的,称为 “形参”
调用时小括号中的参数,用来传递给函数用的,称为 “实参”
所谓“返回值”,就是程序中函数完成一件事情后,最后给调用者的结果
想要在函数中把结果返回给调用者,需要在函数中使用return
如下示例:
def add2num(a, b):
c = a+b
return c
或者
def add2num(a, b):
return a+b
如果一个函数返回了一个数据,那么想要用这个数据,那么就需要保存
保存函数的返回值示例如下:
#定义函数
def add2num(a, b):
return a+b
#调用函数,顺便保存函数的返回值
result = add2num(100,98)
#因为result已经保存了add2num的返回值,所以接下来就可以使用了
print(result)
结果:
198
函数根据有没有参数,有没有返回值,可以相互组合,一共有4种:
无参数,无返回值
无参数,有返回值
有参数,无返回值
有参数,有返回值
此类函数,不能接收参数,也没有返回值,一般情况下,打印提示等类似的功能,使用这类的函数
def printInfo():
print('------------------------------------')
print( ' 人生苦短,我用Python')
print( '------------------------------------')
结果如上:
此类函数,不能接收参数,但是可以返回某个数据,一般情况下,像采集数据,用此类函数
# 获取温度
def getTemperature():
#这里是获取温度的一些处理过程
#为了简单起见,先模拟返回一个数据
return 24
temperature = getTemperature()
print('当前的温度为:%d'%temperature)
结果:
当前的温度为: 24
此类函数,能接收参数,但不可以返回数据,一般情况下,对某些变量设置数据而不需结果时,用此类函数
运行结果
# 计算1~num的累积和
def calcNum(num):
result = 0
i = 1
while i<=num:
result = result + i
i+=1
return result
result = calcNum(100)
print('1~100的累积和为:%d'%result)
结果:
1~100的累积和为: 5050
函数根据有没有参数,有没有返回值可以相互组合
定义函数时,是根据实际的功能需求来设计的,所以不同开发人员编写的函数类型各不相同
def testB():
print('---- testB start----')
print('这里是testB函数执行的代码...(省略)...')
print('---- testB end----')
def testA():
print('---- testA start----')
testB()
print('---- testA end----')
testA()
结果:
---- testA start----
---- testB start----
这里是testB函数执行的代码...(省略)...
---- testB end----
---- testA end----
一个函数里面又调用了另外一个函数,这就是所谓的函数嵌套调用
如果函数A中,调用了另外一个函数B,那么先把函数B中的任务都执行完毕之后才会回到上次 函数A执行的位置
如下图所示:
局部变量,就是在函数内部定义的变量
不同的函数,可以定义相同的名字的局部变量,但是各用个的不会产生影响
局部变量的作用,为了临时保存数据需要在函数中定义变量来进行存储,这就是它的作用
如果一个变量,既能在一个函数中使用,也能在其他的函数中使用,这样的变量就是全局变量
# 定义全局变量
a = 100
def test1():
print(a)
def test2():
print(a)
# 调用函数
test1()
test2()
运行结果:
100
100
建议前面加上个g
例如g_wendu = 32#全局变量
在函数外边定义的变量叫做全局变量
全局变量能够在所有的函数中进行访问
如果在函数中修改全局变量,那么就需要使用global进行声明,否则出错
如果全局变量的名字和局部变量的名字相同,那么使用的是局部变量的,就近原则
全局变量要定义在函数调用前,否则会报错
如果把可变类型当全局变量,在函数里使用,不用加global声明
加了也不会报错。
代码如下:
运行结果:
在函数中不使用global声明全局变量时不能修改全局变量的本质是不能修改全局变量的指向,即不能将全局变量指向新的数据。
对于不可变类型的全局变量来说,因其指向的数据不能修改,所以不使用global时无法修改全局变量。
对于可变类型的全局变量来说,因其指向的数据可以修改,所以不使用global时也可修改全局变量。