函数
什么是 Python 函数
在 Python 中,函数是一段可重复使用的代码块,用于执行特定任务或完成特定操作。函数可以接受输入参数,并且可以返回具体值、或者不返回任何值作为结果。
通过使用函数,可以将代码分解成小块,每个块都完成一个特定的任务。这使得代码更易于理解、测试和维护。同时,函数也可以在不同的上下文中重复使用,提高代码的重用性和可维护性。
几种函数类型
- 内置函数:Python 解释器提供的函数,例如
print()
、len()
、range()
等。 - 自定义函数:由用户定义的函数。
- Lambda 函数:也称为匿名函数,是一种简单的函数形式,可以通过 lambda 关键字定义。
- 生成器函数:是一种特殊的函数,用于生成一个迭代器,可以使用 yield 关键字定义。本章不展开介绍生成器函数。
- 方法:是与对象相关联的函数,可以使用"."符号调用。例如字符串类型的方法,可以使用字符串变量名.方法名()的形式调用。大家会在 Pandas 中经常看到这种用法。
包、模块、函数
在 Python 中,一个包 (package) 是一组相关模块 (module) 的集合,一个模块是包含 Python 定义和语句的文件。而一个函数则是在模块或者在包中定义的可重用代码块,用于执行特定任务或计算特定值。
通常情况下,一个模块通常是一个.py 文件,包含了多个函数和类等定义。一个包则是一个包含了多个模块的目录,通常还包括一个特殊的 __init__.py
文件,用于初始化该包。在使用时,需要使用 import
关键字导入模块或者包,从而可以使用其中定义的函数和类等。而函数则是模块或包中定义的一段可重用的代码块,用于完成特定的功能。
因此,包中可以包含多个模块,模块中可以包含多个函数,而函数是模块和包中的可重用代码块。
自定义函数
无输入、无返回
在 Python 中,我们可以自定义函数来完成一些特定的任务。函数通常接受输入参数并返回输出结果。但有时我们需要定义一个函数,它既没有输入参数,也不返回任何结果。这种函数被称为没有输入、没有返回值的函数。
定义这种函数的方法和定义其他函数类似,只是在定义函数时省略了输入参数和 return
语句。比如下例,这个函数名为 say_hello,它不接受任何输入参数,执行函数体中的代码时会输出字符串 "Hello!"
。
def say_hello():
# 自定义函数:打印问候
# 输入:无
# 输出:无
print("Hello!")
# 调用自定义函数
say_hello()
多个输入、单一返回
一个函数可以有多个输入参数,一个或多个返回值。下面是一个示例函数,它有两个输入参数 a 和 b,返回它们的和。
def add_numbers(a, b):
return a + b
sum = add_numbers(3, 5) # 调用函数
print(sum) # 输出 8
下面这个例子中,我们定义了一个名为 arithmetic_operations()
的函数,它有两个参数 a 和 b。在函数体内,我们进行了四个基本的算术运算,并将其结果存储在四个变量中。最后,我们使用 return 语句返回这四个变量。当我们调用这个函数时,我们将 a 和 b 的值作为参数传递给函数,函数将返回四个值。我们将这四个返回值存储在一个元组 result 中,并使用索引访问和打印这四个值。
# 自定义函数
def arithmetic_operations(a, b):
add = a + b
sub = a - b
mul = a * b
div = a / b
return add, sub, mul, div
# 调用函数并输出结果
a, b = 10, 5
result = arithmetic_operations(a, b)
print("Addition: ", result[0])
print("Subtraction: ", result[1])
print("Multiplication: ", result[2])
print("Division: ", result[3])
部分输入有默认值
在 Python 中,我们可以为自定义函数中的某些参数设置默认值,这样在调用函数时,如果不指定这些参数的值,就会使用默认值。这种设置默认值的参数称为默认参数。
下面是一个例子,展示如何在自定义函数中设置默认参数。greet()函数有两个参数:name 和 greeting。name 是必需的参数,没有默认值。而 greeting 是可选的,默认值为'Hello'。
当我们调用 greet()函数时,如果只传入了 name 参数,那么 greeting 就会使用默认值'Hello'。如果需要自定义问候语,可以在调用时传入自定义的值,如上面的第二个调用例子所示。
# 自定义函数
def greet(name, greeting='Hello'):
print(f"{greeting}, {name}!")
# 使用默认的问候语调用函数
greet('James') # 输出 "Hello, James!"
# 指定自定义的问候语调用函数
greet('James', 'Good morning')
# 输出 "Good morning, James!"
注意
默认参数必须放在非默认参数的后面。在函数定义中,先定义的参数必须先被传入,后定义的参数后被传入。如果违反了这个顺序,Python 解释器就会抛出 SyntaxError
异常。
帮助文档
在 Python 中,可以使用 docstring 来编写函数的帮助文档,即在函数定义的第一行或第二行写入字符串来描述函数的作用、参数、返回值等信息。通常使用三个单引号(''')或三个双引号(""")来表示 docstring,如下所示。如果要查询这个文档,可以使用 Python 内置的 help()
函数或者 __doc__
属性来查看。
def add_numbers(a, b):
'''
自定义函数计算两个变量的和
输入:
a:数字,类型为 number
b:数字,类型为 number
输出:
a 和 b 的和,类型 number
'''
return a + b
# 查询自定义函数文档,两种办法
help(add_numbers)
print(add_numbers.__doc__)
sum = add_numbers(3, 5) # 调用函数
print(sum) # 输出 8
匿名函数
在 Python 中,匿名函数也被称为 lambda 函数,是一种快速定义单行函数的方式。使用 lambda 函数可以避免为简单的操作编写大量的代码,而且可以作为其他函数的参数来使用。
匿名函数的语法格式为:lambda arguments: expression
。其中,arguments 是参数列表,expression 是一个表达式。当匿名函数被调用时,它将返回 expression 的结果。
下面是一些使用匿名函数的例子:
my_list = [1, 2, 3, 4, 5] lambda函数
# 将列表中的所有元素加 1
list_plus_1 = list(map(lambda x: x+1, my_list))
print(list_plus_1)
# [2, 3, 4, 5, 6]
# 将列表中的所有元素分别求平方
list_squared = list(map(lambda x: x**2, my_list))
print(list_squared)
# [1, 4, 9, 16, 25]
在这个例子中,我们定义了一个匿名函数 lambda x: x + 1
,该函数接受一个参数 x 并返回 x 加 1。然后我们使用 map()
将这个函数应用于列表 my_list 中的每个元素,并将结果存储在 list_plus_1 列表中。类似地,我们还计算了 my_list 中的每个元素的平方。
提示
在 Python 中,map()
是一种内置的高阶函数,它接受一个函数和一个可迭代对象作为输入,将函数应用于可迭代对象的每个元素并返回一个可迭代对象,其中每个元素都是应用于原始可迭代对象的函数的结果。
构造模块、库
自定义模块
在 Python 中,我们可以将几个相关的函数放在一个文件中,这个文件就成为一个模块。下面是一个例子。假设我们有两个函数,一个是计算圆的面积,一个是计算圆的周长,我们可以将这两个函数放在一个文件中,例如我们可以创建一个名为 "circle.py" 的文件,并将以下代码添加到该文件中。我们首先导入了 math 模块,然后定义了两个函数 area()和 circumference(),分别用于计算圆的面积和周长。
import math
def area(radius):
return math.pi * radius**2
def circumference(radius):
return 2 * math.pi * radius
# 将其存为文件circle.py
我们可以使用 import 语句导入 circle 模块,并命名为 cc,然后通过 cc.area()
、cc.circumference()
调用函数。
自定义库
在 Python 中,可以使用 setuptools
库中的 setup()
函数将多个模块打包成一个库。具体步骤如下:
创建一个文件夹,用于存放库的代码文件,例如命名为 mylibrary。
在 mylibrary 文件夹中创建一个名为 setup.py 的文件,引入 setuptools 库,并使用 setup()
函数来描述库的信息,包括名称、版本、作者、依赖、模块文件等信息。
在 mylibrary 文件夹中创建一个名为 __init__.py
的空文件 (内容空白),用于声明这个文件夹是一个 Python 包。
在 mylibrary 文件夹中创建多个模块文件,这些模块文件包含需要打包的函数或类。比如,mylibrary 中含有 linear_alg.py 和 circle.py 两个模块。linear_alg.py 有矩阵乘法、向量内积两个函数。circle.py 有计算圆面积、周长两个函数。