Python3.5基础之函数的定义与使用实例详解【参数、作用域、递归、重载等】

  • Post category:Python

Python 3.5基础之函数的定义与使用实例详解【参数、作用域、递归、重载等】

函数是Python中的一种重要的代码组织形式,它可以将一个复杂的问题分解成多个简单的问题,并把这些简单问题组织起来,最终构成一种可复用的、高效的解决方案。本文将详细讲解Python中函数的定义与使用,并介绍函数参数、作用域、递归和函数重载等相关知识。

函数的定义

定义函数的语法如下:

def function_name(parameters):
    """docstring"""
    statement(s)

其中,def关键字表示定义函数,function_name表示函数名,parameters表示函数的参数列表,docstring表示函数的说明文档,statement(s)表示函数体,即函数具体实现的代码。下面的示例展示了如何定义一个简单的函数:

def hello_world():
    """这个函数用于输出Hello, world!"""
    print('Hello, world!')

该函数不能接受任何参数,当被调用时,它会输出字符串Hello, world!。在定义函数时,我们可以为函数编写说明文档,这些文档可以在函数定义中通过docstring来描述,可通过访问函数的__doc__属性获取。例如,我们可以通过以下代码获取上述函数的说明文档:

print(hello_world.__doc__)

输出结果为:

这个函数用于输出Hello, world!

函数的参数

函数的参数指的是调用函数时传递给函数的数据。在Python中,函数的参数可以分为两种:

  • 位置参数:按照顺序匹配。例如,在下面的代码中,add函数有两个位置参数ab
def add(a, b):
    return a + b
  • 关键字参数:按照名称匹配。例如,在下面的代码中,print_info函数有三个关键字参数nameagesex
def print_info(name, age, sex):
    print('name:', name)
    print('age:', age)
    print('sex:', sex)

在调用函数时,我们可以同时使用位置参数和关键字参数。具体示例如下:

# 使用位置参数调用
c = add(1, 2)
print(c)

# 使用关键字参数调用
print_info(name='zhangsan', sex='male', age=20)

输出分别为:

3
name: zhangsan
age: 20
sex: male

函数的作用域

在Python中,函数的作用域用于表示变量能够被访问的范围。Python中有两种作用域:

  • 全局作用域:表示变量在整个程序中均可被访问。在函数外部定义的变量属于全局作用域。

  • 局部作用域:表示变量只能在函数内部被访问。例如,在下面的代码中,add函数内部的变量c属于局部作用域,只能在函数内部访问。

def add(a, b):
    c = a + b
    return c

在Python中,默认情况下,函数无法修改全局变量的值。如果需要修改全局变量的值,需要使用global关键字。例如,在下面的代码中,global关键字用于告诉Python,count是一个全局变量。

count = 0

def add(num):
    global count
    count += num
    return count

函数的递归

递归是指函数调用自身的方式。在Python中,递归函数可以用于处理一些复杂的问题,例如计算阶乘、计算斐波那契数列等。下面的代码展示了如何使用递归函数计算阶乘:

def factorial(n):
    if n == 1:
        return 1
    else:
        return n * factorial(n-1)

其中,factorial函数计算阶乘。如果n等于1,则返回1;否则,递归调用factorial(n-1),并返回n * factorial(n-1)的结果。

函数的重载

函数的重载指的是编写多个同名函数,但参数个数或类型不同。在Python中,没有函数重载的概念。但是,我们可以通过参数默认值、可变参数和关键字参数等方式实现类似函数重载的功能。例如:

def add(a, b=0, c=0):
    return a + b + c

print(add(1))           # 1
print(add(1, 2))        # 3
print(add(1, 2, 3))     # 6

在上述代码中,add函数有一个必须参数a和两个可选参数bc。当只传递一个参数时,默认值会初始化为0。当传递两个或三个参数时,会覆盖默认值。这就实现了函数重载的功能。

示例说明

示例一:基于递归的斐波那契数列实现

下面的代码展示了如何使用递归函数计算斐波那契数列:

def fibonacci(n):
    if n <= 1:
        return n
    else:
        return (fibonacci(n-1) + fibonacci(n-2))

for i in range(10):
    print(fibonacci(i))

在该示例中,fibonacci函数使用递归方式计算斐波那契数列。当n小于等于1时,返回n;否则,递归调用fibonacci(n-1)fibonacci(n-2),并返回它们的和。for循环运行10次,依次输出斐波那契数列的前10个数。

示例二:关键字参数实现打印货物信息

下面的代码展示了如何定义一个print_goods_info函数,并使用关键字参数打印货物的信息:

def print_goods_info(name, price, **kwargs):
    print('Goods name: ', name)
    print('Goods price:', price)
    for key, value in kwargs.items():
        print(key, ':', value)

print_goods_info('book', 20, author='Tom', publisher='Pearson')

在该示例中,print_goods_info函数定义了三个参数,其中nameprice为位置参数,**kwargs为可变关键字参数。在调用print_goods_info函数时,我们传递了三个参数,其中两个是位置参数,一个是关键字参数。**kwargs表示收集余下的关键字参数,将它们放到一个字典中,这样我们可以打印出传递给函数的所有货物信息。运行结果如下:

Goods name:  book
Goods price: 20
author : Tom
publisher : Pearson

通过上述示例,我们在实际开发中能够很好的运用函数,进而提高程序的可重用性和代码复用率。