当前位置: 首页 > news >正文

《Python 实用项目与工具制作指南》· 2.3 导入

2.3 导入

在 Python 编程中,“导入” 就像是打开一个装满工具的抽屉 —— 当我们需要实现特定功能时,不必从零开始编写代码,只需导入相应的模块(包含预设功能的代码集合),就能直接使用其中的工具。比如制作 “题目数据生成器” 时,需要随机生成数字,这就可以借助 Python 自带的random模块;开发 “密码管理器” 时,加密功能可通过cryptography模块实现。本节将带你学习如何导入模块,以及如何利用这些 “现成工具” 提升开发效率。

一、什么是模块?为什么需要导入?

模块是包含 Python 代码的文件(扩展名为.py),里面定义了函数、类、变量等,用于实现特定功能。Python 的强大之处在于拥有丰富的标准库(内置模块)和第三方模块,这些模块就像预制的 “零件”,能帮我们快速搭建程序。

例如,若想生成随机数,手动编写随机算法既复杂又容易出错,而导入random模块后,直接调用random.randint()函数就能轻松实现:

# 导入random模块

import random

# 使用模块中的函数生成1-10之间的随机数

random_num = random.randint(1, 10)

print(f"随机数:{random_num}")

这里的random就是 Python 的标准库模块,通过import语句导入后,我们就能使用它的功能,避免重复造轮子。

二、导入模块的基本语法

Python 提供了多种导入模块的方式,可根据需求选择:

1. 导入整个模块:import 模块名

这是最基础的导入方式,导入后需通过 “模块名.功能名” 的形式使用模块中的功能。例如:

import math # 导入数学运算模块

# 计算平方根(使用math模块的sqrt函数)

result = math.sqrt(16)

print(f"16的平方根是:{result}") # 输出:16的平方根是:4.0

2. 导入模块中的特定功能:from 模块名 import 功能名

若只需使用模块中的某个功能,可直接导入该功能,使用时无需加模块名前缀。例如:

from random import randint # 仅导入random模块的randint函数

# 直接使用randint,无需加random.前缀

num = randint(1, 5) # 生成1-5的随机整数

print(num)

3. 给模块或功能起别名:as关键字

当模块名或功能名较长时,可用as起别名,简化代码。例如:

import datetime as dt # 给datetime模块起别名dt

from random import choice as ch # 给choice函数起别名ch

# 使用别名调用

current_time = dt.datetime.now() # 获取当前时间

print(f"当前时间:{current_time}")

# 从列表中随机选择一个元素

fruits = ["苹果", "香蕉", "橙子"]

selected = ch(fruits)

print(f"随机选中的水果:{selected}")

4. 导入模块中的所有功能:from 模块名 import *

这种方式会导入模块中所有公开的功能,但不推荐使用 —— 可能导致功能名冲突(不同模块的功能重名时,后导入的会覆盖先导入的),且难以区分功能来自哪个模块。例如:

from math import * # 不推荐:导入math模块的所有功能

print(sin(0)) # 可直接使用sin函数(计算正弦值)

三、常用标准库模块及项目应用

Python 标准库包含大量实用模块,无需额外安装即可使用,以下是本书项目中会频繁用到的模块:

1. random:随机数相关功能

在 “题目数据生成器” 中,用于随机生成题目中的数字、运算符等:

import random

# 生成10-20之间的随机整数(用于口算题)

a = random.randint(10, 20)

b = random.randint(10, 20)

# 随机选择加法或减法

operator = random.choice(["+", "-"])

print(f"题目:{a} {operator} {b} = ?")

2. os:与操作系统交互

在 “密码管理器” 中,用于创建存储密码的文件夹、检查文件是否存在:

import os

# 创建名为"passwords"的文件夹(若不存在)

if not os.path.exists("passwords"):

os.makedirs("passwords")

print("密码存储文件夹创建成功")

3. datetime:处理日期和时间

在 “活动管理系统” 中,用于记录活动时间、判断活动是否过期:

from datetime import datetime

# 活动开始时间(字符串转日期对象)

activity_start = datetime.strptime("2023-10-01 09:00", "%Y-%m-%d %H:%M")

# 当前时间

now = datetime.now()

# 判断活动是否已开始

if now > activity_start:

print("活动已开始")

else:

print("活动尚未开始")

4. json:处理 JSON 数据

用于存储和读取结构化数据(如 “活动管理系统” 的报名信息):

