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
函数有两个位置参数a
和b
。
def add(a, b):
return a + b
- 关键字参数:按照名称匹配。例如,在下面的代码中,
print_info
函数有三个关键字参数name
、age
和sex
。
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
和两个可选参数b
和c
。当只传递一个参数时,默认值会初始化为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
函数定义了三个参数,其中name
和price
为位置参数,**kwargs
为可变关键字参数。在调用print_goods_info
函数时,我们传递了三个参数,其中两个是位置参数,一个是关键字参数。**kwargs
表示收集余下的关键字参数,将它们放到一个字典中,这样我们可以打印出传递给函数的所有货物信息。运行结果如下:
Goods name: book
Goods price: 20
author : Tom
publisher : Pearson
通过上述示例,我们在实际开发中能够很好的运用函数,进而提高程序的可重用性和代码复用率。