跳到主要内容

第12章:标准库与生态

作为 Java 开发者,你已经熟悉了 Java 的标准库和生态系统。Python 也有丰富的标准库和强大的生态系统,本章将详细对比两种语言的标准库与生态。

12.1 标准库对比

Java 标准库

  • 核心包java.lang, java.util, java.io, java.net
  • 集合框架java.util.*
  • IO 操作java.io.*, java.nio.*
  • 网络编程java.net.*
  • 并发编程java.util.concurrent.*
  • 日期时间java.time.*
  • XML 处理javax.xml.*
  • 数据库访问java.sql.*

Python 标准库

  • 操作系统接口os, sys, subprocess
  • 文件处理os.path, shutil
  • 数据结构collections, heapq, bisect
  • 日期时间datetime, time, calendar
  • 数学运算math, random, statistics
  • 文本处理re, string
  • 网络编程socket, urllib, http
  • 并发编程threading, multiprocessing, asyncio
  • 数据序列化json, pickle, yaml (需要安装)
  • 数据库访问sqlite3
  • GUI 编程tkinter

对比

功能领域Java 标准库Python 标准库
集合操作java.utilcollections
文件处理java.ioos, os.path
网络编程java.netsocket, urllib
并发编程java.util.concurrentthreading, multiprocessing
日期时间java.timedatetime
数学运算java.mathmath, random
文本处理java.util.regexre
数据序列化java.io.ObjectOutputStreamjson, pickle
数据库访问java.sqlsqlite3

12.2 常用标准库示例

文件与目录操作

Java

import java.io.File;

// 创建目录
File dir = new File("new_dir");
dir.mkdir();

// 列出文件
File[] files = dir.listFiles();
for (File file : files) {
if (file.isFile()) {
System.out.println("File: " + file.getName());
}
}

Python

import os

# 创建目录
os.makedirs("new_dir", exist_ok=True)

# 列出文件
for item in os.listdir("new_dir"):
item_path = os.path.join("new_dir", item)
if os.path.isfile(item_path):
print(f"File: {item}")

网络编程

Java

import java.net.URL;
import java.io.BufferedReader;
import java.io.InputStreamReader;

URL url = new URL("https://api.github.com");
BufferedReader reader = new BufferedReader(
new InputStreamReader(url.openStream())
);
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
reader.close();

Python

import urllib.request

with urllib.request.urlopen("https://api.github.com") as response:
content = response.read().decode('utf-8')
print(content)

# 更简单的方式(使用第三方库 requests)
# import requests
# response = requests.get("https://api.github.com")
# print(response.text)

日期时间处理

Java

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

LocalDateTime now = LocalDateTime.now();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String formatted = now.format(formatter);
System.out.println(formatted);

Python

from datetime import datetime

now = datetime.now()
formatted = now.strftime("%Y-%m-%d %H:%M:%S")
print(formatted)

数据序列化

Java

import java.io.ObjectOutputStream;
import java.io.FileOutputStream;
import java.io.Serializable;

class Person implements Serializable {
private String name;
private int age;
// 构造方法、getter、setter
}

Person person = new Person("Alice", 25);
try (ObjectOutputStream oos = new ObjectOutputStream(
new FileOutputStream("person.ser"))
) {
oos.writeObject(person);
}

Python

import json

person = {"name": "Alice", "age": 25}

# JSON 序列化
with open("person.json", "w") as f:
json.dump(person, f, indent=2)

# JSON 反序列化
with open("person.json", "r") as f:
loaded_person = json.load(f)
print(loaded_person)

12.3 第三方生态系统

Java 第三方生态

  • 构建工具:Maven, Gradle
  • 依赖管理:Maven Central, JCenter
  • Web 框架:Spring Boot, Jakarta EE
  • ORM 框架:Hibernate, JPA
  • 测试框架:JUnit, TestNG
  • 日志框架:Log4j, SLF4J
  • 工具库:Apache Commons, Google Guava

Python 第三方生态

  • 包管理:pip, Poetry
  • 依赖仓库:PyPI (Python Package Index)
  • Web 框架:Django, Flask, FastAPI
  • 数据科学:NumPy, Pandas, Matplotlib, Scikit-learn
  • 机器学习:TensorFlow, PyTorch
  • 测试框架:pytest, unittest
  • 日志框架:logging (标准库), loguru
  • 工具库:requests, beautifulsoup4, Pillow

对比

领域Java 生态Python 生态
Web 开发Spring Boot, Jakarta EEDjango, Flask, FastAPI
数据科学相对较弱非常强大(NumPy, Pandas)
机器学习DeepLearning4jTensorFlow, PyTorch
测试JUnit, TestNGpytest, unittest
包管理Maven, Gradlepip, Poetry
依赖仓库Maven CentralPyPI

12.4 常用第三方库

Web 开发

Java

  • Spring Boot:快速构建 Java 应用
  • Jakarta EE:企业级 Java 平台
  • Play Framework:轻量级 Web 框架

Python

  • Django:全功能 Web 框架
  • Flask:轻量级 Web 框架
  • FastAPI:现代、快速的 Web 框架
  • Tornado:异步 Web 框架

示例(FastAPI)

from fastapi import FastAPI

app = FastAPI()