import json

# 活动报名信息(字典类型)

sign_up_info = {

"name": "张三",

"phone": "13800138000",

"participate": True

}

# 将信息写入JSON文件

with open("sign_up.json", "w", encoding="utf-8") as f:

json.dump(sign_up_info, f, ensure_ascii=False, indent=2)

print("报名信息已保存")

四、导入第三方模块

除了标准库,Python 还有海量第三方模块(由开发者社区贡献),需通过pip安装后才能导入。例如 “密码管理器” 中用于加密的cryptography模块:

1. 安装第三方模块

打开终端,输入以下命令安装:

pip install cryptography # Windows系统

# 或

pip3 install cryptography # macOS/Linux系统

2. 导入并使用

安装完成后,即可像标准库模块一样导入:

from cryptography.fernet import Fernet

# 生成加密密钥

key = Fernet.generate_key()

cipher_suite = Fernet(key)

# 加密密码(将字符串转为字节后加密)

password = "mypassword123".encode()

encrypted_password = cipher_suite.encrypt(password)

print(f"加密后的密码:{encrypted_password}")

五、常见问题解决
  1. 模块不存在报错(ModuleNotFoundError
  • 若为标准库模块:检查模块名是否拼写错误(如randon应为random)。
  • 若为第三方模块:确保已用pip安装,且安装时使用的 Python 环境与当前运行环境一致。

     2. 功能名冲突:不同模块的功能重名时,后导入的会覆盖先导入的。解决方法:使用 “模块名.功能名” 的方式调用,或起别名区分。例如:

from math import floor

from random import floor # 这里会覆盖math的floor函数

# 正确做法:指定模块名

import math

import random

print(math.floor(3.7)) # 使用math的floor(向下取整)

print(random.floor(3.7)) # 错误:random模块没有floor功能,避免混淆

      3. 导入语句的位置:建议将所有导入语句放在代码开头,方便查看程序依赖的模块。 

导入模块是 Python 编程的核心技能之一,它让我们能站在 “巨人的肩膀” 上开发 —— 借助成熟的模块,无需重复编写基础功能,专注于实现项目的核心逻辑。下一节,我们将学习条件判断,让程序能根据不同情况做出不同反应(比如 “题目数据生成器” 根据难度生成不同范围的数字)。现在,试着导入random模块,编写一段代码随机生成 3 道 10 以内的加法题吧!

http://www.xdnf.cn/news/1243063.html

相关文章:

  • Bean的生命周期和循环依赖问题的解决
  • curl发送文件bodyParser无法获取请求体的问题分析
  • 嵌入式硬件中三极管推挽电路控制与实现
  • PPT自动化 python-pptx - 11 : 备注页 (Notes Slides)
  • (论文速读)Text-IF:基于语义文本引导的退化感知交互式图像融合方法
  • sqli-labs-master/Less-31~Less-40
  • openeuler离线安装软件
  • Hexo - 免费搭建个人博客07 - 添加右上角的“目录”
  • 先知模型或者说从容的模型
  • Linux—yum仓库及NFS网络共享服务
  • Java基础-斗地主游戏
  • opencv引入libavif
  • 从 0 到 1 开发图书管理系统:飞算 JavaAI 让技术落地更简单
  • Prometheus-3--Prometheus是怎么抓取Java应用,Redis中间件,服务器环境的指标的?
  • 【慕伏白】Android Studio 配置国内镜像源
  • 内联函数:提升效率的空间换时间艺术
  • FreeRTOS源码分析四:时钟中断处理响应流程
  • 深入浅出 RabbitMQ:工作队列实战(轮训策略VS公平策略)
  • 鸿蒙南向开发 编写一个简单子系统
  • 机器学习 入门——决策树分类
  • 并发编程常用工具类(下):CyclicBarrier 与 Phaser 的协同应用
  • C++入门自学Day6-- C++模版
  • 飞算JavaAI需求转SpringBoot项目沉浸式体验
  • 【BUUCTF系列】[极客大挑战 2019]LoveSQL 1
  • vllm启动Qwen/Qwen3-Coder-30B-A3B-Instruct并支持工具调用
  • MLIR Introduction
  • android内存作假通杀补丁(4GB作假8GB)
  • History 模式 vs Hash 模式:Vue Router 技术决策因素详解
  • ZYNQ-按键消抖
  • JavaScript 中的流程控制语句详解