Skip to content

Python vs. JavaScript: 内置模块与核心功能对比

本文档旨在深入对比 Python 的"标准库"中的核心内置模块与 JavaScript 的内置对象及 Node.js 核心模块,帮助开发者理解两种语言在提供基础功能上的设计哲学差异。

参考资料:


核心哲学与概念对比

  • Python: "Batteries Included" (电量充足) Python 以其庞大而功能完备的标准库而闻名。大量高质量的模块无需额外安装,通过简单的 import 即可使用,覆盖了从数学运算到操作系统交互的方方面面。

  • JavaScript: 轻核心 + 宿主环境/生态系统 JavaScript 的核心语言规范 (ECMAScript) 本身非常精简。其大部分功能由宿主环境提供。在浏览器中,这指的是 Web API;在服务器端,这指的是 Node.js 的核心模块。对于更高级的功能,JavaScript 严重依赖庞大的 npm 生态系统

功能领域PythonJavaScript (及 Node.js)
数学运算math 模块Math 全局对象
随机数random 模块Math.random() (基础), crypto 模块 (更强)
日期与时间datetime 模块 (功能强大)Date 全局对象 (功能基础,API 较笨拙)
操作系统交互os (通用), sys (解释器) 模块os, process (Node.js 核心模块)
JSON 处理json 模块JSON 全局对象
正则表达式re 模块RegExp 全局对象,与字符串方法深度集成
导入方式几乎所有功能都需 import核心对象全局可用,Node.js 模块需 importrequire

1. 数学运算: math vs. Math

两者都提供了基础的数学常数和函数,但调用方式不同。

Python: math 模块

需要先导入 math 模块。

python
import math

print(math.pi)          # -> 3.141592653589793
print(math.sqrt(16))    # -> 4.0
print(math.ceil(4.2))   # -> 5
print(math.floor(4.8))  # -> 4

JavaScript: Math 全局对象

Math 是一个全局对象,无需导入,可以直接使用。

javascript
console.log(Math.PI);          // -> 3.141592653589793
console.log(Math.sqrt(16));    // -> 4
console.log(Math.ceil(4.2));   // -> 5
console.log(Math.floor(4.8));  // -> 4

核心对比: 功能集相似,主要区别在于 Python 的显式导入 vs. JavaScript 的全局可用。


2. 日期与时间: datetime vs. Date

这是两者设计差异较大的一个领域。

Python: datetime 模块

功能强大且设计清晰,提供了多个专门的类来处理日期和时间。

python
from datetime import datetime, timedelta

# 获取当前时间
now = datetime.now()
print(now) # -> 2023-10-27 10:30:00.123456

# 格式化输出 (strftime)
print(now.strftime("%Y-%m-%d %H:%M:%S")) # -> "2023-10-27 10:30:00"

# 从字符串解析 (strptime)
date_str = "2023-01-01"
dt_obj = datetime.strptime(date_str, "%Y-%m-%d")
print(dt_obj)

# 时间计算
one_day_later = now + timedelta(days=1)
print(one_day_later)

JavaScript: Date 全局对象

API 相对基础和笨拙,月份从 0 开始计数是其经典"怪癖"。

javascript
// 获取当前时间
const now = new Date();
console.log(now); // -> Fri Oct 27 2023 10:30:00 GMT+...

// 获取各部分
console.log(now.getFullYear()); // -> 2023
console.log(now.getMonth());    // -> 9 (因为十月是第10个月,索引为9)

// 格式化 (没有内置的 strftime/strptime)
// 通常需要手动拼接或使用 toISOString, toLocaleString 等
console.log(now.toISOString()); // -> "2023-10-27T10:30:00.123Z"

// 时间计算
const oneDayLater = new Date(now);
oneDayLater.setDate(now.getDate() + 1);
console.log(oneDayLater);

核心对比: Python 的 datetime 在功能完备性和 API 友好性上远超 JS 的 Date。在 JS 生态中,日期处理通常严重依赖第三方库(如 date-fns, day.js)。


3. 操作系统与进程交互

Python: ossys 模块

职责划分清晰:os 用于与操作系统交互,sys 用于与 Python 解释器交互。

python
import os
import sys

# os 模块
print(os.getcwd())        # 获取当前工作目录
print(os.environ.get("PATH")) # 获取环境变量

# sys 模块
print(sys.argv)           # 获取命令行参数
print(sys.platform)       # 获取操作系统平台
# sys.exit(1)               # 退出程序

JavaScript (Node.js): osprocess

Node.js 将大部分功能集中在 os 模块和全局的 process 对象上。

javascript
import os from 'os';
// 'process' 是全局对象,无需导入
import process from 'process';

// os 模块
console.log(os.homedir());  // 获取用户主目录
console.log(os.platform()); // 获取操作系统平台

// process 对象
console.log(process.cwd());   // 获取当前工作目录
console.log(process.argv);    // 获取命令行参数
console.log(process.env.PATH);// 获取环境变量
// process.exit(1);            // 退出程序

核心对比: 功能高度重叠,但 Python 的职责划分更细。Node.js 的 process 对象扮演了 Python 中 sys 和部分 os 模块的角色。


4. JSON 处理: json vs. JSON

两者功能几乎完全对等,是跨语言数据交换的基石。

Python: json 模块

