Python基础(篇四)
温馨提示:
本文最后更新于 2022年10月27日,已超过 918 天没有更新。若文章内的图片失效(无法正常加载),请留言反馈或直接联系我。
八. 函数
什么是函数:函数就是执行特定任和以完成特定功能的一段代码
为什么需要函数:
- 复用代码
- 隐藏实现细节
- 提高可维护性
- 提高可读性便于调试
tips: 如果是不可变对象,在函数体内的修改不会影响原参数,如果是可变对象,在函数体内的修改会影响原参
1. 函数的创建和调用
创建:
def 函数名([输入参数]):
函数体
return xxx(可以没有返回值)
调用:
def helloPython(name):
print(name)
return name+'你好啊!!!!'
val = helloPython('张三')
//执行后打印值
张三
张三你好啊!!!!
2. 函数的参数传递
如果是不可变对象,在函数体内的修改不会影响原参数,如果是可变对象,在函数体内的修改会影响原参
"""如果是不可变对象,在函数体内的修改不会影响原参数,如果是可变对象,在函数体内的修改会影响原参数"""
def test(a,b):
print("a=",a)
print("b=",b)
a=200
print("函数内修改后的a=",a)
b["age"] = 10
print("函数内修改后的b=",b)
a = 666
b = {"userName":"张三"}
test(a,b)
print("调用函数后的a=",a)
print("调用函数后的b=",b)
结果值:
a= 666
b= {'userName': '张三'}
函数内修改后的a= 200
函数内修改后的b= {'userName': '张三', 'age': 10}
调用函数后的a= 666
调用函数后的b= {'userName': '张三', 'age': 10}
3. 函数的返回值
函数返回多个值时,结果为元组
def fun(num):
odd = []
even = []
for item in num:
if item%2 ==0:
odd.append(item)
else:
even.append(item)
return odd,even
result = fun([i for i in range(1,20)]);
print(result)
print(type(result))
([2, 4, 6, 8, 10, 12, 14, 16, 18], [1, 3, 5, 7, 9, 11, 13, 15, 17, 19])
<class 'tuple'>
4. 函数的参数定义
定义默认参数
def fun(a,b=20): #b为默认值为20
print(a*b)
def funTemp(a=50,b=20): #a为默认值为50,b为默认值为20
print(a-b)
fun(20) #可以传一个参数,也可以传两个参数
fun(20,44) #可以传一个参数,也可以传两个参数
funTemp() #可以不传参数,也可以传一个参数,也可以传两个参数
funTemp(20) #可以不传参数,也可以传一个参数,也可以传两个参数
funTemp(20,-45) #可以不传参数,也可以传一个参数,也可以传两个参数
个数可变的位置参数
- 定义函数时,可能无法事先确定传递的位置实参的个数时,使用可变的位置参数
- 使用*定义个数可变的位置形参
- 结果为一个元组
个数可变的关键子形参
- 定义函数时,无法事先确定传递的关键字实参的个数时,使用可变的关键形参
- 使用**定义个数可变的关键字形参
- 结果为一个字典
def fun(*args): #个数可以变化的位置参数。参数结果是元组
print(args)
fun(10)
fun(10,20,30)
def fun1(**args): #个数可变的关键字形参,参数结果是字典(map)。
print(args)
fun1(a=110)
fun1(a=110,b=120,c=130)
(10,)
(10, 20, 30)
{'a': 110}
{'a': 110, 'b': 120, 'c': 130}
一个函数中既有个数可变的形参,又有个数可变的关键字参数,第一个放前面,第二个放后面
def fun2(*args,**args2):
pass
总结
参数的类型 | 函数的定义 | 函数的调用 | 备注 |
---|---|---|---|
位置实参 | √ | ||
将序列中的每个元素都转换为位置实参 | √ | 使用* | |
关键字实参 | √ | ||
将字典中的每个键值对都转换为关键字实参 | √ | 使用** | |
默认值形参 | √ | ||
关键字形参 | √ | 使用* | |
个数可变的位置形参 | √ | 使用* | |
个数可变的关键字形参 | √ | 使用** |
""""指定参数只能使用关键字传参"""
def test(a,b,c,d): #此种定义方式可以任意传参,可以传实参,可以传关键字参数
print(a,b,c,d)
test(10,20,30,40)
test(10,20,c=30,d=40)
test(a=10,b=20,c=30,d=40)
def test2(a,b,*,c,d): #此种定义方式,*后的参数只能采用关键字传参
print(a,b,c,d)
test2(10,b=20,c=20,d=55)
test2(10,20,c=20,d=55)
5. 变量的作用域
- 程序代码能访问该变量的区域
- 根据变量的有效范围可分为
- 局部变量:在函数内定义并使用的变量,只在函数内部有效,局部变量使用global声明,这个变量就会就成全局变量
- 全局变量:函数体外定义的变量,可作用于函数内外
6.递归函数
- 什么是递归函数
- 如果在一个函数的函数体内调用了该函数本身,这个函数就称为递归函数递归的组成部分
- 递归的组成部分
- 递归调用与递归终止条件
递归的调用过程
- 每递归调用一次函数,都会在栈内存分配一个栈帧
- 每执行完一次函数,都会释放相应的空间
递归的优缺点
- 优点:思路和代码简单
- 缺点:占用内存多
计算一个数字的阶乘
#计算一个数字的阶乘
def test(num):
if num==1:
return 1
else:
return num*test(num-1)
正文到此结束
- 本文标签: python
- 本文链接: https://www.tianyajuanke.top/article/45
- 版权声明: 本文由吴沛芙原创发布,转载请遵循《署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)》许可协议授权