Python 快速上手(Java 开发者版)

笔者本人是有 Java 基础,这篇文档只讲 Python 的不同之处和刷题/开发中最实用的东西。


目录

  1. 环境搭建

  2. 语法速览:一张表看懂 Java vs Python

  3. 内置数据结构(刷题核心)

  4. 列表推导式 & 生成器(Python 大招)

  5. 函数常用写法

  6. 面向对象速通

  7. 刷题常用模块

  8. 文件与系统操作

  9. pip 与虚拟环境

  10. Demo 项目:命令行待办事项

  11. 推荐学习资源


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

对比项JavaPython
语句结束;不需要
代码块{}缩进(4空格)
注释///* */#"""..."""
类型静态int x = 1;动态x = 1
逻辑运算&&\|\|!andornot
nullnullNone
布尔true/falseTrue/False(首字母大写)
定义变量int x = 1;x = 1
定义常量final int X = 1;靠命名约定X = 1(全大写)
定义函数声明返回值类型def func():
thisthis.xxxself.xxx
构造方法类名同名方法__init__(self)
equalsa.equals(b)a == b(值比较)
switchswitch/casematch/case(3.10+)
三元运算符a ? b : cb 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 = grade

Python 的面向对象没有 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 字符串 → dict

pathlib(操作路径,比 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。