前言

Github:https://github.com/HealerJean

博客:http://blog.healerjean.com

一、python 介绍

1、语言特性对比

维度 Python Java
类型系统 动态类型、强类型 静态类型、强类型
编译/解释 解释型(CPython 编译为字节码,JVM 运行
性能 较慢(GIL 限制并发) 中等偏上(JIT 优化)
并发模型 多线程受限(GIL),多进程或 asyncio 基于线程的并发(线程池)
内存管理 自动垃圾回收(引用计数 +GC JVM 垃圾回收(多种 GC 算法)
语法简洁性 非常简洁、易读 相对冗长、样板代码多

2、生态与框架

1)Python

  • 主流 Web 框架:
    • Django:全功能、开箱即用(ORM、Admin、Auth 等),适合快速开发。
    • Flask:轻量、灵活,适合微服务或 API。
    • FastAPI:现代异步框架,高性能,自动生成 OpenAPI 文档,适合构建 RESTful/GraphQL API。
  • 数据科学/ML 生态强大:NumPy、Pandas、Scikit-learn、TensorFlow、PyTorch 等。

2)Java

  • Spring Boot:基于 Spring 框架的“约定优于配置”实现,极大简化了企业级应用开发。
    • 内嵌 Tomcat/Jetty
    • 自动配置、Starter 依赖
    • 强大的生态:Spring Data、Spring Security、Spring Cloud(微服务)
  • 适合大型企业系统:高稳定性、强类型安全、完善的测试和监控支持。

3、适用场景对比

场景 推荐语言/框架 原因
快速原型 / MVP / 数据分析 / AI Python 开发快、库丰富、社区活跃
企业级后端 / 高可靠性系统 / 微服务 Java 成熟稳定、事务管理强、团队协作友好

4、部署和运维

部署复杂度 中(需虚拟环境/容器) 高(JAR 包 + JVM 调优) 极低(单个二进制文件)
启动速度 慢(JVM 预热) 极快
内存占用 中等 高(JVM 最小几百 MB) 低(几十 MB 起)
容器化友好度 一般(镜像较大) 极好(Alpine 镜像 <20MB)

5、学习曲线

  • Python:最容易上手,适合初学者。
  • Java/Spring Boot:学习曲线较陡,需理解 OOPJVMSpring 生态。

二、从 Javapython

1、为什么 Java 工程师要学 Python

  • AI/ML 生态几乎全在 Python:TensorFlow、PyTorch、scikit-learn、Hugging Face 等核心库均为 Python 原生。
  • 快速原型验证:Python 写 5 行代码能干 Java 50 行的事(比如读 CSV、训练模型)。
  • 胶水语言优势:轻松调用 C/C++、Java(通过 JPype)、REST API、数据库等,整合能力强。
  • 企业级支持增强:FastAPI、Django、Ray、Polars 等让 Python 也能扛高并发、大数据。

2、Python vs Java 设计理念差异

Python 不是“弱类型语言”,而是“动态类型语言”。它的类型检查在运行时依然严格(比如 "a" + 1 会报错),只是不提前声明。

维度 Java Python
类型系统 静态强类型(编译期检查) 动态强类型(运行时检查)
执行方式 编译 → JVM 字节码 解释执行(CPython
代码风格 冗长但严谨 简洁但灵活
设计哲学 “显式契约 + 编译安全” “可读性优先 + 快速迭代”
口号 “Write once, run anywhere” “Readability counts”(来自《Python之禅》)

3、语法过度

1)基础语法逐行对比

a、变量与类型

// Java
String name = "Alice";
int age = 30;
boolean isActive = true;
# Python
name = "Alice"
age = 30
is_active = True  # 注意:True/False 首字母大写

b、控制流

注意Python缩进 定义代码块,不用 {}

// if-else
if (age >= 18) {
    System.out.println("Adult");
} else if (age > 0) {
    System.out.println("Minor");
} else {
    System.out.println("Invalid");
}

// for loop
for (int i = 0; i < 5; i++) {
    System.out.println(i);
}
# Python
if age >= 18:
    print("Adult")
elif age > 0:
    print("Minor")
else:
    print("Invalid")

# for loop
for i in range(5):
    print(i)

#  Pythonic遍历列表
names = ["Alice", "Bob"]
for name in names:
    print(name)

2)函数与模块

a、函数定义

public static int add(int a, int b) {
    return a + b;
}
def add(a: int, b: int) -> int:
    return a + b

b、默认参数 & 可变参数

