Python 函数与模块

PythonBeginner
立即练习

介绍

在本实验中,你将探索 Python 编程中的两个基本概念:函数和模块。函数允许你将代码组织成可重用的代码块,使你的程序更加模块化且易于理解。模块则让你能够将相关的函数和变量组织到独立的文件中,从而提高代码的可重用性和可维护性。通过掌握这些概念,你将能够编写出更高效、更有条理的 Python 代码。

定义和使用函数

在这一步中,你将学习如何在 Python 中定义和使用函数。

在终端中输入以下命令打开 Python 解释器:

python

你应该会看到 Python 提示符(>>>),这表明你现在处于 Python 交互式外壳中。

Python 解释器

让我们从定义一个简单的问候函数开始。在 Python 解释器中输入以下内容:

def greet(name):
    return f"Hello, {name}!"

result = greet("Alice")
print(result)

你应该会看到以下输出:

Hello, Alice!

函数使用 def 关键字定义,后跟函数名和括号内的参数。函数体需要缩进。
这个函数接收一个 name 参数并返回一个问候字符串。然后我们使用参数「Alice」调用该函数并打印结果。
return 语句用于从函数中返回一个值。如果没有 return 语句,函数将返回 None
函数可用于封装可重用的代码并执行特定任务。它是 Python 程序的主要构建块。

现在,让我们创建一个执行计算的函数:

def calculate_area(length, width):
    return length * width

area = calculate_area(5, 3)
print(f"The area is: {area}")

你应该会看到以下输出:

The area is: 15

这个函数根据给定的长度和宽度计算矩形的面积。

函数还可以拥有默认参数值:

def power(base, exponent=2):
    return base ** exponent

print(power(3))
print(power(3, 3))

你应该会看到以下输出:

9
27

在这里,如果没有提供指数(exponent),函数将使用 2 作为默认值。

函数可以使用元组(tuples)返回多个值:

def min_max(numbers):
    return min(numbers), max(numbers)

minimum, maximum = min_max([1, 5, 3, 9, 2])
print(f"Minimum: {minimum}, Maximum: {maximum}")

你应该会看到以下输出:

Minimum: 1, Maximum: 9

这个函数从数字列表中同时返回最小值和最大值。

请记住,缩进在 Python 中至关重要。函数体必须保持一致的缩进。

理解函数作用域

在这一步中,你将学习函数作用域以及变量在函数内部和外部的行为方式。

在 Python 解释器中,让我们探索局部变量和全局变量:

x = 10  ## 全局变量

def print_x():
    print(f"Global x: {x}")

print_x()

def change_x():
    x = 20  ## 局部变量
    print(f"Local x: {x}")

change_x()
print(f"Global x after change_x(): {x}")

你应该会看到以下输出:

Global x: 10
Local x: 20
Global x after change_x(): 10

请注意,change_x() 函数创建了一个新的局部变量 x,它不会影响全局变量 x

要在函数内部修改全局变量,请使用 global 关键字:

def modify_global_x():
    global x
    x = 30
    print(f"Modified global x: {x}")

modify_global_x()
print(f"Global x after modify_global_x(): {x}")

你应该会看到以下输出:

Modified global x: 30
Global x after modify_global_x(): 30

现在全局变量 x 已经被修改了。

函数还可以访问其外部嵌套作用域中的变量:

def outer_function(x):
    def inner_function():
        print(f"x from outer function: {x}")
    inner_function()

outer_function(40)

你应该会看到以下输出:

x from outer function: 40

内部函数可以访问外部函数的 x 参数。

理解函数作用域对于编写整洁且无错误的代码至关重要。它有助于防止意外的副作用,并使你的函数更加可预测。

创建和使用模块

在这一步中,你将学习如何创建和使用 Python 模块。

通过输入 exit() 或按 Ctrl+D 退出 Python 解释器。

在 LabEx 虚拟机环境中打开 WebIDE。

WebIDE LabEx 虚拟机界面

~/project 目录下创建一个名为 math_operations.py 的新文件:

touch ~/project/math_operations.py

在 WebIDE 编辑器中打开新创建的文件,并添加以下内容:

## math_operations.py

def add(a, b):
      return a + b

def subtract(a, b):
      return a - b

def multiply(a, b):
      return a * b

def divide(a, b):
      if b != 0:
         return a / b
      else:
         return "Error: Division by zero"

PI = 3.14159

该模块包含四个基本的数学运算和一个常量 PI

保存文件(WebIDE 已启用自动保存)。

现在,在同一目录下创建另一个名为 use_math_module.py 的文件:

touch ~/project/use_math_module.py

在 WebIDE 编辑器中打开 use_math_module.py 并添加以下内容:

## use_math_module.py

import math_operations

result_add = math_operations.add(5, 3)
result_subtract = math_operations.subtract(10, 4)
result_multiply = math_operations.multiply(2, 6)
result_divide = math_operations.divide(15, 3)

print(f"Addition: {result_add}")
print(f"Subtraction: {result_subtract}")
print(f"Multiplication: {result_multiply}")
print(f"Division: {result_divide}")
print(f"Value of PI: {math_operations.PI}")

该脚本导入了 math_operations 模块,并使用了其中的函数和常量。

保存文件并在终端中使用以下命令运行它:

python ~/project/use_math_module.py

