Python函数入门


函数入门

如何让代码可以被重复使用?如何提高代码的可读性和可维护性?方法之一便是使用函数。函数就是组织在一起的、可以被其他代码调用的、实现特定功能的一段代码。

目标:掌握函数的编写方式以及函数的基本使用。

概要:

  • 初识函数
  • 函数的参数
  • 函数的返回值

定义函数

在Python中,用关键字def定义函数,其语法为

# 定义函数
def 函数名():
    函数内编写代码
    return 返回值
    ...

# 执行函数
函数名()

例如,我们定义一个求某数的n次方的函数,示例如图所示。

image-20211215090306176

简化power函数

image-20211215090409767

为了进一步理解函数的概念和用法,下面再以斐波那契数列(Fibonacci sequence)的函数定义做进一步说明。斐波那契数列的定义可简要表述为:第一项和第二项的值均为1,其后每一项的值为其前两项的值之和。其函数定义及调用如下图所示。

斐波那契数列的定义可简要表述为:第一项和第二项的值均为1,其后每一项的值为其前两项的值之和。

image-20211215090620283

函数的参数

在定义函数时,如果在括号中添加变量,我们称它为函数的形式参数。

默认参数值

在某些情况下,我们可能需要以默认参数值调用函数。例如,下图中关于求某数的n次方的函数,我们希望默认情况下为求平方。也就是说,如果不提供n的值,则默认n为2。

image-20211215090927771

不定长参数

在某些情况下,我们在定义函数时可能不知道需要传递的参数的个数。在这种情况下,我们可以使用*args**kwargs的方式来传递所有参数。其中,“”表示将未命名参数以元组的形式传入;“*”表示将命名参数以字典的形式传入。

image-20211215091113115

args及kwargs并不是Python的关键字,只是惯例写法而已。有了“”和“**”这样的不定长参数传递方式,函数就可以处理任何形式和数量的参数了。

# 1. ** 必须放在 * 的后面
def func1(*args, **kwargs):
    print(args, **kwargs)


# 2. 参数和动态参数混合时,动态参数只能放在最后。
def func2(a1, a2, a3, *args, **kwargs):
    print(a1, a2, a3, args, **kwargs)


# 3. 默认值参数和动态参数同时存在
def func3(a1, a2, a3, a4=10, *args, a5=20, **kwargs):
    print(a1, a2, a3, a4, a5, args, kwargs)


func3(11, 22, 33, 44, 55, 66, 77, a5=10, a10=123)

函数返回值

在开发过程中,我们希望函数可以帮助我们实现某个功能,但让函数实现某功能之后有时也需要有一些结果需要反馈给我们,这里就需要使用返回值了。

在了解了返回值的基本使用之后,接下来在学3个关键知识:

  • 返回值可以是任意类型,如果函数中没写return,则默认返回None
    def func():
        return [1,True,(11,22,33)]

    result = func()
    print(result)
    def func():
        value = 1 + 1

    ret = func()
    print(ret) # None
当在函数中`未写返回值`  `return`  `return None` ,执行函数获取的返回值都是None。
    def func():
        value = 1 + 1
        return  # 或 return None

    ret = func()
    print(ret) # None
  • return后面的值如果有逗号,则默认会将返回值转换成元组再返回。
    def func():
        return 1,2,3

    value = func()
    print(value) # (1,2,3)
  • 函数一旦遇到return就会立即退出函数(终止函数中的所有代码)
    def func():
        print(1)
        return "结束吧"
        print(2)
    ret = func()
    print(ret)