def greet(name, greeting="Hello", *args, **kwargs):
    print(f"{greeting}, {name}!")
    print("Extra args:", args)      # tuple
    print("Extra kwargs:", kwargs)  # dict

greet("Tom", "Hi", "extra1", role="admin")

c、模块导入(= Java 的 import + package

import os                # 类似 import java.io.*
from datetime import datetime  # 类似 import java.time.LocalDateTime
import numpy as np       # 起别名,类似 static import

3)面向对象 OOP

a、类定义

public class Person {
    private String name;
    
    public Person(String name) {
        this.name = name;
    }
    
    public String getName() {
        return name;
    }
}
class Person:
    def __init__(self, name: str):
        self.name = name  # 自动创建实例变量
    
    def get_name(self) -> str:
        return self.name

b、继承

class Employee(Person):
    def __init__(self, name: str, emp_id: int):
        super().__init__(name)  # 调用父类构造
        self.emp_id = emp_id

3)特殊方法(Magic Methods

Java Python
toString() __str__()
equals() __eq__()
hashCode() __hash__()
class Point:
    def __init__(self, x, y):
        self.x, self.y = x, y
    
    def __str__(self):
        return f"Point({self.x}, {self.y})"
    
    def __eq__(self, other):
        return self.x == other.x and self.y == other.y

4)常用数据结构对比

功能 Java Python
动态数组 ArrayList<String> list = ["a", "b"]
哈希表 HashMap<String, Integer> dict = {"a": 1, "b": 2}
不可变序列 Collections.unmodifiableList tuple = (1, 2, 3)
无序唯一集合 HashSet<String> set = {"a", "b"}

a、列表推导式(Python 灵魂!)

# Java Stream 风格
evens = [x for x in range(10) if x % 2 == 0]
squares = [x**2 for x in range(5)]

5)异常处理

Python 支持多个 except,也支持 else(无异常时执行)。

try {
    riskyOperation();
} catch (IOException e) {
    log.error(e);
} finally {
    cleanup();
}
try:
    risky_operation()
except IOError as e:
    logger.error(e)
finally:
    cleanup()

6)文件与资源管理

对应 Javatry (FileReader fr = ...) { ... }

# 自动关闭文件(推荐!)
with open("data.txt", "r") as f:
    content = f.read()
# 出 with 块自动调用 f.close()

7)类型提示(Type Hints)—— 让 Pytho 更像 Java

Python 3.5+ 开始支持,不影响运行,但提升可读性和 IDE 支持

from typing import List, Dict, Optional

def process_users(users: List[Dict[str, str]]) -> Optional[str]:
    if not users:
        return None
    return users[0]["name"]
public static Optional<String> processUsers(List<Map<String, String>> users) {
    if (users == null || users.isEmpty()) {
        return Optional.empty();
    }
    return Optional.of(users.get(0).get("name"));
}

4、工程实践

1)项目结构

my_project/
├── src/
│   ├── __init__.py
│   ├── service/
│   └── model/
├── tests/
├── requirements.txt   ← pip install -r requirements.txt
├── pyproject.toml     ← 新一代构建配置(替代 setup.py)
└── venv/              ← 虚拟环境(不要提交到 Git)

2)虚拟环境(= Maven 的独立依赖)

python -m venv venv
source venv/bin/activate  # Linux/Mac
pip install flask pandas torch

3)单元测试(pytest

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

def test_add():
    assert add(2, 3) == 5

运行:pytest

4)SmartUserService

5、速查表

1)基础语法对比

功能 Java Python
打印 System.out.println("Hi"); print("Hi")
变量声明 String name = "Tom"; name = "Tom"
常量 final String NAME = "Tom"; NAME = "Tom"(约定大写)
多行字符串 """..."""(Java 15+) """..."""'''...'''
字符串插值 "Hi " + nameString.format() f"Hi {name}" ✅ 推荐
注释 // 单行 /* 多行 */ # 单行 """多行文档字符串"""

2)数据类型与结构

类型 Java Python 示例
整数 int a = 1; a = 1 支持任意精度
浮点 double b = 1.5; b = 1.5 默认 float64
布尔 boolean flag = true; flag = True True/False 首字母大写
空值 null None if x is None:
列表(动态数组) List<String> list = new ArrayList<>(); list = ["a", "b"] list.append("c")
元组(不可变) Collections.unmodifiableList(...) tup = (1, 2, 3) x, y = tup(解包)
字典(Map) Map<String, Integer> map = new HashMap<>(); d = {"a": 1, "b": 2} d.get("a", 0)
集合(Set) Set<String> set = new HashSet<>(); s = {"a", "b"} s.add("c")

