【Python入门与进阶】 函数,形参,实参,与返回值
0 :导语
》》a:代码重用性从函数开始
》》b:函数重点在于参数与返回值
》》c:函数学得好,面向对象就容易了
1:函数
1.1:概述
定义:函数可以用来保存一些可执行的代码,并且可以在需要时,对这些语句进行多次的调用
( 比如有如下三行代码,这三行代码是一个完整的功能)
print(‘Hello’)
print(‘Word’)
print(‘Python’)
(用函数的角度来想,就是把这三行代码封装起来,然后用名字调用)
如图:
三行代码被保存(封装)在名字叫fn的函数里
当你调用 fn时,先找到封闭在fn里面的代码,然后再执行里面的代码。
1.2:如何定义函数
》》1:创建函数:
def 函数名([形参1,形参2,...形参n]) :
代码块
说明:
1)函数名必须要符号标识符的规范(可以包含字母、数字、下划线、但是不能以数字开头)
2)函数中保存的代码不会立即执行,需要调用函数代码才会执行
》》2:调用函数:
函数对象()
(这个要记住,调用函数 肯定有小括号 ,其实本质你还是要编写 一段代码,然后执行这段代码,函数,只不过让你这段代码,才能时候要用,调一下就可以执行)
》》3:函数是功能
定义函数一般都是要实现某种功能的
(所以,现在可以让为以后开发,就是将代码写进函数里面,一个函数代表一个功能)
》》4:练习
如图:
将三行代码保存在sum函数里,
调用sum时,先找到sum,再执行里面的代码。
1.3:函数参数
(显然,上面的函数,只能计算固定值,这显然没什么实际意义,应该是你传什么值,函数拿着这个值去计算才对)
如图:
说明
1)调用时,程序将100,200分别传给括号里面的a= 100,b=200
2)函数内部将已被赋值的a,b 用于打印,当然也可以用于别的计算
(所以本质上还在是执行一段代码,只不过先写函数,再调函数,然后将函数内代码需要的数据传过去而已)
2:函数参数
2.3:函数参数
(参数,就是函数名后面的()里面的变量)
如图:
说明:
1)在定义函数时,可以在函数名后的()中定义数量不等的形参,
2)多个形参之间使用,隔开
2.4 形参与实参
(你肯定知道,变量没有赋值是不能使用的对吧,那形参明显没有值,函数内怎么能使用没有赋值的变量呢)
说明:
1)形参(形式参数),定义形参就相当于在函数内部声明了变量,但是并不赋值
2)实参(实际参数)定义函数时,形参是没有值的变量,但是你调用函数时,实参就赋值给了形参
3)如果函数定义时,指定了形参,那么在调用函数时也必须传递实参,
实参将会赋值给对应的形参,简单来说,有几个形参就得传几个实参
2.5: 小练习
2.6:参数默认值
(定义函数时形参没有值,调用函数时,将实参传给形参。这个你知道
也可以在定义函数时,直接给形参值。 如果调用时,你给实参,就用时参,你不给就用默认值)
说明:
1)你给 a = 1, b=2,c=3 ,程序就使用你给的值进行运算
2)你不给a,b,c值,那作为变量a,b,c 不能没有值,就使用默认值
3)你给 a = 100,b = 200,那么c 还是没有值,c就使用默认值
(可以说到这里python参数已经是相当灵活了,但是还有更灵活的)
2.7: 关键字参数
可以不按照形参定义的顺序去传递,而直接根据参数名去传递参数
说明:
4)你只想给一个值,如果直接写值 比如 fn(100),那是将100给了a, 但是我想给c,就得写成fn(c=100) ,表示将值给形参c
2.8:实参是列表
说明:
1)如果 a 是 一个列表,尝试修改列表中的元素,会影响所有指向该对象的变量
2)如果 只需要使用列表数据去计算,而不影响原来的列表,使用copy()
2.9:不定长的参数
2.9.1 一个带星号形参
(如果定义一个求和函数,当需要两个数求和,那么参数为两个,依次类推,需要定义很多个不同参数个数的函数)
说明:
1) 在定义函数时,可以在形参前边加上一个*,这样这个形参将会获取到所有的实参
2) 它将会将所有的实参保存到一个元组中(装包)
2.9.2 只能有一个带星的形参
》》带星形参在最后
说明
1)带星号的形参只能有一个
2) 第一个参数给a,第二个参数给b,剩下的都保存到c的元组中
》》带星形参不在最后
说明:
1)可变参数不是必须写在最后,但是注意,带*的参数后的所有参数,必须以关键字参数的形式传递
2)简单说 带星的,就是将余下的参数封装到元组中, 4给b,5给c ,那么余下的都是a的
》》第一个形参只有星号
说明:
1) 如果在形参的开头直接写一个*,则要求我们的所有的参数必须以关键字参数的形式传递
》》形参带星,不能接收关键字参数
说明:
1)*形参只能接收位置参数,而不能接收关键字参数
2.9.3: 如果形参带两个星
》》形参带两个星
说明:
1) **形参可以接收其他的关键字参数,它会将这些参数统一保存到一个字典中, 字典的key就是参数的名字,字典的value就是参数的值
》》带两星的形参必须在最后
说明:
1)**形参只能有一个,并且必须写在所有参数的最后
2.10 参数的解包(拆包)
定义:将元组或者字典中的元素,取出作为值依次赋给函数形参
2.10.1 实参带一个星
说明:
1) 调用函数时,实参为元组,加一个*表示取出元素
2.10.2 实参带两个星
说明:
1)通过 **来对一个字典进行解包操作
2) 这里要求序列中元素的个数必须和形参的个数的一致
3: 返回值
(这个概念很好理解的)
定义:返回值就是函数执行以后,使用return 返回的结果
3.1:return 结果 的 含义
说明
1) return 后边跟什么值,函数就会返回什么值,图中返回的是 a+b的和
2)可以直接 使用函数的返回值,也可以通过一个变量来接收函数的返回值
3.2 return 含义
3) 如果仅仅写一个return 或者 不写return,则相当于return None
4) 在函数中,return后的代码都不会执行,return 一旦执行函数自动结束
3.3 return 进阶
5) return 后边可以跟任意的对象,返回值甚至可以是一个函数
6)fn1 和 fn1()的区别
》》print(fn1)
fn1是函数对象,打印fn1实际是在打印函数对象
》》print(fn1(10,20))
fn5()是在调用函数,打印fn1()实际上是在打印fn1()函数的返回值30