函数介绍
一、函数介绍
1、什么是函数?
函数:具有某种功能的工具
函数的定义:事先准备工具的过程
函数的调用:即 遇到应用场景拿来就用
2、为何要用函数?
(1)对于python定义好的函数,拿来直接用就行
(2)对于自己定义的函数,有如下几个好处:
增强程序的组织结构性,提升可读性
简洁,减少冗余
提升程序的可维护性与可扩展性
3、如何用函数?
原则:先定义,后调用
具体用法:
def 函数名():
"""文档注释"""
代码1
代码2
代码3
...
return 返回值
函数名(值1,值2,值3...) # 函数的调用
二、函数的基本使用
函数的使用分为两个部分
1、定义阶段
申请内存空间将函数体代码保存下来,然后将内存地址绑定给函数名,(函数名 = 函数的内存地址)
2、调用函数
函数名() ===> 通过函数名找到函数的内存地址,加括号触发函数体代码的运行
注意:
函数定义阶段不执行代码只识别语法,只有在调用阶段才执行代码
如:
def f1():
print('from f1')
f2() # 函数定义时不运行,所以不会报错
def f2():
print('from f2')
f1()
3、函数定义的三种形式
(1)无参函数
函数体代码运行逻辑不需要外来数据
def func():
print("hello world")
func()
(2)有参函数
函数的运行依赖外来数据
def max2(x,y): # 函数的运行依赖外来数据x,y
if x > y:
print(x)
else:
print(y)
max2(10,11) # 相当于把10赋值给x,11赋值给y来运行
(3)空函数
函数体暂时为空,用来作为预留代码的框架
def login():
pass
def register():
pass
4、函数调用的三种形式
def max(x, y):
if x > y:
return x
else:
return y
针对上面的函数例子
(1)语句形式
单纯的调用一下
如:
max(11, 22)
(2)表达式形式
如:
res = max2(1, 2)
x = max2(1, 2) * 10
print(res, x)
(3)可以把函数的调用当做一个值传给另一个函数
如:
print(max2(10,11))
5、函数的返回值
(1)return :
函数内可以有多个return,但是只要运行一次return就会立刻结束函数的运行,
并且把return后面的值本次函数调用的结果返回
(2)函数可以有三种形式的返回值
① 函数体内没有return,或者return后面没有值:默认返回None
② return 值:返回的就是该值本身(这个值可以是任意类型)
③ return 值1,值2,值3:返回一个元组(值1,值2,值3)
-
总结:
函数的使用一定要分成两个阶段来看 一、定义阶段:只检测语法,不执行代码 二、调用阶段:执行函数代码
示范:
def func1():
print('from func1')
func2() # 定义阶段并不执行代码
def func2():
print('from func2')
func1() # 函数的调用在func2 定义之后,所以不会报错
三、函数的参数
1、函数的参数分为两大类:
① 形参:
在定义函数时,括号内定义的变量名,称之为形式参数,简称形参===>变量名
② 实参:
在调用函数时,括号内传入的值,称之为实际参数,简称实参===>变量值
2、python中参数的种类:
(1)位置参数
① 位置形参:
在函数定义阶段按照从左到右后的顺序依次定义形参(变量名),称之为位置形参
特点:必须被传参,多一个少一个都不行
② 位置实参:
在函数的调用阶段按照从左到右的顺序依次 定义实参(传入的变量值),称之为位置实参
特点:按照位置传值,一一对应
(2)关键字实参:
在函数的调用阶段按key:value的形式为指定的形参名传值,该形式称之为关键字实参
特点:在在传值的时候可以完全打乱顺序,但是仍然可以指名道姓地为指定的形参传值
def func(x,y):
print(x,y)
func(y=1,x=2)
注意点:
位置实参可以与关键字实参混用,但是
① 位置实参必须放在关键字实参的前面;
② 不能为同一个形参重复赋值
(3)默认形参:
在函数定义阶段就已经为某个形参赋值,该形参称之为有默认值的形参,简称默认形参
特点:
函数调用阶段可以不用为其传参赋值,
但如果调用时重新赋值的话,那么函数将以传参的值运行
def func(x,y=2):
print(x,y)
func(1) # 默认y=2
func(1,222) # 函数调用时y被传了值,那么本次调用以当前传的值为准
注意:
① 默认形参应该放在位置形参的后面
② 默认形参的值通常使用不可变类型的值,否则每次调用会受上一次调用的影响(函数的调用应该到彼此之间没有关联)
③ 默认形参的值只在定义阶段被赋值一次,函数定义之后的改变对默认形参没有影响
也就是说,函数调用时没有为默认形参传值,那么不会每次调用都重新赋值
示例:
m=333
def func(x,y=m): # y=333
print(x,y)
m=44444
func(1) # 1 333 调用时y的值仍然是333