关于函数部分的知识,梳理总结如下:
一、什么是函数:
函数是组织好的,可以重复利用的,用来实现某一功能的代码。比如用到的打印函数print(),就是完成数据打印的功能。
二、定义函数:
函数可以由我们自己来进行创建,语法如下:
def 函数名(参数):
函数体
例:
def method1(x):
y = 3*x+5
return y
说明:
1)函数名:名字最好体现函数功能,一般用小写字母、单下划线、数字组合,不可与内置函数重名;
2)参数:可以有多个参数,也可以不带参数;
3)函数体:代码的缩进不可省略,声明函数名后的冒号不可省略;
4)返回语句:return语句用于在函数体执行结束后,变量结果需要在函数外部使用时,后面可以接多种数据类型,不需要返回值可省略(末尾隐性返回None)。
三、调用函数:
函数在定义后,不调用则不会执行相应的代码。
函数的调用语法:函数名(参数)
def math(x):
y=x*2+3
return y
print(math(3))#函数调用部分
四、关于参数:
函数中常见的有位置参数、默认参数和不定长参数。
1、位置参数:传参必须依照函数定义时的顺序。当有多个参数时,必须按照指定的顺序和数量进行传递。
例:
def math1(a,b): #声明math1函数,其中有a,b两个变量,顺序和个数不可改变
y=a-b
return y
2、默认参数:直接在定义时给出赋值的参数,被赋予的值可称为初始值或初值,默认参数的值也可以用改变位置参数的方法来重新赋值。注意:默认参数必须在位置参数之后进行声明和赋初值。
例:
def math2(a,b,c=2):#声明math2函数,有三个参数,其中a,b是位置参数,c是默认参数。但可以通过赋值语句重新赋值。
y1=(a-b)/c
c=a+1
y2=(a-b)/c
return y1,y2
3、不定长参数:用于存储参数值长度未知的参数,其数据类型为元组。声明格式:在参数名前加“*”,即:*参数名
。
例:
def menu(*order):#不定长参数的定义
order='溏心蛋','红烧肉','清炒时蔬'
print(order)
print(type(order))#不定长参数的数据类型
五、返回值:
返回值即在定义函数时,return语句后所跟的变量。可以返回单一值,也可返回多个值。要返回多个值,只需将返回的值写在return语句后面,用英文逗号隔开即可。
例:
def math3(a,b):
y1=a+b
y2=a-b
y3=a*b
y4=a/b
return y1,y2,y3,y4
多个返回值的函数,其返回值类型为元组(tuple,与列表相同),每个返回值都可以分别赋值一个新的变量。见下例:
def math1(a,b,c=2):
y1=(a-b)/c
c=a+1
y2=(a-b)/c
return y1,y2 #多个返回值
result=math1(3,2) #返回值存放于元组中
num1,num2=math1(3,2) #可直接定义变量来接收函数的返回值
num3=result[0] #元组中的值可以像列表值一样取出赋值给新变量
num4=result[1]
print(num1,num2,num3,num4,sep='\n')
print(type(result)) #验证返回值的数据类型为元组
代码结果图:
六、多个函数间的配合:
涉及概念:变量作用域。
什么是变量作用域?我的理解是:变量可以被调用的区域。
由此划分出两类变量:局部变量和全局变量。
1、局部变量:以函数内部的变量为例,在函数内部赋值的变量仅能在该函数内部使用。简单理解为,可调用的区域有限制。
2、全局变量:可以在程序的任何位置使用的变量,称为全局变量。
函数间有可能相互调用的变量,有三种办法解决变量作用域不同产生报错的问题:
1、写在函数定义之外,直接声明为全局变量;
2、使用‘global’关键字,在函数体的第一行进行变量的全局声明;
3、在函数调用时进行嵌套使用。
例:
需求:自动计算销售额的增长率。
def balance(): #计算差额(本月销售额-上月销售额)
global last_month #后面需要用到上月销售额这一变量,全局声明
this_month=float(input('请输入本月销售额,按回车结束'))
last_month=float(input('请输入上月销售额,按回车结束'))
balance_num=this_month-last_month
return balance_num
def rate():
rate_num=balance()/last_month*100 #嵌套balance()函数
return rate_num
def main():
a=round(rate(),2) #嵌套rate()函数
print('本月销售额相比上个月的增长率为:'+str(a)+'%')
main()
思路:
1、增长率的计算公式:
增长率=(本月销售额-上月销售额)/上月销售额*100%
2、差额需要优先计算,并且本月销售额和上月销售额需要手动输入,用到input()函数,与计算差额合并在一个函数内,避免增长率计算时算式编辑过于复杂。
3、乘除法计算增长率需要用到上月销售额,故上月销售额变量需要全局声明。
4、计算结果需要保留两位小数,可以定义在main()函数中,使用一个round()函数的嵌套。
执行说明:
(个人感觉,整个程序的执行更像是倒着找源头,然后再带着源头,沿着路标回到出发地。)
执行代码的主体只有main()函数的调用。
调用main()函数后,执行变量a的赋值语句,
在赋值过程中,调用了rate()函数,
rate()函数中嵌套了balance()函数,
去执行balance()函数体,键入this_month和last_month两个变量值,
得到balance()函数的执行结果balance_num,
带着结果回到rate()函数中,
计算出结果rate_num,
再回到main()函数中,保留两位小数,输出计算结果。
在案例实现的过程中遇到的错误:
SyntaxError: name ‘last_month’ is parameter and global
问题代码:
def balance(this_month,last_month): #括号中为形式参数,形式参数不可进行全局声明。
global last_month
this_month=float(input('请输入本月销售额,按回车结束'))
last_month=float(input('请输入上月销售额,按回车结束'))
balance_num=this_month-last_month
return balance_num
个人理解:括号中给出的参数都是在调用时需要给出实际值的,而且只有在这个函数被调用时才会启用,相当于只能是局部变量,不能够提供给别的函数使用,在定义时只作为占位的标号,因此不可以声明为全局变量。