【Python】第九部分 函数
文章目录
9. 函数
9.1 函数的定义与调用
什么是函数?函数就是执行可以完成特定功能的一段代码
为什么需要函数?可以复用代码,提高可读性和可维护性
# def 函数名(形参,形参):
# 函数体
# return
def fun1(num1, num2): # num1和num2 表示的是形参
return num1 + num2
res = fun1(10, 20) # 10 和 20表示的是实参
print(res)
9.2 函数调用的参数传递:位置实参,关键字实参
# 位置实参就是根据对应的位置进行传参
def fun2(num1, num2):
return num1 * num2
# 将20和30依次赋值给num1和num2,这种就叫做位置实参传递
res = fun2(20, 30)
print(res)
# 通过指定形参名称进行赋值,这种就叫做关键字实参传递
res1 = fun2(num2=10, num1=30)
print(res1)
9.3 函数参数传递的内存分析
def fun3(a, b):
a = 100
b.append(50)
return a, b
n1 = 10
n2 = [10, 20, 30, 40]
print(fun3(n1, n2)) # (100, [10, 20, 30, 40, 50])
print(n1) # 10
print(n2) # [10, 20, 30, 40, 50]
# 通过上面不难看出n1未被修改,而n2被修改了
'''
原因:在函数调用的过程中,进行参数的传递,如果是不可变对象
那么函数体内的修改并不会影响实参,如果是可变对象,那么函数体内
的修改会影响到实参
'''
9.4 函数的返回值
-
没有返回值,如果函数执行完你并不需要传递数据,可以不写return
-
返回值的个数是一个的话,那么直接返回该类型
-
如果返回的结果是多个,则返回的是元组
def fun2():
print('hello')
fun2() # hello
def fun3(a, b):
return a + b
print(fun3(10, 20)) # 30
def fun4(a, b):
res = a + b
res1 = a * b
return res, res1
print(fun4(10, 20)) # (30,200)
9.5 默认值参数
# 默认值参数
# 如果没有传参则使用默认值,如果有传参则覆盖默认参数的值
def fun5(a, b=2):
return a // b
print(fun5(10)) # 5
9.6 个数可变的位置参数,个数可变的关键字参数
'''
在定义函数的时候,可能事先无法确定需要传递位置参数的个数
这个时候就可以使用可变的位置参数,在参数前面加个*,返回的是元组
注意:个数可变的位置参数只能有一个
'''
def fun6(*args): # 在形参中使用可变的位置参数
print(args)
fun6(10, 2, 32, 23) # (10, 2, 32, 23)
# 还可以写在实参中
def fun66(a, b):
print(a, b)
lis = ['hello', 'world']
fun66(*lis) # 将每个元素都转化为位置实参传入
# --------------------------------------------
'''
在定义函数的时候,可能事先无法确定需要传递关键字参数的个数
这个时候就可以使用可变的关键字参数,在参数前面加个**,返回的是字典
注意:个数可变的关键字参数只能有一个
'''
def fun7(**args): # 在形参中使用可变的关键字参数
print(args)
fun7(a='123', b='456') # {'a': '123', 'b': '456'}
# 还可以写在实参中
def fun77(name, age):
print(name, age)
dic = {'name': 'Jack', 'age': 18}
fun77(**dic) # 将每个元素都转化为关键字实参传入
# -----------------------------------------
'''
个数可变的位置参数和个数可变的关键字参数同时使用的时候,
个数可变的位置参数必须写在前面不然会报错
'''
def fun8(*args1, **args2):
print(args1, args2)
fun8('123', '456', a='789') # ('123', '456') {'a': '789'}
9.7 递归函数
什么是递归函数?
如果在一个函数中调用了了函数本身,那么这个函数就叫做递归函数,递归函数必须要有终止条件,不然就成了死循环了。
递归函数的优缺点:
- 缺点:占用的内存多,效率低下
- 优点:思路和代码简单
'''
递归的调用过程:每执行一次函数,都会在栈内存中分配一个栈帧
每执行完一次函数,都会释放对应的内存空间
'''
# 实现阶乘
def fun9(n):
if n == 1:
return 1
else:
res = n * fun9(n - 1)
return res
print(fun9(5)) # 120
# 实现斐波那契数列(第三个数是前两个之和)
# 1 1 2 3 5 8 13 21 34 55 89
def fb(n):
if n == 1:
return 1
elif n == 2:
return 1
else:
return fb(n-1) + fb(n-2)
print(fb(10)) # 55
9.9 匿名函数
匿名函数只能临时使用一次,并且函数体只能写一行
通过关键字 lambda
语法: lambda 参数 : 函数体
def res(func):
print(func(12, 20))
res(lambda x, y: x + y)
9.10 高阶函数
def add(x, y):
return x + y
# 把函数当成参数进行传递
def res(fun):
return fun(2, 4)
print(res(add))
9.8 函数说明文档
def add(x,y):
"""
函数说明,当鼠标移入函数名上既可以看到我
固定格式
:params x: 数字1
:params y: 数字2
:return: 返回相加后的值
"""
return x + y
总结
以上就是今天要讲的内容,希望对大家有所帮助!!!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/82892.html