@app.get("/")
def read_root():
return {"Hello": "World"}

@app.get("/items/{item_id}")
def read_item(item_id: int, q: str = None):
return {"item_id": item_id, "q": q}

# 运行:uvicorn main:app --reload

数据科学

Java

  • Apache Spark:大数据处理
  • Weka:机器学习

Python

  • NumPy:数值计算
  • Pandas:数据分析
  • Matplotlib:数据可视化
  • Scikit-learn:机器学习

示例(Pandas)

import pandas as pd

# 读取 CSV 文件
df = pd.read_csv("data.csv")

# 基本统计
print(df.describe())

# 数据筛选
filtered = df[df["age"] > 30]

# 数据分组
grouped = df.groupby("gender").mean()

# 保存结果
grouped.to_csv("result.csv")

数据库访问

Java

  • JDBC:Java 数据库连接
  • Hibernate:ORM 框架
  • MyBatis:SQL 映射框架

Python

  • SQLAlchemy:ORM 框架
  • psycopg2:PostgreSQL 驱动
  • pymysql:MySQL 驱动
  • sqlite3:SQLite 驱动(标准库)

示例(SQLAlchemy)

from sqlalchemy import create_engine, Column, Integer, String, ForeignKey
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker, relationship

Base = declarative_base()

class User(Base):
__tablename__ = "users"
id = Column(Integer, primary_key=True)
name = Column(String)
posts = relationship("Post", back_populates="user")

class Post(Base):
__tablename__ = "posts"
id = Column(Integer, primary_key=True)
title = Column(String)
user_id = Column(Integer, ForeignKey("users.id"))
user = relationship("User", back_populates="posts")

# 创建数据库引擎
engine = create_engine("sqlite:///example.db")
Base.metadata.create_all(engine)

# 创建会话
Session = sessionmaker(bind=engine)
session = Session()

# 添加数据
user = User(name="Alice")
post = Post(title="Hello World", user=user)
session.add(user)
session.add(post)
session.commit()

# 查询数据
users = session.query(User).all()
for user in users:
print(user.name)
for post in user.posts:
print(f" - {post.title}")

测试

Java

  • JUnit:单元测试框架
  • TestNG:测试框架
  • Mockito:模拟框架

Python

  • pytest:测试框架
  • unittest:标准库测试框架
  • mock:模拟库

示例(pytest)

# test_example.py
def add(a, b):
return a + b

def test_add():
assert add(1, 2) == 3
assert add(-1, 1) == 0
assert add(0, 0) == 0

# 运行:pytest test_example.py -v

12.5 包管理工具

Java 包管理

  • Maven:使用 pom.xml 管理依赖
  • Gradle:使用 build.gradle 管理依赖
  • 依赖仓库:Maven Central

Maven 示例

<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.7.0</version>
</dependency>
</dependencies>

Python 包管理

  • pip:Python 包安装工具
  • Poetry:现代包管理工具
  • 依赖仓库:PyPI

pip 示例

# 安装包
pip install requests

# 安装指定版本
pip install requests==2.28.0

# 升级包
pip install --upgrade requests

# 导出依赖
pip freeze > requirements.txt

# 安装依赖
pip install -r requirements.txt

Poetry 示例

# 创建项目
poetry new myproject

# 添加依赖
poetry add requests

# 安装依赖
poetry install

# 运行命令
poetry run python script.py

12.6 生态系统对比

特性JavaPython
包管理Maven/Gradlepip/Poetry
依赖仓库Maven CentralPyPI
Web 开发Spring Boot 为主多种框架(Django, Flask, FastAPI)
数据科学相对较弱非常强大
机器学习正在发展领先地位
企业应用传统优势快速增长
脚本开发相对复杂非常适合
跨平台良好良好

12.7 练习

  1. 标准库练习:使用 Python 标准库完成以下任务:

    • 读取一个文本文件并统计单词出现次数
    • 获取当前系统信息
    • 生成随机密码
  2. 第三方库练习

    • 使用 requests 库获取 API 数据
    • 使用 pandas 库分析 CSV 数据
    • 使用 fastapi 创建一个简单的 Web 服务
  3. 包管理练习

    • 创建一个 requirements.txt 文件
    • 使用 pip 安装多个依赖
    • 尝试使用 Poetry 管理项目依赖
  4. 综合练习

    • 创建一个简单的 Web 应用,使用 FastAPI 和 SQLAlchemy
    • 实现一个数据可视化脚本,使用 pandas 和 matplotlib

12.8 小结

  • Python 的标准库非常丰富,覆盖了大多数常见任务
  • Python 的第三方生态系统非常强大,特别是在数据科学和机器学习领域
  • Python 的包管理使用 pip,比 Java 的 Maven/Gradle 更轻量级
  • Python 的 Web 框架选择更多,从全功能的 Django 到轻量级的 Flask
  • Java 在企业应用和传统后端领域仍然具有优势
  • Python 在脚本开发、数据科学和机器学习领域具有明显优势
  • 两者都有强大的生态系统,选择哪种语言取决于具体的应用场景

通过本章的学习,你已经了解了 Java 和 Python 在标准库与生态系统上的主要区别。接下来,我们将学习 Python 的项目实战。