你应该会看到类似这样的输出:

Addition: 8
Subtraction: 6
Multiplication: 12
Division: 5.0
Value of PI: 3.14159

通过创建模块,你可以将相关的函数和变量组织到独立的文件中,使你的代码更具可维护性和可重用性。

当你导入一个模块时,Python 会将其编译为字节码并将编译后的代码存储在 __pycache__ 目录中。该目录创建在模块文件所在的同一位置,包含编译后的字节码文件(.pyc.pyo)。

你可以放心地忽略这个目录,因为 Python 会自动处理模块的编译和缓存。

从模块中导入特定函数

在这一步中,你将学习如何从模块中导入特定的函数,并使用别名使你的代码更加简洁。

~/project 目录下创建一个名为 advanced_math.py 的新文件:

touch ~/project/advanced_math.py

在 WebIDE 编辑器中打开 advanced_math.py 并添加以下内容:

## advanced_math.py

import math

def square_root(x):
      return math.sqrt(x)

def power(base, exponent):
      return math.pow(base, exponent)

def sin(angle):
      return math.sin(math.radians(angle))

def cos(angle):
      return math.cos(math.radians(angle))

该模块使用了 Python 内置的 math 模块来提供更高级的数学运算。

现在,在同一目录下创建一个名为 use_advanced_math.py 的文件:

touch ~/project/use_advanced_math.py

在 WebIDE 编辑器中打开 use_advanced_math.py 并添加以下内容:

## use_advanced_math.py

from advanced_math import square_root, power
from advanced_math import sin as sine, cos as cosine

x = 16
y = 2
angle = 30

print(f"Square root of {x}: {square_root(x)}")
print(f"{x} to the power of {y}: {power(x, y)}")
print(f"Sine of {angle} degrees: {sine(angle)}")
print(f"Cosine of {angle} degrees: {cosine(angle)}")

该脚本从 advanced_math 模块中导入了特定的函数,并为 sincos 使用了别名。

保存文件并在终端中使用以下命令运行它:

python ~/project/use_advanced_math.py

你应该会看到类似这样的输出:

Square root of 16: 4.0
16 to the power of 2: 256.0
Sine of 30 degrees: 0.49999999999999994
Cosine of 30 degrees: 0.8660254037844387

通过导入特定函数并使用别名,你可以提高代码的可读性,并避免不同模块之间的命名冲突。

创建包

在最后一步中,你将学习如何创建一个包(Package),这是一种将相关模块组织到目录层级结构中的方法。

~/project 目录下创建一个名为 geometry 的新目录:

mkdir ~/project/geometry

geometry 目录内部,创建两个文件:__init__.pyshapes.py

touch ~/project/geometry/__init__.py
touch ~/project/geometry/shapes.py

__init__.py 文件是必需的,它使 Python 将该目录视为一个包。它可以是空的,也可以包含包的初始化代码。

在 WebIDE 编辑器中打开 shapes.py 并添加以下内容:

## geometry/shapes.py

import math

def circle_area(radius):
      return math.pi * radius ** 2

def rectangle_area(length, width):
      return length * width

def triangle_area(base, height):
      return 0.5 * base * height

现在,在 ~/project 目录下创建一个名为 use_geometry_package.py 的文件:

touch ~/project/use_geometry_package.py

在 WebIDE 编辑器中打开 use_geometry_package.py 并添加以下内容:

## use_geometry_package.py

from geometry.shapes import circle_area, rectangle_area, triangle_area

radius = 5
length = 4
width = 6
base = 3
height = 8

print(f"Area of circle with radius {radius}: {circle_area(radius):.2f}")
print(f"Area of rectangle with length {length} and width {width}: {rectangle_area(length, width)}")
print(f"Area of triangle with base {base} and height {height}: {triangle_area(base, height)}")

保存文件并在终端中使用以下命令运行它:

python ~/project/use_geometry_package.py

你应该会看到类似这样的输出:

Area of circle with radius 5: 78.54
Area of rectangle with length 4 and width 6: 24
Area of triangle with base 3 and height 8: 12.0

通过创建包,你已经将相关的模块组织到了目录层级结构中,这使得在项目中管理和导入相关功能变得更加容易。

总结

在本实验中,你探索了 Python 编程中的两个基本概念:函数和模块。你学习了如何定义和使用函数、理解函数作用域、创建和使用模块、从模块中导入特定函数,以及如何将相关的模块组织成包。

你从创建简单的函数开始,逐渐过渡到更复杂的概念,如函数作用域和全局变量。接着,你学习了如何创建模块以将相关的函数和变量组织到独立的文件中,从而使代码更具可维护性和可重用性。

你探索了从模块导入函数的不同方式,包括导入特定函数和使用别名。这些知识让你能够编写出更简洁、更具可读性的代码,同时避免不同模块之间的命名冲突。

最后,你学习了如何创建包,这是一种将相关模块组织到目录层级结构中的方法。这对于需要管理多个相关模块的大型项目特别有用。

函数和模块的概念对于编写组织良好、高效且可重用的 Python 代码至关重要。随着你继续 Python 学习之旅,你会发现这些技能对于构建更复杂的程序和在大型项目中协作是必不可少的。请记得定期练习这些概念,并探索 Python 丰富的模块和包生态系统,以增强你的编程能力。