python
import json

# Python 字典转 JSON 字符串 (序列化)
my_dict = {"name": "Alice", "age": 30}
json_string = json.dumps(my_dict, indent=2)
print(json_string)

# JSON 字符串转 Python 字典 (反序列化)
parsed_dict = json.loads(json_string)
print(parsed_dict["name"]) # -> "Alice"

JavaScript: JSON 全局对象

javascript
// JS 对象转 JSON 字符串 (序列化)
const myObj = { name: "Alice", age: 30 };
const jsonString = JSON.stringify(myObj, null, 2); // indent=2
console.log(jsonString);

// JSON 字符串转 JS 对象 (反序列化)
const parsedObj = JSON.parse(jsonString);
console.log(parsedObj.name); // -> "Alice"

核心对比: API 命名和功能几乎一致 (dumps/stringify, loads/parse)。主要区别仍然是 Python 需要 import,而 JS 是全局可用的。


5. 正则表达式: re vs. RegExp

Python: re 模块

所有正则操作都通过 re 模块的函数进行。

python
import re

text = "My email is alice@example.com"
match = re.search(r"(\w+)@(\w+\.\w+)", text)

if match:
    print("匹配成功!")
    print(match.group(0)) # -> "alice@example.com"
    print(match.group(1)) # -> "alice"

JavaScript: RegExp 对象与字符串方法

正则表达式在 JavaScript 中是一等公民,可以直接通过字面量创建,并且其核心 API 被集成到了 String.prototype 上。

javascript
const text = "My email is alice@example.com";
const regex = /(\w+)@(\w+\.\w+)/;

const match = text.match(regex);

if (match) {
  console.log("匹配成功!");
  console.log(match[0]); // -> "alice@example.com"
  console.log(match[1]); // -> "alice"
}

核心对比: Python 将正则功能集中在 re 模块中。JavaScript 将其深度集成在语言核心和字符串方法中,语法上更直接。


6. Python 标准库模块索引概览

以下列表基于 Python 官方标准库文档,旨在展示 Python "电量充足"(Batteries Included)的设计哲学。这与 JavaScript 的轻核心形成鲜明对比。列表内容庞大,仅选取部分有代表性的模块作为概览。

模块 (Module)主要用途 (Primary Purpose)
A
abc支持抽象基类 (Abstract Base Classes),用于定义接口。
argparse用于解析命令行选项、参数和子命令。
ast处理 Python 代码的抽象语法树 (Abstract Syntax Trees)。
asyncio实现基于 async/await 的并发编程框架。
atexit注册在 Python 解释器退出时执行的清理函数。
B
base64提供 Base16, Base32, Base64 等数据编码和解码功能。
bisect为排序列表提供二分查找算法。
builtins提供所有内置的标识符,如 len(), str, Exception
bz2提供对 bzip2 压缩格式的支持。
C
calendar提供通用的日历相关函数。
collections提供标准数据类型(dict, list 等)的高性能替代品。
concurrent.futures提供了异步执行可调用对象的高层接口。
csv用于读写逗号分隔值(CSV)文件。
D
dataclasses提供一个装饰器和函数来自动生成特殊方法,如 __init__()
datetime提供用于处理日期和时间的基本类。
F
functools为高阶函数和可调用对象提供工具。
G
glob提供类似 Unix shell 风格的路径名模式匹配功能。
gzip提供对 gzip 压缩格式的支持。
H
hashlib实现了一系列安全哈希和消息摘要算法 (如 SHA256, MD5)。
http包含了 HTTP 协议的客户端和服务端实现。
I
importlibimport 语句的实现,提供了代码动态导入的能力。
inspect提供了检查活动对象(模块、类、函数、代码对象)的工具。
itertools提供了用于创建高效迭代器的函数。
J
json用于 JSON (JavaScript Object Notation) 的编码和解码。
L
logging为应用程序和库提供灵活的事件日志系统。
M
multiprocessing提供了基于进程的并行计算支持。
O
os提供了与操作系统进行交互的多种功能。
P
pathlib提供了面向对象的文件系统路径表示和操作。
pickle实现了 Python 对象结构的序列化和反序列化。
pprint提供了"美化打印"功能,能让数据结构更易读。
Q
queue提供了一个同步的队列类,用于多线程编程。
S
shutil提供了高层次的文件操作,如复制、移动和删除。
socket提供了底层的 BSD 套接字接口,用于网络编程。
sqlite3为 SQLite 数据库提供了一个 DB-API 2.0 兼容的接口。
ssl为套接字对象提供了 TLS/SSL 封装。
subprocess用于衍生新的进程,连接到它们的输入/输出/错误管道。
sys提供了对由解释器使用或维护的变量和函数的访问。
T
tempfile用于生成临时文件和目录。
threading提供了基于线程的并行计算支持。
U
unittestPython 的单元测试框架。
urllib.parse用于分解 URL 字符串。
urllib.request用于打开和读取 URL。
V
venv用于创建轻量级的虚拟环境。
W
weakref提供了弱引用支持,允许你引用对象而又不增加其引用计数。
X
xml.etree.ElementTree提供了简单而高效的 API 用于解析和创建 XML 数据。
Z
zipfile用于处理 ZIP 归档文件。
zlib提供了与 gzip 兼容的数据压缩功能。