跳至主要內容

函数

Akkiri...大约 8 分钟数据分析机器学习PythonPython

什么是 Python 函数

在 Python 中,函数是一段可重复使用的代码块,用于执行特定任务或完成特定操作。函数可以接受输入参数,并且可以返回具体值、或者不返回任何值作为结果。

通过使用函数,可以将代码分解成小块,每个块都完成一个特定的任务。这使得代码更易于理解、测试和维护。同时,函数也可以在不同的上下文中重复使用,提高代码的重用性和可维护性。

几种函数类型

  • 内置函数:Python 解释器提供的函数,例如 print()len()range()等。
  • 自定义函数:由用户定义的函数。
  • Lambda 函数:也称为匿名函数,是一种简单的函数形式,可以通过 lambda 关键字定义。
  • 生成器函数:是一种特殊的函数,用于生成一个迭代器,可以使用 yield 关键字定义。本章不展开介绍生成器函数。
  • 方法:是与对象相关联的函数,可以使用"."符号调用。例如字符串类型的方法,可以使用字符串变量名.方法名()的形式调用。大家会在 Pandas 中经常看到这种用法。

包、模块、函数

在 Python 中,一个包 (package) 是一组相关模块 (module) 的集合,一个模块是包含 Python 定义和语句的文件。而一个函数则是在模块或者在包中定义的可重用代码块,用于执行特定任务或计算特定值。

通常情况下,一个模块通常是一个.pyopen in new window 文件,包含了多个函数和类等定义。一个包则是一个包含了多个模块的目录,通常还包括一个特殊的 __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.pyopen in new window" 的文件,并将以下代码添加到该文件中。我们首先导入了 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.pyopen in new window 的文件,引入 setuptools 库,并使用 setup() 函数来描述库的信息,包括名称、版本、作者、依赖、模块文件等信息。

在 mylibrary 文件夹中创建一个名为 __init__.py 的空文件 (内容空白),用于声明这个文件夹是一个 Python 包。

在 mylibrary 文件夹中创建多个模块文件,这些模块文件包含需要打包的函数或类。比如,mylibrary 中含有 linear_alg.py 和 circle.pyopen in new window 两个模块。linear_alg.py 有矩阵乘法、向量内积两个函数。circle.pyopen in new window 有计算圆面积、周长两个函数。

评论
  • 按正序
  • 按倒序
  • 按热度
Powered by Waline v2.15.5