day06.函数【Python教程】
day06.函数【Python教程】
一、函数介绍
<1>什么是函数
请看如下代码:
运行后的现象:
想一想:
如果一个程序在不同的地方需要输出“佛祖镇楼”,程序应该怎样设计?
如果需要输出多次,是否意味着要编写这块代码多次呢?
小总结:
如果在开发程序时,需要某块代码多次,但是为了提高编写的效率以及代码的重用,所以把具有独立功能的代码块组织为一个小模块,这就是函数
二、函数定义和调用
<1>定义函数
定义函数的格式如下:
demo:
<2>调用函数
定义了函数之后,就相当于有了一个具有某些功能的代码,想要让这些代码能够执行,需要调用它
调用函数很简单的,通过函数名() 即可完成调用
demo:
<3>练一练
要求:定义一个函数,能够输出自己的姓名和年龄,并且调用这个函数让它执行
使用def定义函数
编写完函数之后,通过函数名() 进行调用
三、函数的文档说明
如果执行,以下代码
能够看到test函数的相关说明
四、函数参数(一)
思考一个问题,如下:
现在需要定义一个函数,这个函数能够完成2个数的加法运算,并且把结果打印出来,该怎样设计?下面的代码可以吗?有什么缺陷吗?
为了让一个函数更通用,即想让它计算哪两个数的和,就让它计算哪两个数的和,在定义函数的时候可以让函数接收数据,就解决了这个问题,这就是 函数的参数
<1> 定义带有参数的函数
示例如下:
<2> 调用带有参数的函数
以调用上面的add2num(a, b)函数为例:
调用带有参数函数的运行过程:
<3> 练一练
要求:定义一个函数,完成前2个数完成加法运算,然后对第3个数,进行减法;然后调用这个函数
使用def定义函数,要注意有3个参数
调用的时候,这个函数定义时有几个参数,那么就需要传递几个参数
<4> 调用函数时参数的顺序
<4> 小总结
定义时小括号中的参数,用来接收参数用的,称为 “形参”
调用时小括号中的参数,用来传递给函数用的,称为 “实参”
五、函数返回值(一)
<1>“返回值”介绍
现实生活中的场景:
我给儿子10块钱,让他给我买包烟。这个例子中,10块钱是我给儿子的,就相当于调用函数时传递到参数,让儿子买烟这个事情最终的目标是,让他把烟给你带回来然后给你对么,,,此时烟就是返回值
开发中的场景:
定义了一个函数,完成了获取室内温度,想一想是不是应该把这个结果给调用者,只有调用者拥有了这个返回值,才能够根据当前的温度做适当的调整
综上所述:
所谓“返回值”,就是程序中函数完成一件事情后,最后给调用者的结果
<2>带有返回值的函数
想要在函数中把结果返回给调用者,需要在函数中使用return
如下示例:
或者
<3>保存函数的返回值
在本小节刚开始的时候,说过的“买烟”的例子中,最后儿子给你烟时,你一定是从儿子手中接过来 对么,程序也是如此,如果一个函数返回了一个数据,那么想要用这个数据,那么就需要保存
保存函数的返回值示例如下:
结果:
七、4种函数的类型
函数根据有没有参数,有没有返回值,可以相互组合,一共有4种
无参数,无返回值
无参数,又反悔
有参数,无返回值
有参数,有返回值
<1>无参数,无返回值的函数
此类函数,不能接收参数,也没有返回值,一般情况下,打印提示灯类似的功能,使用这类的函数
结果:
<2>无参数,有返回值的函数
此类函数,不能接收参数,但是可以返回某个数据,一般情况下,像采集数据,用此类函数
结果:
<3>有参数,无返回值的函数
此类函数,能接收参数,但不可以返回数据,一般情况下,对某些变量设置数据而不需结果时,用此类函数
<4>有参数,有返回值的函数
此类函数,不仅能接收参数,还可以返回某个数据,一般情况下,像数据处理并需要结果的应用,用此类函数
结果:
<5>小总结
函数根据有没有参数,有没有返回值可以相互组合
定义函数时,是根据实际的功能需求来设计的,所以不同开发人员编写的函数类型各不相同
七、函数的嵌套调用
结果:
小总结:
一个函数里面又调用了另外一个函数,这就是所谓的函数嵌套调用
如果函数A中,调用了另外一个函数B,那么先把函数B中的任务都执行完毕之后才会回到上次 函数A执行的位置
八、函数应用:打印图形和数学计算
目标
感受函数的嵌套调用
感受程序设计的思路,复杂问题分解为简单问题
思考&实现1
写一个函数打印一条横线
打印自定义行数的横线
参考代码1
思考&实现2
写一个函数求三个数的和
写一个函数求三个数的平均值
参考代码2
九、局部变量
<1>什么是局部变量
如下图所示:
<2>小总结
局部变量,就是在函数内部定义的变量
不同的函数,可以定义相同的名字的局部变量,但是各用个的不会产生影响
局部变量的作用,为了临时保存数据需要在函数中定义变量来进行存储,这就是它的作用
十、全局变量
<1>什么是全局变量
如果一个变量,既能在一个函数中使用,也能在其他的函数中使用,这样的变量就是全局变量
demo如下:
运行结果:
<2>全局变量和局部变量名字相同问题
看如下代码:
<3>修改全局变量
既然全局变量,就是能够在所以的函数中进行使用,那么可否进行修改呢?
代码如下:
<4>总结1:
在函数外边定义的变量叫做全局变量
全局变量能够在所有的函数中进行访问
如果在函数中修改全局变量,那么就需要使用global进行声明,否则出错
如果全局变量的名字和局部变量的名字相同,那么使用的是局部变量的,小技巧强龙不压地头蛇
<5>可变类型的全局变量
<5>总结2:
在函数中不使用global声明全局变量时不能修改全局变量的本质是不能修改全局变量的指向,即不能将全局变量指向新的数据。
对于不可变类型的全局变量来说,因其指向的数据不能修改,所以不使用global时无法修改全局变量。
对于可变类型的全局变量来说,因其指向的数据可以修改,所以不使用global时也可修改全局变量。
十一、函数应用:名片管理系统
十二、函数返回值(二)
在python中我们可不可以返回多个值?
本质是利用了元组
十三、函数参数(二)
1. 缺省参数
调用函数时,缺省参数的值如果没有传入,则被认为是默认值。下例会打印默认的age,如果age没有被传入:
以上实例输出结果:
注意:带有默认值的参数一定要位于参数列表的最后面。
2.不定长参数
有时可能需要一个函数能处理比当初声明时更多的参数。这些参数叫做不定长参数,声明时不会命名。
基本语法如下:
加了星号(*)的变量args会存放所有未命名的变量参数,args为元组;而加**的变量kwargs会存放命名参数,即形如key=value的参数, kwargs为字典。
3. 引用传参
可变类型与不可变类型的变量分别作为函数参数时,会有什么不同吗?
Python有没有类似C语言中的指针传参呢?
Python中函数参数是引用传递(注意不是值传递)。对于不可变类型,因变量不能修改,所以运算不会影响到变量自身;而对于可变类型来说,函数体中的运算有可能会更改传入的参数变量。
想一想为什么
十四、递归函数
<1>什么是递归函数
通过前面的学习知道一个函数可以调用其他函数。
如果一个函数在内部不调用其它的函数,而是自己本身的话,这个函数就是递归函数。
<2>递归函数的作用
举个例子,我们来计算阶乘n! = 1 * 2 * 3 * ... * n
解决办法1:
看阶乘的规律
解决办法2:
原理
十五、匿名函数
用lambda关键词能创建小型匿名函数。这种函数得名于省略了用def声明函数的标准步骤。
lambda函数的语法只包含一个语句,如下:
如下实例:
以上实例输出结果:
Lambda函数能接收任何数量的参数但只能返回一个表达式的值
匿名函数不能直接调用print,因为lambda需要一个表达式
应用场合
函数作为参数传递
1.自己定义函数
2.作为内置函数的参数
想一想,下面的数据如何指定按age或name排序?
按name排序:
按age排序:
十六、函数使用注意事项
1. 自定义函数
<1>无参数、无返回值
<2>无参数、有返回值
注意:
一个函数到底有没有返回值,就看有没有return,因为只有return才可以返回数据
在开发中往往根据需求来设计函数需不需要返回值
函数中,可以有多个return语句,但是只要执行到一个return语句,那么就意味着这个函数的调用完成
<3>有参数、无返回值
注意:
在调用函数时,如果需要把一些数据一起传递过去,被调用函数就需要用参数来接收
参数列表中变量的个数根据实际传递的数据的多少来确定
<4>有参数、有返回值
<5>函数名不能重复
2. 调用函数
<1>调用的方式为:
<2>调用时,到底写不写 实参
如果调用的函数 在定义时有形参,那么在调用的时候就应该传递参数
<3>调用时,实参的个数和先后顺序应该和定义函数中要求的一致
<4>如果调用的函数有返回值,那么就可以用一个变量来进行保存这个值
3. 作用域
<1>在一个函数中定义的变量,只能在本函数中用(局部变量)
<2>在函数外定义的变量,可以在所有的函数中使用(全局变量)
十七、作业
必做题
1. 编程实现 9*9乘法表
2.用函数实现求100-200里面所有的素数
3.请用函数实现一个判断用户输入的年份是否是闰年的程序
选做题
1.用函数实现输入某年某月某日,判断这一天是这一年的第几天?闰年情况也考虑进去
2. 编写“学生管理系统”,要求如下: