声明:参考B站视频,自学成长记录
https://www.bilibili.com/video/BV1qC4y1s71m?p=208
函数
1. 什么是函数
函数就相当于具备某一功能的工具,要先定义后使用
2. 为何要用函数
代码冗余、组织结构不清晰、可读性差、可维护性差、可扩展性差
3. 如何使用函数
先定义(3种定义方式)、后调用(3种调用方式)、返回值(3种返回值的形式)
定义函数
定义函数发生的事情
1.申请内存空间 保存函数体代码
2.将内存地址绑定给函数名
3.定义函数时不会执行整体代码,只会检测函数体语法
定义函数的语法
def 函数名(参数1, 参数2, ...参数n):
"""文档描述"""
函数体
return 值
定义方式1 - 无参函数
def func():
print("哈哈哈")
func()
定义方式2 - 有参数函数
def func(x, y): # x=1, y=2
print(x, y) # 1, 2
func(1, 2)
定义方式3 - 空函数
def func():
pass
# ...
不同定义方式的应用场景
无参函数的应用场景
# 调用时,函数体不需要外部传入参数
def input():
name = input("请输入姓名:")
age = input("请输入年龄:")
msg = '名字:{} 年龄:{}'.format(name, age)
print(msg)
有参函数的应用场景
# 调用时,函数体需要外部传入参数
def sum(x, y)
return x + y
s = sum(3, 5)
print(s) # 8
空参函数的应用场景
# 构思代码的实现思路时,可以先做好定义并用pass占好位置
def auth_user():
"""用户认证"""
pass
def upload_file():
"""文件上传"""
pass
def download_file():
"""下载文件"""
...
调用函数
调用函数发生的事情
1.通过函数名找到函数的内存地址
2.然后加括号就是在触发函数体代码的执行
调用方式1 - 语句形式
# 只加括号调用函数
func()
调用方式2 - 表达式形式
# 赋值表达式
res = add(1, 2) # 3
# 数学表达式
add(1, 3) * 10 # 40
调用方式3 - 函数的调用可以当参数
add(add(1,2), add(3,4)) # 10
函数返回值
如果需要将函数一系列的处理得出的结果反馈给调用者,就需要用到return
return是函数结束的标志,即函数体代码一旦运行到return会立刻终止函数的运行,并将return后的值 当作本次运行的结果返回
返回方式1 - None
# 没有return, 默认返回None
def func():
pass
print(func()) # None
返回方式2 - 返回一个值
# return 值
def func():
return 10
print(func()) # 10
返回方式3 - 返回多个值
# return 值1, 值2, 值n
def func():
return 1, 'aa', [1,2]
print(func()) # 元组形式:(1, 'aa', [1,2])
形参与实参
形式参数
在定义函数阶段定义的参数称之为形式参数,简称形参
def func(x, y): # x , y 为形参
print(x, y)
实际参数
在调用函数阶段传入的值称为实际参数,简称实参
func(1, 2) # 1, 2为实参
形参与实参的关系
形参与实参得个数需一致,多一个或少一个都不可以,不能为同一个形参重复传值
在调用时会将实际传入的值得内存地址 分别绑定 给对应形参,这种绑定关系只能在函数体内使用,且在函数调用结束后解除绑定关系
# 形参
def func(x, y): # x=1 , y=2
print(x, y) # 1, 2
# 实参
func(1, 2)
位置参数
# 定义时 按照从左向右得顺序依次定义得参数 称之为 位置形参
def func(x, y, z):
print(x, y, z)
func(1, 2, 3)
关键字参数
def func(x, y, z):
print(x, y, z)
# 调用时 按照key=value得形式传给形参,完全不参照顺序得参数 称之为 关键字实参
func(x=1, z=3, y=2)
默认参数
# 定义时 就已经被赋值得形参 称之为 默认参数
# 定义时 位置参数必须在默认参数的左边
def func(x, y=3):
print(x, y) # 5, 3
# 调用时 可以不用给形参传值
func(5)
# 调用时 也可以给形参传值
# func(5, y=8) # 5, 8
形参不使用用可变类型
# 推荐:形参不使用可变类型
def func(x, y, z, l=None):
if l is None:
l = []
l.append(x)
l.append(y)
l.append(z)
print(l) # [1, 2, 3]
func(1,2,3)
可变长度的参数
形参中带 *
# *args:接收多出来得位置实参 会被 * 保存成元组得格式 然后赋值给其后得形参名args
def my_sum(*args): # item = (1, 2, 3, 4, 5)
s = 0
for i in args:
s += i
return s
res = my_sum(1, 2, 3, 4, 5)
print(res) # 15
形参中带 **
# **kwargs:接收多出来得关键字实参 会被 ** 保存成字典得格式 然后赋值给其后得形参名kwargs
def func(**kwargs):
print(kwargs) # {'x': 1, 'y': 2, 'z': 3}
func(x=1,y=2,z=3)
实参中带 *
# 实参中带 * 先将*后得值拆分成 位置实参 再给形参传值
def func(x, y, *z): # --> 2.func(1, 2, (11, 22, 33))
print(x, y, z) # --> 3. 1, 2, (11, 22, 33)
func(1, 2, *[11, 22, 33]) # --> 1.func(1, 2, 11, 22, 33)
实参中带 **
# 实参中带 ** 先将**后得值(必须为字典)拆分成关键字实参 再给形参传值
def func(x, y, z):
print(x, y, z)
# *
func(*{'x':1, 'y':2, 'z':3}) # --> func(x, y, z)
# **
func(**{'x':1, 'y':2, 'z':3}) # --> func(x=1, y=2, z=3)
形参与实参中都带 **
def func(x,y,**kwargs):
print(x,y,kwargs) # 1 2 {'a': 11, '2': 22, 'c': 33}
func(**{'y':2, 'x':1, 'a':11, '2':22, 'c':33})
特此铭记
"90"后灯塔 - 袁隆平 / 吴孟超 双星西沉,致敬缅怀!2020.05.22