1 函数使用
1.1 函数的作用和特性
作用:
函数就是封装了一部代码,实现一定功能的语义代码块,声明后可以被调用执行
特性:
声明函数不会执行函数中的代码
调用函数才会执行函数中的代码
优势:函数提高了代码的复用性
1.2 函数的声明和调用、使用方式
函数的声明:
def 函数名称([参数]): # 名称遵循变量命名规则
"""文档注释:函数的作用"""
代码
[return 返回结果] # []表示可选
# def:固定语法,关键字,专门用来声明函数
# 函数名称,就是一个标识符,命名规则参考变量
# 参数:函数中的代码执行时需要的数据
# 函数中的代码:封装起来的需要重复利用执行的代码块
# return的作用:1)返回函数中代码的执行结果 2)结束函数,后面的代码不会再执行
# 函数声明前后空2行
为方便展示,本文函数省略文档注释,实际使用中请根据情况添加。
函数调用:
多次调用不同的过程相互独立,互相不影响
无参数无返回值:函数名称()
有参数无返回值:函数名称(传递给参数的数据)
无参数有返回值:变量 = 函数名称()
有参数有返回值:变量=函数名称(传递给参数的数据)
函数使用:
当程序中需要一个重复使用的功能,定义函数
当功能在执行时需要资源,定义参数
当执行的结果,在后续代码中需要,返回结果
2 函数的参数
2.1 按照参数的作用
形式参数(形参)
位置:声明函数时放在函数名称后面括号中的变量
作用:描述函数执行时形式上需要的数据
实际参数(实参)
位置:调用执行函数时放在函数名称后面括号中的数据
作用:实际传递给函数执行时的数据,可以参与真实运算
2.2 按照参数的操作方式
2.2.1 位置参数
调用函数时,实际参数按照前后顺序依次给形式参数赋值的过程
def test(a, b):
print(a, b)
a = "音乐"
b = "丝竹"
test(a, b) # 音乐 丝竹
2.2.2 关键字参数
以 形参=实参 的形式忽略形参的定义顺序进行的传参的传参方式
关键字参数必须位置参数后面
def test(a, b, c):
print(a, b, c)
# 关键字参数与位置无关,交换位置得到相同的效果
test("终岁", c="丝竹声", b="不闻") # # 终岁 丝竹声 不闻
2.2.3 默认值参数
如果调用有给默认参数传递数据,则使用实际传递数据
如果没有传递,则使用默认数据(声明时赋值给形式参数)
def test(a, b="终岁不闻丝竹声"):
print(a, b)
# 没有传递是使用默认值
test("浔阳地僻无音乐") # 浔阳地僻无音乐 终岁不闻丝竹声
# 有传递则使用传递数据
test("浔阳地僻无音乐", "窗前明月光") # 浔阳地僻无音乐 窗前明月光
test("浔阳地僻无音乐", b="疑是地上霜") # 浔阳地僻无音乐 疑是地上霜
2.2.4 可变参数–元组参数
元组参数是符号 * 开头的参数
不确定函数执行时需要接受参数的类型和个数,可使用元组参数接收数据, 将变量包装成元组
未知参数要放在可变参数前
# args是习惯写法,可用其他字母代替
def test(*args):
print(args)
s = ("住近湓江地低湿", "黄芦苦竹绕宅生")
test("浔阳地僻无音乐", "终岁不闻丝竹声") # ('浔阳地僻无音乐', '终岁不闻丝竹声')
test(s[0]) # ('住近湓江地低湿',)
2.2.5 可变参数–字典参数
不确定函数执行过程中接受什么类型的参数个数,可使用字典参数(关键字参数)
给形参前面添加**使参数变成一个字典,所有传递的参数变成字典的键值对
# kwargs是习惯写法,可用其他字母代替
def test(**kwargs):
print(kwargs)
test(s1="浔阳地僻无音乐", s2="终岁不闻丝竹声") # {'s1': '浔阳地僻无音乐', 's2': '终岁不闻丝竹声'}
# *只作为标记,后面的是关键字参数,必须写成关键字
def test(a, *, b, c):
print(a, b, c)
test("黄芦", b="苦竹", c="绕宅生") # 黄芦 苦竹 绕宅生
2.2.6 强制关键字参数
某些特殊应用项目中,需要强制调用者使用关键字参数调用函数,提高代码可读性
# * 只作为标记,后面的是关键字参数,必须写成关键字
def test(a, *, b, c):
print(a, b, c)
test("黄芦", b="苦竹", c="绕宅生") # 黄芦 苦竹 绕宅生
2.2.6 万能参数
语义上的可以接受所有合法参数格式的数据,通常默认的表示方式(*args, **kwargs)
def test(*args, **kwargs):
print(args)
print(kwargs)
test("其间旦暮", "闻何物", s1="杜鹃啼血", s2="猿哀鸣")
('其间旦暮', '闻何物')
# ('其间旦暮', '闻何物')
# {'s1': '杜鹃啼血', 's2': '猿哀鸣'}
2.3 参数定义顺序
位置参数>元组参数>默认参数>字典参数
先定义位置参数,再定义关键字参数,字典参数必须最后
3 函数的返回值
函数的返回值:即函数中的代码执行的结果
函数执行的结果,如果在后续的代码中需要使用,就需要在函数中定义返回值并且在调用的时候接收返回值
# 返回单个数据
def test():
return "浔阳地僻无音乐,终岁不闻丝竹声"
s1 = test() # 浔阳地僻无音乐,终岁不闻丝竹声
print(s1)
# 返回一组数据
def test2():
return ["住近湓江地低湿", "黄芦苦竹绕宅生"] # 可指定数据类型(元组,列表)
s2 = test2()
print(s2) # ['住近湓江地低湿', '黄芦苦竹绕宅生']
# 返回多个数据(元组)
def test3():
return "其间旦暮闻何物", "杜鹃啼血猿哀鸣"
s3 = test3() # ('其间旦暮闻何物', '杜鹃啼血猿哀鸣')
print(s3)
# 连续赋值接收
a, b = test3()
print(a) # 其间旦暮闻何物
print(b) # 杜鹃啼血猿哀鸣
4 函数的互相调用和递归函数
4.1 函数相互调用
在代码中,一个函数调用另一个函数
需要注意函数什么时候执行结束
def test1():
print("浔阳地僻无音乐", end=" ")
def test2():
test1()
print("终岁不闻丝竹声")
test2() # 浔阳地僻无音乐 终岁不闻丝竹声
4.2 递归函数
递归调用就是函数自己调用执行自己
递归函数的两个条件:
1)必须留出口
2)自己调用自己
递归调用一定要注意:
每次调用自己都会在内存中多复制一份~如果递归次数过多,最终会导致申请的内存消耗完了[内存溢出],导致程序崩溃。
# 打印5次指定字符
def test(num):
if num == 0:
return
print("浔阳", num, end=" ")
num = num - 1
return test(num) # 浔阳 浔阳 浔阳 浔阳 浔阳
test(5)