原创

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)  #可以不传参数,也可以传一个参数,也可以传两个参数
  1. 个数可变的位置参数

    • 定义函数时,可能无法事先确定传递的位置实参的个数时,使用可变的位置参数
    • 使用*定义个数可变的位置形参
    • 结果为一个元组
  2. 个数可变的关键子形参

    • 定义函数时,无法事先确定传递的关键字实参的个数时,使用可变的关键形参
    • 使用**定义个数可变的关键字形参
    • 结果为一个字典
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)
正文到此结束