Python 快速上手(Java 开发者版)
笔者本人是有 Java 基础,这篇文档只讲 Python 的不同之处和刷题/开发中最实用的东西。
目录
环境搭建
语法速览:一张表看懂 Java vs Python
内置数据结构(刷题核心)
列表推导式 & 生成器(Python 大招)
函数常用写法
面向对象速通
刷题常用模块
文件与系统操作
pip 与虚拟环境
Demo 项目:命令行待办事项
推荐学习资源
1. 环境搭建
安装 Python
python.org/downloads 下载安装包,勾选 "Add Python to PATH",一路下一步。
验证:
python --version
装 PyCharm
JetBrains 官网 下载PyCharm Community Edition(免费版够用)。安装后新建项目,选好 Python 解释器路径即可。
运行代码
命令行交互模式:直接敲
python,适合试验几行代码。脚本模式:
python xxx.py,适合刷题和项目。
2. 语法速览:一张表看懂 Java vs Python
| 对比项 | Java | Python |
|---|---|---|
| 语句结束 | ; | 不需要 |
| 代码块 | {} | 缩进(4空格) |
| 注释 | ///* */ | #"""...""" |
| 类型 | 静态int x = 1; | 动态x = 1 |
| 逻辑运算 | &&\|\|! | andornot |
| null | null | None |
| 布尔 | true/false | True/False(首字母大写) |
| 定义变量 | int x = 1; | x = 1 |
| 定义常量 | final int X = 1; | 靠命名约定X = 1(全大写) |
| 定义函数 | 声明返回值类型 | def func(): |
| this | this.xxx | self.xxx |
| 构造方法 | 类名同名方法 | __init__(self) |
| equals | a.equals(b) | a == b(值比较) |
| switch | switch/case | match/case(3.10+) |
| 三元运算符 | a ? b : c | b if a else c |
| for 循环 | for (int i=0; i<n; i++) | for i in range(n): |
| 数组 | int[] a = {1,2,3}; | a = [1, 2, 3] |
缩进就是一切
if x > 0: print("正数") # 缩进必须一致,混用 Tab 和空格会报错 else: print("非正数")条件判断
if score >= 90: print("A") elif score >= 80: # 注意是 elif 不是 else if print("B") else: print("C")循环
# for --- 遍历一切可迭代对象 for i in range(5): # 0 1 2 3 4 for i in range(2, 6): # 2 3 4 5 for i in range(0, 10, 3): # 0 3 6 9(步长) for item in list: # 直接遍历元素 for i, item in enumerate(list): # 带索引遍历 # while --- 和 Java 一样 while condition: ...
3. 内置数据结构(刷题核心)
list(= Java 的 ArrayList)
a = [1, 2, 3] a.append(4) # 尾部追加 [1,2,3,4] a.insert(1, 99) # 指定位置插入 [1,99,2,3,4] a.pop() # 弹出尾部 → 4 a.pop(0) # 弹出索引0 → 1 a.remove(2) # 删除值为2的第一个元素 a.sort() # 原地排序 a.sort(reverse=True) # 降序 b = sorted(a) # 返回新排序列表,原列表不变 # 切片(刷题大杀器) a = [0, 1, 2, 3, 4, 5] a[0:3] # [0, 1, 2] 左闭右开 a[2:] # [2, 3, 4, 5] a[:3] # [0, 1, 2] a[-1] # 5 最后一个 a[-2:] # [4, 5] 最后两个 a[::-1] # [5, 4, 3, 2, 1, 0] 反转 a[::2] # [0, 2, 4] 步长2 # 多维列表(注意别写成 [[0]*n]*m,那是浅拷贝!) matrix = [[0] * n for _ in range(m)] # m 行 n 列的 0 矩阵
tuple:不可变列表
t = (1, 2, 3) x, y, z = t # 解包 # t[0] = 5 ❌ 报错,元组不能改
dict(= Java 的 HashMap / Map)
d = {"a": 1, "b": 2} d["c"] = 3 # 添加 d.get("z", 0) # 安全取值,键不存在返回 0 d.setdefault("z", 0) # 键不存在就设默认值并返回 del d["a"] # 删除 # 遍历 for k, v in d.items(): # 键值对 for k in d: # 键 for v in d.values(): # 值 # 字典推导式 squares = {x: x*x for x in range(5)} # {0:0, 1:1, 2:4, 3:9, 4:16}set(= Java 的 HashSet)
s = {1, 2, 3} s.add(4) s.remove(1) s = set([1, 1, 2, 3]) # 去重 {1, 2, 3} # 集合运算 a & b # 交集 a | b # 并集 a - b # 差集deque(= Java 的 ArrayDeque,刷题 BFS 必备)
from collections import deque q = deque() q.append(1) # 右侧入队 q.appendleft(2) # 左侧入队 q.pop() # 右侧弹出 q.popleft() # 左侧弹出 = Java 的 poll() q[0] # 查看队首
Counter(频率统计)
from collections import Counter cnt = Counter([1, 1, 2, 3, 3, 3]) print(cnt) # Counter({3: 3, 1: 2, 2: 1}) cnt.most_common(2) # 出现最多的 2 个 [(3, 3), (1, 2)]defaultdict(有默认值的 dict)
from collections import defaultdict d = defaultdict(int) # 默认值 0 d["a"] += 1 # 即使 "a" 不存在也不会报错,默认 0 d = defaultdict(list) # 默认值空列表 d["k"].append(1) # 省去判空再初始化的步骤
heapq(小顶堆,刷题优先级队列)
import heapq h = [] heapq.heappush(h, 3) heapq.heappush(h, 1) heapq.heappush(h, 2) heapq.heappop(h) # 1(每次弹出最小的) # 大顶堆:取负数存入 heapq.heappush(h, -x) max_val = -heapq.heappop(h)
4. 列表推导式 & 生成器(Python 大招)
列表推导式
# 基本形式 squares = [x*x for x in range(10)] # 带条件过滤 evens = [x for x in range(20) if x % 2 == 0] # if-else 写前面(注意位置和上面不一样) labels = ["偶数" if x % 2 == 0 else "奇数" for x in range(5)] # 嵌套循环 pairs = [(x, y) for x in range(2) for y in range(3)] # [(0,0), (0,1), (0,2), (1,0), (1,1), (1,2)] # 二维数组初始化(正确姿势,每个子列表独立) dp = [[0] * n for _ in range(m)]
生成器(懒加载,省内存)
# 圆括号 = 生成器表达式 gen = (x*x for x in range(1000000)) # 不立刻计算,迭代时才逐个生成 next(gen) # 0 # yield 函数 = 生成器函数 def fib(n): a, b = 0, 1 for _ in range(n): yield a a, b = b, a + b
5. 函数常用写法
def func(a, b, c=0, *args, **kwargs): """ a, b: 必选参数 c=0: 有默认值的可选参数 *args: 可变位置参数(打包成 tuple) **kwargs: 可变关键字参数(打包成 dict) """ pass # 多返回值(本质是返回 tuple) def divide(a, b): return a // b, a % b quotient, remainder = divide(10, 3) # 3, 1 # lambda(匿名函数,刷题排序回调巨好用) add = lambda x, y: x + y pairs.sort(key=lambda p: p[1]) # 按第二个元素排序 students.sort(key=lambda s: (-s["score"], s["name"])) # 先按分数降序,再按名字升序
6. 面向对象速通
class Student: # 类变量(= Java 的 static 变量) school = "清华" def __init__(self, name, age): # 实例变量 self.name = name self.age = age self.__secret = "隐藏" # __ 开头 = 约定私有(名称改写,不是真私有) # 实例方法 def introduce(self): print(f"我是{self.name},{self.age}岁") # str() 或 print() 时自动调用(= Java 的 toString()) def __str__(self): return f"Student({self.name}, {self.age})" # 类方法(= Java static 方法) @classmethod def from_string(cls, s): name, age = s.split(",") return cls(name, int(age)) # 继承 class Pupil(Student): def __init__(self, name, age, grade): super().__init__(name, age) # 调用父类构造 self.grade = gradePython 的面向对象没有 Java 那么重的"设计模式"文化,很多场景直接写函数就行。
7. 刷题常用模块
math
import math math.sqrt(16) # 4.0 math.gcd(12, 8) # 4(最大公约数) math.isqrt(10) # 3(整数平方根) math.comb(5, 2) # 10(组合数 C(5,2)) math.perm(5, 2) # 20(排列数) math.ceil(3.14) # 4(向上取整) math.floor(3.14) # 3(向下取整)
itertools(排列组合、无限迭代)
from itertools import permutations, combinations, accumulate list(permutations([1, 2, 3], 2)) # 排列: [(1,2),(1,3),(2,1),(2,3),(3,1),(3,2)] list(combinations([1, 2, 3], 2)) # 组合: [(1,2),(1,3),(2,3)] list(accumulate([1, 2, 3, 4])) # 前缀和: [1,3,6,10]
bisect(二分查找/插入)
import bisect a = [1, 3, 5, 7, 9] bisect.bisect_left(a, 5) # 2(第一个 ≥5 的位置) bisect.bisect_right(a, 5) # 3(第一个 >5 的位置) bisect.insort(a, 4) # 插入并保持有序 → [1,3,4,5,7,9]
functools(缓存、自定义比较)
from functools import lru_cache @lru_cache(maxsize=None) # 自动记忆化,DFS 递归必备 def fib(n): return n if n < 2 else fib(n-1) + fib(n-2) # cmp_to_key:把 Java 风格 comparator 转成 key from functools import cmp_to_key def compare(a, b): return a - b # 负数 a 在前,正数 b 在前 a.sort(key=cmp_to_key(compare))
random
import random random.randint(1, 100) # [1, 100] 随机整数 random.choice([1, 2, 3]) # 随机选一个 random.shuffle(arr) # 原地洗牌
字符串和 ASCII 互相转换
ord('A') # 65 chr(65) # 'A'用sorted()的 key 实现复杂排序
# 先按长度,再按字母序 words = ["apple", "pie", "banana", "a"] words.sort(key=lambda w: (len(w), w)) # ['a', 'pie', 'apple', 'banana'] # 自定义类的排序 class Node: def __init__(self, val): self.val = val def __lt__(self, other): return self.val < other.val # 实现 __lt__ 就能比较
8. 文件与系统操作
文件读写
with open("data.txt", "r", encoding="utf-8") as f: content = f.read() # 全读 lines = f.readlines() # 读成 list,每行一个元素 with open("out.txt", "w", encoding="utf-8") as f: f.write("hello\n") # 逐行读(大文件) with open("big.txt", "r", encoding="utf-8") as f: for line in f: print(line.strip())模式:r读、w覆盖写、a追加、rb/wb二进制读写。
JSON
import json d = {"name": "小明", "age": 18} json.dumps(d) # dict → JSON 字符串 json.dumps(d, ensure_ascii=False) # 中文不转义 json.loads('{"a":1}') # JSON 字符串 → dictpathlib(操作路径,比 os.path 好用)
from pathlib import Path p = Path("data/input.txt") p.exists() # 是否存在 p.parent # data p.stem # input(不含后缀的文件名) p.suffix # .txt [p for p in Path(".").glob("*.py")] # 列当前目录下所有 .py 文件9. pip 与虚拟环境
pip(= Java 的 Maven/Gradle)
pip install requests # 安装 pip install requests==2.28 # 安装指定版本 pip uninstall requests # 卸载 pip list # 看已安装的包 pip freeze > requirements.txt # 导出依赖清单 pip install -r requirements.txt # 按清单安装
虚拟环境(= 给每个项目独立一套依赖)
# 创建虚拟环境 python -m venv venv # 激活(Windows) venv\Scripts\activate # 激活(Mac/Linux) source venv/bin/activate # 退出 deactivate
每个项目都建一个 venv,避免依赖冲突。PyCharm 新建项目时勾选 "Create a virtual environment" 即可自动搞定。
10. Demo 项目:命令行待办事项
一个完整的 Todo CLI 小工具:支持增删改查、JSON 文件持久化、多文件模块化组织。
项目结构
todo-cli/ ├── models.py # 数据模型 ├── storage.py # JSON 读写 ├── commands.py # 业务逻辑 └── main.py # 入口 & 命令行交互
models.py —— 数据类
from dataclasses import dataclass from datetime import datetime @dataclass class Task: title: str done: bool = False created_at: str = "" def __post_init__(self): if not self.created_at: self.created_at = datetime.now().strftime("%Y-%m-%d %H:%M") def toggle(self): self.done = not self.done
@dataclass相当于 Lombok 的@Data——自动生成__init__、__repr__、__eq__,省去手写样板代码。__post_init__在自动生成的__init__之后自动调用,用于设置默认值。
storage.py —— JSON 持久化
import json from pathlib import Path from models import Task DATA_FILE = Path("tasks.json") def load_tasks() -> list[Task]: """从 JSON 文件加载,文件不存在则返回空列表""" if not DATA_FILE.exists(): return [] with open(DATA_FILE, "r", encoding="utf-8") as f: raw = json.load(f) return [Task(**item) for item in raw] def save_tasks(tasks: list[Task]) -> None: """将任务列表写入 JSON 文件""" data = [{"title": t.title, "done": t.done, "created_at": t.created_at} for t in tasks] with open(DATA_FILE, "w", encoding="utf-8") as f: json.dump(data, f, ensure_ascii=False, indent=2)
Task(**item)是字典解包,等效于Task(title=item["title"], done=item["done"], ...)。
commands.py —— 业务逻辑
from models import Task from storage import load_tasks, save_tasks def add_task(title: str) -> None: tasks = load_tasks() tasks.append(Task(title=title)) save_tasks(tasks) print(f"[OK] 已添加: {title}") def list_tasks() -> None: tasks = load_tasks() if not tasks: print("暂无待办事项") return for i, task in enumerate(tasks, start=1): status = "[DONE]" if task.done else "[TODO]" print(f" {i}. [{status}] {task.title} ({task.created_at})") def done_task(index: int) -> None: tasks = load_tasks() if 0 <= index < len(tasks): tasks[index].toggle() save_tasks(tasks) print(f"[OK] 已切换状态: {tasks[index].title}") else: print(f"[ERROR] 序号无效: {index + 1}") def delete_task(index: int) -> None: tasks = load_tasks() if 0 <= index < len(tasks): removed = tasks.pop(index) save_tasks(tasks) print(f"[OK] 已删除: {removed.title}") else: print(f"[ERROR] 序号无效: {index + 1}")main.py —— 入口
from commands import add_task, list_tasks, done_task, delete_task def main(): print("=== 待办事项管理器 (输入 help 查看命令) ===\n") while True: try: cmd = input("> ").strip() if not cmd: continue if cmd == "help": print(" add <内容> - 添加待办") print(" list - 查看所有待办") print(" done <序号> - 切换完成状态") print(" del <序号> - 删除待办") print(" quit - 退出") elif cmd.startswith("add "): title = cmd[4:] add_task(title) elif cmd == "list": list_tasks() elif cmd.startswith("done "): idx = int(cmd.split()[1]) - 1 done_task(idx) elif cmd.startswith("del "): idx = int(cmd.split()[1]) - 1 delete_task(idx) elif cmd == "quit": print("再见!") break else: print(f"未知命令: {cmd},输入 help 查看帮助") except (ValueError, IndexError): print("[ERROR] 输入格式有误,请检查序号是否正确") except KeyboardInterrupt: print("\n再见!") break if __name__ == "__main__": main()
if __name__ == "__main__"等价于 Javamain()方法——文件被直接执行时运行,被 import 时不运行。
运行效果
=== 待办事项管理器 (输入 help 查看命令) === > add 复习Python语法 [OK] 已添加: 复习Python语法 > add 刷两道LeetCode [OK] 已添加: 刷两道LeetCode > list 1. [TODO] 复习Python语法 (2026-06-19 14:30) 2. [TODO] 刷两道LeetCode (2026-06-19 14:31) > done 1 [OK] 已切换状态: 复习Python语法 > list 1. [DONE] 复习Python语法 (2026-06-19 14:30) 2. [TODO] 刷两道LeetCode (2026-06-19 14:31) > quit 再见!
知识点索引
| Demo 中用到的 | 对应章节 |
|---|---|
@dataclass | 第6节 面向对象 |
list[Task]类型注解 | —(Python 3.9+ 内置泛型) |
[Task(**item) for ...]列表推导式 | 第4节 |
**字典解包 | 第3节 dict |
json.dump/load | 第8节 JSON |
pathlib.Path | 第8节 pathlib |
try/except | 异常处理 |
enumerate(tasks, start=1) | 第2节 循环 |
| f-string | 第2节 |
| 多文件模块化 | 第5节 函数 |
11. 推荐学习资源
刷题
LeetCode— 直接用 Python 刷,不会的语法对着这篇文档查
代码随想录— 算法讲解 + Python 代码,适合跟着刷
进阶
| 资源 | 说明 |
|---|---|
| Python 官方教程 | 免费、有中文、最权威,一周可翻完 |
| 《流畅的Python》 | Java 开发转 Python 必读,讲的都是"Pythonic"写法 |
| Real Python | 高质量英文教程,每个主题讲得深入浅出 |
搜资料技巧
搜的时候加site:docs.python.org看官方文档,或者直接csdn+ 关键字。报错信息直接贴到搜索引擎 / AI 工具里问。
附:刷题代码模板
# ===== LeetCode 模板 ===== from typing import List, Optional from collections import deque, Counter, defaultdict import heapq from functools import lru_cache, cmp_to_key import math import bisect class Solution: def solve(self, nums: List[int], target: int) -> int: # 你的代码 pass
刷题时把这段粘到开头,所需模块一次性全部导入,省得逐个 import。