3)控制流

结构 Java Python
if-else if (a > 0) { ... } else if (...) { ... } if a > 0: ... elif ...: ... else: ...
for 循环 for (int i=0; i<10; i++) for i in range(10):
遍历列表 for (String s : list) for item in list:
带索引遍历 手动计数 or IntStream.range for i, item in enumerate(list):
while while (condition) { ... } while condition: ...
switch switch (x) { case 1: ... }(Java 17+) match x: case 1: ...(Python 3.10+)

4)函数

特性 Java Python
定义 public int add(int a, int b) { return a+b; } def add(a: int, b: int) -> int: return a + b
默认参数 不支持(需重载) def greet(name, title="Mr"): ...
可变参数 void foo(String... args) def foo(*args):(tuple)
关键字参数 不支持 def foo(**kwargs):(dict)
Lambda (a, b) -> a + b lambda a, b: a + b
高阶函数 Stream API map(func, list), filter(pred, list)

5)面向对象(OOP

概念 Java Python
类定义 public class Person { ... } class Person:
构造函数 public Person(String name) { this.name = name; } def __init__(self, name): self.name = name
实例方法 public void say() { ... } def say(self): ...
静态方法 public static void util() { ... } @staticmethod def util(): ...
类方法 (无直接对应) @classmethod def from_str(cls, s): ...
继承 class Employee extends Person class Employee(Person):
调用父类 super() super().__init__()
访问修饰符 private/protected/public (靠约定:_var 表示“内部使用”)
toString() @Override public String toString() def __str__(self):
equals() @Override public boolean equals(Object o) def __eq__(self, other):

6)异常处理

结构 Java Python
try-catch try { ... } catch (IOException e) { ... } try: ... except IOError as e: ...
多重 catch catch (A | B e) except (A, B) as e:
finally finally { ... } finally: ...
else(无异常) else: ...(try 中无异常才执行)
抛出异常 throw new RuntimeException("msg"); raise ValueError("msg")

7)文件与资源管理

场景 Java Python
读文件 Files.readString(path) with open("file.txt") as f: content = f.read()
自动关闭 try (FileReader fr = ...) { ... } with open(...) as f: ... ✅ 推荐
写文件 Files.writeString(path, content) with open("out.txt", "w") as f: f.write(content)

8)类型提示(Type Hints)—— 让 Python 更像 Java

