函数(一)
1 函数介绍
- 如果在开发程序时,需要某块代码多次,但是为了提高编写的效率以及代码的重用,所以把具有独立功能的代码块组织为一个小模块,这就是函数
2 函数的定义、定义
<1>格式
定义函数的格式如下:
def 函数名(): 代码
demo:
# 定义一个函数,能够完成打印信息的功能def printInfo(): print('------------------------------------') print(' 人生苦短,我用Python') print('------------------------------------')
<2>调用函数
定义了函数之后,就相当于有了一个具有某些功能的代码,想要让这些代码能够执行,需要调用它
调用函数很简单的,通过 函数名() 即可完成调用
# 定义完函数后,函数是不会自动执行的,需要调用它才可以printInfo()
<3>注意点
- 每次调用函数时,函数都会从头开始执行,当这个函数中的代码执行完毕后,意味着调用结束了
- 当然了如果函数中执行到了return也会结束函数
3 函数参数和返回值
<1>定义有参数的函数
示例如下:
# a和b是函数的参数def add2num(a, b): c = a+b print c
<2>调用有参数的函数
示例如下:
def add2num(a, b): c = a+b print(c)# 调用带有参数的函数时,需要在小括号中,传递数据add2num(11, 22)
图解:
总结:
- 定义时小括号中的参数,用来接收参数用的,称为 “形参”
- 调用时小括号中的参数,用来传递给函数用的,称为 “实参”
<3> 函数的返回值介绍
现实生活中的场景:
我给儿子10块钱,让他给我买包烟。这个例子中,10块钱是我给儿子的,就相当于调用函数时传递到参数,让儿子买烟这个事情最终的目标是,让他把烟给你带回来然后给你对么,,,此时烟就是返回值
开发中的场景:
定义了一个函数,完成了获取室内温度,想一想是不是应该把这个结果给调用者,只有调用者拥有了这个返回值,才能够根据当前的温度做适当的调整
综上所述:
- 所谓“返回值”,就是程序中函数完成一件事情后,最后给调用者的结果
<4>带有返回值的函数
想要在函数中把结果返回给调用者,需要在函数中使用return
如下示例:
def add2num(a, b): c = a+b return c # c就是函数的返回值
<5> 保存返回值
保存函数的返回值示例如下:
#定义函数def add2num(a, b): return a+b#调用函数,顺便保存函数的返回值result = add2num(100,98)#因为result已经保存了add2num的返回值,所以接下来就可以使用了print(result)
结果:
198
4 函数的类型
函数根据有没有参数,有没有返回值,可以相互组合,一共有4种
- 无参数,无返回值
- 无参数,有返回值
- 有参数,无返回值
- 有参数,有返回值
<1>无参数、无返回值
此类函数,不能接收参数,也没有返回值,一般情况下,打印提示灯类似的功能,使用这类的函数
示例如下:
def printMenu(): print('--------------------------') print(' xx涮涮锅 点菜系统') print(' 1\. 羊肉涮涮锅') print(' 2\. 牛肉涮涮锅') print(' 3\. 猪肉涮涮锅') print('--------------------------')
<2>无参数、有返回值
此类函数,不能接收参数,但是可以返回某个数据,一般情况下,像采集数据,用此类函数
示例如下:
# 获取温度def getTemperature(): # 这里是获取温度的一些处理过程 # 为了简单起见,先模拟返回一个数据 return 24temperature = getTemperature()print('当前的温度为:%d'%temperature)
<3>有参数、无返回值
此类函数,能接收参数,但不可以返回数据,一般情况下,对某些变量设置数据而不需结果时,用此类函数
<4>有参数、有返回值
此类函数,不仅能接收参数,还可以返回某个数据,一般情况下,像数据处理并需要结果的应用,用此类函数
示例如下:
# 计算1~num的累积和def calculateNum(num): result = 0 i = 1 while i<=num: result = result + i i+=1 return resultresult = calculateNum(100)print('1~100的累积和为:%d'%result)
<5> 总结
- 函数根据有没有参数,有没有返回值可以相互组合
- 定义函数时,是根据实际的功能需求来设计的,所以不同开发人员编写的函数类型各不相同
5 函数嵌套
- 一个函数里面又调用了另外一个函数,这就是所谓的函数嵌套调用
- 如果函数A中,调用了另外一个函数B,那么先把函数B中的任务都执行完毕之后才会回到上次 函数A执行的位置
函数(二)
1 全局变量、局部变量
<1> 什么是局部变量?
如图所示:
小总结:
- 局部变量,就是在函数内部定义的变量
- 其作用范围是这个函数内部,即只能在这个函数中使用,在函数的外部是不能使用的
- 因为其作用范围只是在自己的函数内部,所以不同的函数可以定义相同名字的局部变量(打个比方,把你、我是当做成函数,把局部变量理解为每个人手里的手机,你可有个iPhone8,我当然也可以有个iPhone8了, 互不相关)
- 局部变量的作用,为了临时保存数据需要在函数中定义变量来进行存储
- 当函数调用时,局部变量被创建,当函数调用完成后这个变量就不能够使用了
<2> 什么事全局变量?
如果一个变量,既能在一个函数中使用,也能在其他的函数中使用,这样的变量就是全局变量
小总结:
- 在函数外边定义的变量叫做
全局变量
- 全局变量能够在所有的函数中进行访问
<3> 全局变量和局部变量名字相同问题?
小总结:
- 当函数内出现局部变量和全局变量相同名字时,函数内部中的
变量名 = 数据
此时理解为定义了一个局部变量,而不是修改全局变量的值
<4> 修改全局变量
小总结:
如果在函数中出现
global 全局变量的名字
那么这个函数中即使出现和全局变量名相同的变量名 = 数据
也理解为对全局变量进行修改,而不是定义局部变量-
如果在一个函数中需要对多个全局变量进行修改,那么可以使用
# 可以使用一次global对多个全局变量进行声明 global a, b # 还可以用多次global声明都是可以的 # global a # global b
2 函数间共享数据
一般在实际开发过程中,一个程序往往由多个函数(后面知识中会讲解类)组成,并且多个函数共享某些数据,这种场景是经常出现的,因此下面来总结下,多个函数中共享数据的几种方式
<1> 使用全局变量
<2> 使用函数的返回值、参数
<3> 函数嵌套调用
3 引用
<1>想一想
>>> a = 1>>> b = a>>> b1>>> a = 2>>> a2
请问此时b的值为多少?
>>> a = [1, 2]>>> b = a>>> b[1, 2]>>> a.append(3)>>> a[1, 2, 3]
请问此时b的值又是多少?
<2> 引用
在python中,值是靠引用来传递来的。
我们可以用id()来判断两个变量是否为同一个值的引用。 我们可以将id值理解为那块内存的地址标示。
>>> a = 1>>> b = a>>> id(a) 13033816>>> id(b) # 注意两个变量的id值相同13033816>>> a = 2>>> id(a) # 注意a的id值已经变了13033792>>> id(b) # b的id值依旧13033816
>>> a = [1, 2]>>> b = a>>> id(a)139935018544808>>> id(b)139935018544808>>> a.append(3)>>> a[1, 2, 3]>>> id(a)139935018544808>>> id(b) # 注意a与b始终指向同一个地址139935018544808
引用图解:
总结:
- 之前为了更好的理解变量,咱们可以把
a=100
理解为变量a中存放了100,事实上变量a存储是100的引用(可理解为在内存中的一个编号)
4 可变类型、不可变类型
总结:
- 所谓可变类型与不可变类型是指:数据能够直接进行修改,如果能直接修改那么就是可变,否则是不可变
- 可变类型有: 列表、字典、集合
- 不可变类型有: 数字、字符串、元组
5 函数的使用注意事项
一个函数到底有没有返回值,就看有没有return,因为只有return才可以返回数据
在开发中往往根据需求来设计函数需不需要返回值
函数中,可以有多个return语句,但是只要执行到一个return语句,那么就意味着这个函数的调用完成
在调用函数时,如果需要把一些数据一起传递过去,被调用函数就需要用参数来接收
参数列表中变量的个数根据实际传递的数据的多少来确定
如果在同一个程序中出现了多个相同函数名的函数,那么在调用函数时就会出现问题,所以要避免名字相同
还有一点 不仅要避免函数名之间不能相同,还要避免 变量名和函数名相同的,否则都会出现问题
如果调用的函数 在定义时有形参,那么在调用的时候就应该传递参数
调用时,实参的个数和先后顺序应该和定义函数中要求的一致
如果调用的函数有返回值,那么就可以用一个变量来进行保存这个值
在一个函数中定义的变量,只能在本函数中用(局部变量)
在函数外定义的变量,可以在所有的函数中使用(全局变量)