建议先阅读我之前的博客,掌握一定的Python前置知识后再阅读本文,链接如下:

带你从入门到精通——Python(一. 基础知识)-CSDN博客

带你从入门到精通——Python(二. 判断语句和循环语句)-CSDN博客

带你从入门到精通——Python(三. 函数基础)-CSDN博客

带你从入门到精通——Python(四. 五大容器一)-CSDN博客

带你从入门到精通——Python(五. 五大容器二)-CSDN博客

目录

六. 函数进阶

6.1 函数的多返回值

6.2 位置参数

6.3 关键字参数

6.4 缺省参数

6.5 不定长参数

6.5.1 位置传递

6.5.2 关键字传递

6.6 匿名函数

6.7 递归函数


六. 函数进阶

6.1 函数的多返回值

        如果一个函数有多个返回值,我们可以在return关键字之后写多个返回值,并用逗号隔开,Python会默认把它们封装到元组中,然后将元组返回给调用者,之后我们可以按照返回值的顺序,写对应顺序的多个变量接收即可,此外还可以同时返回不同类型的数据类型,具体示例如下:

# 需求: 要求定义一个show函数,返回1,2,3,4,5值,然后调用的时候接收并打印
# 1.先定义函数
def show():
    # 默认多个值用元组装包
    return 1, 2, 3, 4, 5


# 2.调用函数
result = show()
# 直接写a, b, c, d, e = show()也行

# 拆包
a, b, c, d, e = result
print(a, b, c, d, e)

6.2 位置参数

        位置参数是指调用函数时根据函数定义的参数位置来传递的参数,具体示例如下:

def show1(name, age, height):
    print(f"{age}岁的{name},身高是{height}厘米")

# 位置传参: 个数和顺序都必须一致
show1('小明', 18, 177)
# 输出'8岁的小明,身高是177厘米'

        注意:传递的参数和定义的参数的顺序及个数必须一致。

6.3 关键字参数

        关键字参数是指在函数调用时使用通过“键 = 值”的形式来传递的参数,使用关键字参数可以让函数更加清晰、容易使用,此外关键字参数可以不按照函数定义的参数位置来传参,清除了位置参数的顺序需求,具体示例如下:

def show1(name, age, height):
    print(f"{age}岁的{name},身高是{height}厘米")

# 关键字传参: 顺序无所谓,但是个数必须一致
show1(name = '小明', age = 18, height = 177.8)
# 输出'18岁的小明,身高是177.8厘米'

# 位置传参和关键字传参配合: 位置传参必须在前
show1('小明', age = 18, height = 177.8)
# 输出'18岁的小明,身高是177.8厘米'

        注意:函数调用时,如果有位置参数,位置参数必须在关键字参数的前面,但关键字参数之间不存在先后顺序。

6.4 缺省参数

        缺省参数也叫默认参数,是指在定义函数时为参数提供默认值,调用函数时可以不为该参数转递值,直接使用函数定义时的默认值(注意:所有位置参数必须出现在默认参数前,包括在函数定义时以及函数调用时),具体示例如下:

def show2(name, age, height = 180.8):
    print(f"{age}岁的{name},身高是{height}厘米")

# 关键字传参: 顺序无所谓,但是个数必须一致
show2(name = '小明', age = 18)
# 输出'18岁的小明,身高是180.8厘米'

# 位置传参和关键字传参配合: 位置传参必须在前
show2('小明', age = 18, height = 177.8)
# 输出'18岁的小明,身高是177.8厘米'

        注意:函数调用时,如果为缺省参数传值则使用传入的参数值, 否则直接使用函数定义时的默认值。

6.5 不定长参数

        不定长参数也叫可变参数,不定长参数可以接收函数调用时被传入的多个参数(不传参也可以),用于在不确定调用的时候需要传递的参数数量时使用。

6.5.1 位置传递

        位置传递是使用不定长参数的第一种方式,传进的所有参数都会被args元组收集,它会收集传入的多个参数,并根据传进参数的位置合并在args元组中,具体示例如下:

