1. Python函数基础
Python作为一门编程语言,提供了函数的支持,接下来我们将从函数的定义、调用和参数三个方面来介绍Python函数。
1.1 函数定义
在Python中,函数的定义使用def
关键字,格式如下:
def function_name(parameters):
'''docstring'''
# function body
return [expression]
其中:
function_name
为函数名;
parameters
为函数参数,可以是位置参数、关键字参数、默认参数和可变参数;
docstring
为函数的文档字符串,用于说明函数的作用、参数说明、返回值说明等;
function body
为函数体,其中包含了函数的具体实现。
return
关键字用于返回函数的执行结果。
例如,下面定义了一个名为add
的函数,该函数接收两个位置参数a
和b
,并返回它们的和:
def add(a, b):
'''计算两个数的和'''
c = a + b
return c
在函数定义中,docstring
是可选的。一个好的docstring
可以让读者更好地理解函数的作用。
1.2 函数调用
函数定义好之后,我们可以通过函数名来调用函数。函数调用格式如下:
function_name(arguments)
其中,arguments
为函数参数,可以是位置参数或关键字参数。例如,我们可以通过以下方式调用add
函数:
result = add(1, 2)
print(result)
执行结果为:
3
1.3 函数参数
Python函数的参数可以是位置参数、关键字参数、默认参数和可变参数。
1.3.1 位置参数
位置参数就是按照参数顺序依次传递的参数,例如上述例子中的a
和b
。
1.3.2 关键字参数
关键字参数是通过指定参数名来传递的参数,例如:
result = add(b=1, a=2)
print(result)
执行结果为:
3
可以看到,通过指定参数名,我们可以不按照参数定义的顺序来传递参数。
1.3.3 默认参数
默认参数是在函数定义时就已经赋值的参数,例如:
def power(base, exponent=2):
'''计算幂'''
return base ** exponent
result = power(2)
print(result)
result = power(2, 3)
print(result)
执行结果为:
4
8
可以看到,当我们不传递第二个参数时,默认值为2。
1.3.4 可变参数
可变参数可以接收任意数量的参数,例如:
def print_args(*args):
'''打印可变参数'''
for arg in args:
print(arg)
print_args(1, 2, 3)
执行结果为:
1
2
3
在函数定义时,我们使用一个星号(*
)将参数前缀,这样就可以让参数接收任意数量的参数。
2. Python的lambda函数
除了上述介绍的常规函数,Python还支持一种特殊的函数——lambda
函数。
lambda
函数也称为匿名函数,它是一种简单的函数定义方式,可以在一行代码中定义函数。
lambda arguments: expression
其中,arguments
为参数列表,可以有多个参数,参数之间用逗号分隔;expression
为函数体,通常为一个简单的表达式。
例如,我们可以通过以下方式定义一个计算平方的匿名函数:
f = lambda x: x ** 2
result = f(2)
print(result)
执行结果为:
4
以上代码中,我们定义了一个lambda
函数,并将其赋值给变量f
,然后调用f
并传入参数2。
lambda
函数通常用于函数式编程中,特别是在需要传递函数作为参数的场合,对于一些简单的函数,使用lambda
函数可以简化代码。
3. Python的高阶函数
Python中的函数可以作为参数传递给其他函数,或者作为返回值返回,这些函数称为高阶函数。
在Python中,常见的高阶函数有map
、filter
和reduce
。
3.1 map函数
map
函数用于对列表或其他可迭代对象中的元素执行相同的操作,返回一个新的列表。
map
函数的定义格式如下:
map(function, iterable, ...)
其中,function
为函数,iterable
为可迭代对象。例如,我们可以使用map
函数将列表中的数值转换为字符串:
list1 = [1, 2, 3, 4, 5]
result = map(str, list1)
print(list(result))
执行结果为:
['1', '2', '3', '4', '5']
可以看到,map
函数将list1
中的每个元素都转换成了字符串并返回了一个新的列表。
3.2 filter函数
filter
函数用于在可迭代对象中筛选元素,返回一个新的列表。
filter
函数的定义格式如下:
filter(function, iterable)
其中,function
为函数,iterable
为可迭代对象。例如,我们可以使用filter
函数筛选列表中大于3的元素:
list1 = [1, 2, 3, 4, 5]
result = filter(lambda x: x > 3, list1)
print(list(result))
执行结果为:
[4, 5]
可以看到,filter
函数筛选出list1
中的大于3的元素并返回了一个新的列表。
3.3 reduce函数
reduce
函数用于对可迭代对象中的元素执行连续的操作,返回一个单一的值。
reduce
函数的定义格式如下:
reduce(function, iterable[, initializer])
其中,function
为函数,iterable
为可迭代对象。initializer
为可选的初始值,如果指定了初始值,则reduce
函数从初始值开始执行操作。例如,我们可以使用reduce
函数计算1到5的累加和:
from functools import reduce
list1 = [1, 2, 3, 4, 5]
result = reduce(lambda x, y: x + y, list1)
print(result)
执行结果为:
15
可以看到,reduce
函数将list1
中的元素累加起来并返回了一个单一的值。
4. Python中的递归函数
递归函数是指调用自身的函数。在Python中,递归函数需要注意控制递归深度,避免出现无限递归的情况。
例如,下面是一个计算阶乘的递归函数:
def factorial(n):
'''计算n的阶乘'''
if n == 0:
return 1
else:
return n * factorial(n - 1)
result = factorial(5)
print(result)
执行结果为:
120
可以看到,factorial
函数调用自身来计算阶乘,但需要注意控制递归深度。
5. Python中的装饰器函数
装饰器函数是指用于修饰其他函数的函数。在Python中,装饰器函数可以在不修改被修饰函数的代码的情况下,增加被修饰函数的功能。
例如,下面是一个计算函数运行时间的装饰器函数:
import time
def time_it(func):
def wrapper(*args, **kwargs):
start = time.time()
result = func(*args, **kwargs)
end = time.time()
print('{} costs {} s'.format(func.__name__, end - start))
return result
return wrapper
@time_it
def func():
time.sleep(1)
return 'hello world'
result = func()
print(result)
执行结果为:
func costs 1.002760887145996 s
hello world
可以看到,我们使用time_it
装饰器函数修饰了func
函数,从而在func
执行完毕后打印出了其运行时间。
在定义装饰器函数时,我们不能直接修改原函数的定义,而是通过返回一个新的函数来实现功能增强。
6. Python中的生成器函数
生成器函数是指可以使用yield
语句来生成一系列值的函数。生成器函数可以在需要时生成值,节省空间和时间。
例如,下面是一个简单的生成斐波那契数列的生成器函数:
def fibonacci(n):
'''生成斐波那契数列'''
a, b = 0, 1
for i in range(n):
yield b
a, b = b, a + b
for i in fibonacci(10):
print(i)
执行结果为:
1
1
2
3
5
8
13
21
34
55
可以看到,fibonacci
函数使用yield
语句生成斐波那契数列中的每个值,并在需要时生成这些值。
7. 总结
Python函数是编写Python程序的重要组成部分,掌握Python函数的使用可以提高代码的复用性和可维护性。文章介绍了Python函数的定义、调用和参数、Python的lambda函数、高阶函数、递归函数、装饰器函数和生成器函数。希望本文能对大家了解Python函数有所帮助。