| 类型 | Java | Python(3.5+) | | ————- | ————————– | ———————– | | 基本类型 | String, int, boolean | str, int, bool | | 泛型 List | List<String> | List[str] | | 泛型 Map | Map<String, Integer> | Dict[str, int] | | 可空类型 | Optional<String> | Optional[str]str | | **自定义类** | User user | user: User | | **返回 void** | void method() | -> None` |

二、http.server

1、使用 http.server(适合快速测试)

1) hello_server.py

# -*- coding: utf-8 -*-
"""
一个最简 HTTP 服务器示例,用于本地开发或演示。
注意:此服务器基于 Python 标准库 http.server,
      官方明确说明:不要在生产或预发布(pre-production)环境中使用!
      仅适用于本地测试、学习或快速原型验证。
"""

# 导入标准库中的 HTTP 服务器类和请求处理器基类
from http.server import HTTPServer, BaseHTTPRequestHandler


class HelloHandler(BaseHTTPRequestHandler):
    """
    自定义 HTTP 请求处理器,继承自 BaseHTTPRequestHandler。
    重写 do_GET 方法以处理客户端的 GET 请求。
    """

    def do_GET(self):
        # 发送 HTTP 响应状态码 200(表示请求成功)
        self.send_response(200)

        # 设置响应头:内容类型为纯文本,字符编码为 UTF-8
        # 这样可确保浏览器正确解析文本(包括中文等非 ASCII 字符)
        self.send_header("Content-type", "text/plain; charset=utf-8")

        # 结束响应头部分,准备发送响应体
        self.end_headers()

        # 向客户端写入响应体(必须是字节 bytes,因此需对字符串进行 UTF-8 编码)
        self.wfile.write("Hello, World!".encode("utf-8"))


if __name__ == "__main__":
    """
    主程序入口:仅在直接运行本脚本时启动服务器。
    若被其他模块 import,则不会自动启动。
    """

    try:
        # 创建 HTTP 服务器实例:
        #   - 监听地址建议使用 "127.0.0.1" 而非 "localhost",
        #     避免因系统 hosts 配置问题导致 socket.gaierror 错误。
        #   - 端口设为 8000(可自定义,但需确保未被占用)
        #   - 使用自定义的 HelloHandler 处理请求
        server = HTTPServer(("127.0.0.1", 8000), HelloHandler)

        # 打印启动提示信息
        print("服务器启动在 http://127.0.0.1:8000")

        # 启动服务器并持续监听请求(阻塞式运行)
        server.serve_forever()

    except KeyboardInterrupt:
        # 捕获用户按 Ctrl+C 的中断信号,优雅关闭服务器
        print("\n检测到中断信号,正在关闭服务器...")
        server.server_close()
        print("服务器已关闭。")

2)启动

└─[$] python3 hello_server.py                                        [15:00:38]

服务器启动在 http://localhost:8000
127.0.0.1 - - [21/Nov/2025 15:02:51] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [21/Nov/2025 15:02:52] "GET /favicon.ico HTTP/1.1" 200 -
127.0.0.1 - - [21/Nov/2025 15:02:56] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [21/Nov/2025 15:02:56] "GET /favicon.ico HTTP/1.1" 200 -
                                     [15:08:39]
^C
检测到中断信号正在关闭服务器...
服务器已关闭

2、使用 Flask(更常用,适合实际开发)

1)app.sh

# 导入 Flask 类,它是 Flask 框架的核心类,用于创建 Web 应用
from flask import Flask

# 创建一个 Flask 应用实例
# __name__ 是 Python 的特殊变量,表示当前模块的名称
# Flask 用它来确定应用的位置,从而找到模板、静态文件等资源
app = Flask(__name__)

# 使用 @app.route 装饰器定义一个路由(URL 路径)
# 当用户访问网站根路径 '/' 时,会触发下面的函数
@app.route('/')
def hello():
    """
    定义一个视图函数,处理对根路径(/)的 GET 请求。
    这个函数返回一个字符串作为 HTTP 响应体。
    Flask 会自动将其包装为一个 200 OK 的响应,并设置 Content-Type 为 text/html。
    """
    return "Hello, World!"

# 判断当前文件是否作为主程序运行(而不是被其他模块导入)
# 这是 Python 的惯用写法,确保以下代码只在直接运行本文件时执行
if __name__ == '__main__':
    """
    启动内建的开发服务器。
    
    参数说明:
    - host='localhost':指定服务器监听的地址。
        * 'localhost' 或 '127.0.0.1' 表示只允许本机访问(安全,适合开发)
        * 若设为 '0.0.0.0',则允许同一网络中的其他设备访问(需谨慎)
    
    - port=8000:指定服务器监听的端口号。默认 Flask 用 5000,这里改为 8000
    
    - debug=True:启用调试模式。
        * 自动重载:代码修改后服务器自动重启
        * 错误页面:显示详细的错误信息和交互式调试器(⚠️ 切勿在生产环境开启!)
    """
    app.run(host='localhost', port=8000, debug=True)

2)启动

(myenv) ┌─[zhangyujin1@ZBMac-J7H7T2943L] - [~/Desktop/HealerJean/HCode/HealerJean.github.io/_posts/SoftWare/22_python] - [672]
└─[$] python3 app.py                                                 [15:12:35]

 * Serving Flask app 'app'
 * Debug mode: on
WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
 * Running on http://localhost:8000
Press CTRL+C to quit
 * Restarting with stat
 * Debugger is active!
 * Debugger PIN: 128-574-074
127.0.0.1 - - [21/Nov/2025 15:12:48] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [21/Nov/2025 15:12:48] "GET /favicon.ico HTTP/1.1" 404 -
127.0.0.1 - - [21/Nov/2025 15:12:49] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [21/Nov/2025 15:12:49] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [21/Nov/2025 15:12:49] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [21/Nov/2025 15:12:50] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [21/Nov/2025 15:12:50] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [21/Nov/2025 15:12:50] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [21/Nov/2025 15:12:50] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [21/Nov/2025 15:12:50] "GET / HTTP/1.1" 200 -
^C%                                                                             (myenv) ┌─[zhangyujin1@ZBMac-J7H7T2943L] - [~/Desktop/HealerJean/HCode/HealerJean.github.io/_posts/SoftWare/22_python] - [673]
└─[$]                                                                [15:12:58]

ContactAuthor