函数基础简介及函数参数
一:函数是什么
(1)函数类似于工具的集合 通过编造不同的工具(函数) 在不同的地方使用:
二:为什么用到函数
(1)减少代码的冗余
(2)提升代码的架构
(3)功能易扩展 当功能需要扩展的时候 在原有函数上进行修改即可
三:函数基础知识
【1】
函数的定义方式:
(1)def 函数名():
(1)def是定义函数的关键字
(2)函数名定义方式与变量名一样
(3)函数名尽量做到见名知意、
PS:
(1)函数在定义阶段 只检测语法 不检测函数子代码块
(2)只有当调用函数的时候 才会调用函数里的子代码块
(2)函数的调用方式
(1)函数名+()
(2)函数名遇到括号即会立马调用函数
(3)函数先被调用 在执行调用之后的代码块
(4)在python中如果函数名后面跟上括号表示调用的是函数执行结果
(5)在Python中如果函数名后面不加括号表示调用的是函数本身
PS:函数必须本身先被定义 定义成功之后 可以在任意位置调用(函数类比成一个工具 假如工具都不存在 怎么调用呢)
例如
def func(x): return x print(func) # <function func at 0x0000000002042E18> 表示的一串值 通过该值可以找到对应的代码块 print(func('SR')) # SR 函数的调用结果
【2】
函数的分类:
(1)内置函数:
(1)其是python本身帮我们定义的函数 我们可以直接调用 (len range等)
(2)自定义函数
(1)程序员根据自己的需求 手工编写的函数
【3】函数的返回值:
return
作用:
(1)通常执行函数里的子代码块 将执行的结果返回给调用者
(2)需要关闭函数的时候
返回值的情况:
(1)不写return 默认返回None
(2)只写return
(3)写return 反正None
(3)写return返回一个值
(4)写return返回多个值
例如:
# 不写return def func(): print('SR') # SR res = func() print(res) # None # 只写return def func1(): number = [1,2,3,4,] while True: for i in number: if i == 2: return print('这一行永远不会被执行') # 其被上层的return给中止了 print(i) # 1 res = func1() print(res) # None #写return 返回None def func2(): return None res = func2() print(res) # None #写return返回一个值 def span(): return 123 def span1(): return 'SR' def span2(): return [1,2,3,4] def span3(): return {'name':'SR','age':18} def span4(): return (1,2,3,4,) print(span(),span1(),span2(),span3(),span4()) # 123 SR [1, 2, 3, 4] {'name': 'SR', 'age': 18} (1, 2, 3, 4) #写return返回多个值 def func(): return 1,2,3,4 res = func() print(res) # (1, 2, 3, 4) 返回结果为元组 不希望返回结果被修改
PS:
(1)无论写不写return 都会有返回值
(2)如果不写返回值 则返回值为None
(3)返回多个值的时候 如果不希望返回值为元组 可以在返回值手工定义返回类型
例如:
def func(): return [1,2,3,4] res = func() print(res) # [1, 2, 3, 4]
【4】函数的参数
(1)参数的分类
(1)形参:函数定义阶段 括号内定义的名称 有点类似于变量名
(2)实参:函数调用阶段 括号内传输的值 有点类似于变量值
PS:函数在调用的时候 将实参绑定到形参上 调用结束绑定解除
(2)函数的简易结构
例如:
def func(x,y): """ 该函数的作用 :param x: 对形参x的解释 :param y: 对形参y的解释 :return: 对函数返回值的解释 """ 代码模块: return
【5】参数的类型:
(1)位置参数:
基本概念:
(1)在函数定义阶段 在括号内赋予的参数名
(2)在函数调用阶段 在括号内输入的参数值
函数传参的方法:
(1)实参与形参一一对应:
例如:
def func(x,y): if x > y: return x return y print(func(10,20)) # 20
PS:在该方法下 形参与实参的个数必须相等
(2)关键字传参:
基本概念
(1)在函数定义阶段 在括号内赋予的参数名
(2)在函数调用阶段 在括号内输入的参数值前面绑定参数值
例如:
def func(x,y): if x > y: return x return y print(func(x=20,y=10)) # 20
(3)混合传参:
(1)在函数定义阶段 在括号内赋予的参数名
(2)在函数调用阶段 在括号内输入的参数值以及参数值前面绑定参数名
(3)但是必须保证位置参数必须在关键字参数前面
例如:
def func(x,y): if x > y: return x return y print(func(20,y=10)) # 20 print(func(x=20,10)) # 报错 关键字参数在位置参数之前
(2)默认值参数:
基本概念:在函数定义阶段 形参就已经被赋值了
特点:
(1)在调用的时候 实参可以不必赋值 如果不赋值默认使用形参自己定义的值
(2)在调用的时候 实参可以赋值 如果实参赋值则会使用实参赋值作为自己的值
(3)在定义阶段 默认值必须在位置参数后面
(4)在函数中的某参数经常使用的时候且使用值基本保持不变 可以考虑将该参数变成默认值
例如:
默认值参数的使用注意事项:
可变长参数:
作用:
(1)在定义阶段 可以用*和**匹配溢出的实参
(2)在调用阶段 实参的个数可以任意
特点:
*
在定义阶段
(1)其可以将多余的位置实参 统一用元组表示
(2)其只能接受位置实参 不能接受关键字实参
例如:
def func(x,y,*z): print(x,y,z) print(func(1,2,3,4,5,6,7)) # 1 2 (3, 4, 5, 6, 7)
(2)在调用阶段
(1)实参会将多余的值打散 赋值给形参
(2)在形参中只能接受位置实参 不能接受关键字实参
(3)实参内部只能是列表 集合 元组 字符串等类型(本质就是for循环)
例如:
def func (x,y): print(x,y) func(*[1,2,]) # 1 2
**
在形参中:
(1)将溢出的关键字实参 以字典的形式传给后面的变量名
(2)其中关键字即为字典的key 关键字对应的值为字典的value
例如:
def func(x,y,**z): print(x,y,z) func(1,2,name='SR',age=18) # 1 2 {'name': 'SR', 'age': 18}
在实参中:
(1)会将字典拆分成 以关键字的实参赋值给函数的变量名
例如:
def func(name,age): print(name,age) user_info = {'name':'SR','age':18} # key必须与上述形参名保持一致 func(**user_info) # SR 18
总结:
*
(1)在形参中其会将多余的位置实参以元组的形式赋值给*后面的函数名
(2)在实参中岂会将字符串 列表 元组 集合 打散成位置实参 传给形参
**
(1)在形参中岂会将多余的关键字实参组成字典 赋值给后面的函数名
(2)在实参中其会将字典拆分成关键字实参 赋值给形参