python_1_第一课
前言
Github:https://github.com/HealerJean
一、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:学习曲线较陡,需理解OOP、JVM、Spring生态。
二、从 Java 到 python
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)文件与资源管理
对应
Java的try (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 " + name 或 String.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]


