Python基础之函数原理与应用实例详解
1. Python函数原理及特点
函数是Python中重要的概念之一。它是一段可重复调用的代码,可以通过向函数传递参数以及调用函数返回值来实现程序设计中的结构化和模块化。下面给出Python函数的基本结构:
def function_name(parameters):
"""docstring"""
statement(s)
return expression
其中,def关键字定义函数,后跟函数名称和带括号的一组参数,参数用逗号分隔,确切的参数列表和指示符号可能会变化,但在最简单的形式中,参数列表不包含任何默认值。在函数定义的第一行结束时,必须要有一个冒号。
docstring是描述函数作用的字符串,可以通过特殊属性__doc__访问。在函数名称下方用三引号括起来,可以多行描述。下面是一个函数的具体实例:
def square(x):
"""计算x的平方"""
return x*x
在定义函数之后,可以通过函数名称和括号调用函数,并向其传递参数以获得返回值:
>>> square(4)
16
>>> square(3+2j)
(-7+24j)
Python函数的以下特点值得注意:
1.1 可以返回多个值
在Python中,函数可以返回多个值,这是因为Python中的函数实际上返回的是一个元组:
def square_and_cube(x):
"""计算x的平方和立方"""
return x*x, x*x*x
>>> square_and_cube(3)
(9, 27)
在调用函数时,可以用逗号分隔的变量名接收函数返回的元组中的值:
>>> s, c = square_and_cube(3)
>>> print(s, c)
9 27
使用逗号分隔的_list,tuple,dict等可变长度变量基本上都是借助元组的return语法实现的。
1.2 变量作用域的问题
Python函数有局部作用域和全局作用域之分。变量名的命名空间相对于函数定义为局部命名空间,其余位置是全局命名空间。在函数内部定义的变量只在函数内部可用,除非它们被显示声明为全局变量:
def add_one():
global num
num += 1
return num
num = 1
print(add_one())
print(num)
上述代码将输出:
2
2
如果省略了global声明,Python将创建一个名为num的局部变量,这样全局变量num将保持不变:
def add_one():
num += 1
return num
num = 1
print(add_one())
print(num)
上述代码将返回错误:UnboundLocalError: local variable 'num' referenced before assignment。
2. Python函数的应用实例
2.1 计算斐波那契数列
斐波那契数列是指该数列中每一个数都是前两个数之和。下面是计算斐波那契数列的一个Python函数:
def fibonacci(n):
"""计算斐波那契数列"""
if n == 0 or n == 1:
return n
else:
return fibonacci(n-1) + fibonacci(n-2)
for i in range(10):
print(fibonacci(i))
上述代码将返回前10个斐波那契数列:
0
1
1
2
3
5
8
13
21
34
2.2 缓存函数结果
在计算同一函数的结果,但是参数较大的情况下,可以使用缓存函数结果的方法提高计算效率。下面是将缓存函数结果应用到斐波那契数列计算中的Python函数:
from functools import lru_cache
@lru_cache(maxsize=None)
def fibonacci(n):
"""计算斐波那契数列"""
if n == 0 or n == 1:
return n
else:
return fibonacci(n-1) + fibonacci(n-2)
for i in range(10):
print(fibonacci(i))
上述代码将返回同样的前10个斐波那契数列,但是在重复计算中缓存了结果,提升了计算效率。
2.3 实现迭代器
Python中函数可以返回迭代器,这为构造一些特殊的型式提供了途径。下面是实现斐波那契数列迭代器的Python函数:
class FibonacciIterator:
"""斐波那契数列迭代器"""
def __init__(self, len):
self.x = 0
self.y = 1
self.len = len
self.cur_len = 0
def __iter__(self):
return self
def __next__(self):
if self.cur_len < self.len:
self.x, self.y = self.y, self.x + self.y
self.cur_len += 1
return self.x
else:
raise StopIteration
for i in FibonacciIterator(10):
print(i)
上述代码将返回前10个斐波那契数列。
2.4 动态参数
动态参数指可接收不定量参数的函数,这些参数的数量不确定。
2.4.1 *args参数
*args指任何多个无名参数,它是一个tuple。下面是一个Python函数的举例:
def add_numbers(*args):
"""计算一个多个整数之和"""
sum = 0
for i in args:
sum += i
return sum
print(add_numbers(1, 2, 3))
print(add_numbers(1, 2, 3, 4, 5))
上述代码将返回:
6
15
2.4.2 **kwargs参数
**kwargs接收任何关键字参数,它是一个字典类型。下面是一个Python函数的举例:
def print_dict(**kwargs):
"""打印任意个关键字"""
for key, value in kwargs.items():
print('{}: {}'.format(key, value))
print_dict(name='Alice', age=20, gender='female')
上述代码将返回:
name: Alice
age: 20
gender: female
2.5 lambda函数
lambda函数也称为匿名函数,它允许在一行内定义简单的函数。下面是一个Python函数的举例:
square = lambda x : x**2
print(square(2))
上述代码将返回4。
2.6 函数式编程
函数式编程(Functional programming)是一种编程范式。Python支持函数式编程,可以通过一系列函数来实现。
2.6.1 map()
map函数可以对应多个序列的对应元素执行函数。下面是一个Python函数的举例:
lst = [1, 2, 3, 4, 5]
square = lambda x : x**2
result = map(square, lst)
print(list(result))
上述代码将返回1, 4, 9, 16, 25,对应lst中的每一个元素。
2.6.2 reduce()
reduce函数是对list中的元素进行累积计算。下面是一个Python函数的举例:
from functools import reduce
lst = [1, 2, 3, 4, 5]
result = reduce(lambda x, y: x * y, lst)
print(result)
上述代码将返回120(即5的阶乘)。
2.6.3 filter()
filter函数可以筛选序列中满足条件的元素,返回一个新的列表。下面是一个Python函数的举例:
lst = [1, 2, 3, 4, 5]
result = filter(lambda x: x%2==0, lst)
print(list(result))
上述代码将返回2, 4,即序列中的偶数。
总结
Python函数是程序设计中的基础知识之一。本文详细介绍Python函数的原理和特点,并以斐波那契数列计算、缓存函数结果、实现迭代器、动态参数、lambda函数、函数式编程等实例加深了读者对Python函数的理解。当然Python函数有很多其他特殊用法,此处只是截取了其中的一部分精华。不过掌握了Python函数的基本用法,读者就可以在实际编程中灵活运用,并且通过进一步学习深入了解更为高级的使用方法。