def show3(*args):
    print(args)

show3('小明', 18, 180.8)
# 输出('小明', 18, 180.8)

        注意:args只是一个元组名,可以任意命名,但推荐使用args作为元组名,*表示对元组进行拆包操作。

6.5.2 关键字传递

        使用不定长参数的第二种方式是关键字传递,如果传参时使用关键字参数进行传递,即使用“键 = 值”形式传递,所有的“键 = 值”都会转换为键值对,被kwargs字典接收,具体示例如下:

def show4(**kwargs):
    print(kwargs)

show4(name = '小明', age = 18, height = 180.8)
# 输出{'name': '小明', 'age': 18, 'height': 180.8}

        注意:kwargs只是一个字典名,可以任意命名,但推荐使用kwargs作为字典名,**表示对字典进行解析操作,将键值对解析为“键 = 值”的格式。

6.6 匿名函数

        匿名函数,又叫lambda表达式,它是一种简单函数的简洁写法,其语法形式为:

        lambda 形参1, 形参2, ... : 单行表达式函数调用,具体示例如下:

def show5():
    print('感谢点赞关注收藏')

func1 = lambda x, y : x + y
# lambda x, y : x + y其实就是一个函数,该函数没有名字,所以又叫匿名函数,
# 但如果用变量接收了该函数,变量名就相当于函数名。
res = func1(1, 3)
print(res)
# 输出 4

func2 = lambda : show5()
func2()
# 输出 '感谢点赞关注收藏'

        注意:1. 匿名函数中不能使用 while 循环、for 循环,只能编写单行的表达式,或函数调用。

        2 .匿名函数中返回结果不需要使用 return,表达式的运行结果就是返回结果。

        3. 匿名函数中也可以不返回结果。例如: lambda : print('hello world')  # 输出 'hello world'。

6.7 递归函数

        递归就是某个函数直接或者间接地调用自身的一种设计程序思想,这样原问题的求解就转换为了许多性质相同但是规模更小的子问题。

        在实际工作中,递归有多种应用场景:

        1. 实现复杂的数学计算,如斐波那契数列,求汉诺塔 ,

        2. 实现文件递归查询,递归查询某个目录以及子目录下的所有文件

        对于递归来说有如下的三要素:

        1. 明确你这个函数想要干什么。对于递归,很重要的一个事就是,这个函数的功能是什么,它要完成什么样的一件事,而这个,是完全由你自己来定义的。也就是说,我们先不管函数里面的代码什么,而是要先明白,你这个函数是要用来干什么。

        2. 寻找递归结束条件。所谓递归,就是会在函数内部代码中,调用这个函数本身,所以,我们必须要找出递归的结束条件,不然的话,会一直调用自己,进入无底洞。也就是说,我们需要找出当参数为何值时,递归结束,之后直接把结果返回,请注意,这个时候我们必须能根据这个参数的值,能够直接知道函数的结果是什么,而不需要继续向下递归。

        ③ 找出函数的等价关系式。最后一个要是是我们要不断缩小参数的范围,缩小之后,我们可以通过一些辅助的变量或者操作,使原函数的结果不变。

        示例:如何求斐波那契数列的第10项(斐波那契数列是一个数字序列,从0和1开始,后续的每一项都是前两项的和):

def fib(n):
    if n < 2:
        return n
    return fib(n - 1) + fib(n - 2)
print(fib(10))
# 输出 55
Logo

GitCode 天启AI是一款由 GitCode 团队打造的智能助手,基于先进的LLM(大语言模型)与多智能体 Agent 技术构建,致力于为用户提供高效、智能、多模态的创作与开发支持。它不仅支持自然语言对话,还具备处理文件、生成 PPT、撰写分析报告、开发 Web 应用等多项能力,真正做到“一句话,让 Al帮你完成复杂任务”。

更多推荐