Java程序员一周快速掌握Python:我是怎么做到的
「说好的Python很简单呢?怎么写个循环都这么费劲?」
这是我第一天学Python时在心里疯狂呐喊的话。
作为一名有5年经验的Java程序员,之前刷技术论坛的时候,总看到有人说「Python很简单,三天入门」。我寻思着,好歹我也是写过Spring Boot、玩过并发编程的人,学Python那不是分分钟的事儿?
结果第一天就被现实按在地上摩擦。
写个简单的列表排序,愣是折腾了半小时。不是因为不会写,而是因为我不知道该用什么方法——Java有Collections.sort(),Python呢?百度搜出来的答案五花八门,有的用sorted(),有的用list.sort(),有的用lambda……(内心OS:WTF?)
但一周后,我已经能用Python独立完成一个数据处理脚本了。现在回头看,不是说我多牛,而是走了弯路后总结出了一条对Java程序员最友好的学习路径。
今天把我的踩坑路线整理出来,给那些想快速上手Python的Java同行们。避免你们再踩我踩过的坑。
01 先泼一盆冷水:Python和Java真的不一样
开始之前,先说清楚一件事——不要用Java的思维学Python,否则你会很累。
| 维度 |
Java |
Python |
| 类型系统 |
强类型,编译时检查 |
动态类型,运行时检查 |
| 代码组织 |
类+包 |
模块+函数 |
| 语法要求 |
大括号、分号 |
缩进即语法 |
| 运行方式 |
编译+运行 |
解释执行 |
核心区别就一句话:Java是「告诉计算机怎么做」,Python是「告诉计算机要什么」。
想通这件事,你的Python学习就成功了一半。
02 Day 1:环境搭建和第一行代码
第一天别贪多,把环境搭好,能跑通第一个程序,建立信心最重要。
2.1 安装Python(3.10+版本)
# macOS
brew install python3
# Linux
sudo apt install python3 python3-pip
# Windows
# 直接去 python.org 下载安装包,勾选 "Add to PATH"
验证安装:
python3 --version # 应该显示 Python 3.12.x
2.2 选 IDE
PyCharm(强烈推荐),JetBrains家的产品,Javaer上手无压力。
VS Code 也可以,装个 Python 插件就行。
2.3 第一个程序
# hello.py
print("Hello, Python!")
# 运行
python3 hello.py
这是你第一个Python程序,记佳这个时刻。
03 Day 2:数据类型和变量——彻底搞懂动态类型
第二天要过的坎是「动态类型」。Javaer表示很不习惯,但习惯后真香。
3.1 变量不需要声明类型(当时我震惊了三天)
# Java写法
String name = "张三";
int age = 25;
List<String> list = new ArrayList<>();
# Python写法
name = "张三"
age = 25
my_list = ["a", "b", "c"]
当时我内心是崩溃的:这就行啦?不需要写类型?IDE不会报错?
但这就是Python。变量名本身就是类型。你不需要告诉计算机「这是 String」,你只需要告诉它「这个名字代表这个值」。
3.2 常用数据类型
| Python |
Java近似 |
说明 |
int |
Integer |
整数 |
float |
Double |
浮点数 |
str |
String |
字符串 |
list |
List |
可变数组 |
tuple |
- |
不可变数组 |
dict |
Map |
键值对 |
set |
HashSet |
无序不重复集合 |
3.3 列表操作(Javaer最需要适应的)
# 创建列表
fruits = ["apple", "banana", "orange"]
# 添加元素(Java用add,Python用append)
fruits.append("grape")
# 删除元素
fruits.remove("banana")
# 遍历(Python的for比Java的enhanced for更简洁)
for fruit in fruits:
print(fruit)
# 列表推导式(Python独有)
squares = [x**2 for x in range(10)]
3.4 字典(Map的Python版本)
# 创建字典
user = {"name": "张三", "age": 25}
# 访问值
print(user["name"]) # 张三
print(user.get("email", "未知")) # 未知(带默认值)
# 遍历
for key, value in user.items():
print(f"{key}: {value}")
说实话,刚从Java转过来的时候,每次用dict我都要反应一下。但两天后就习惯了,而且觉得比Map方便多了。
04 Day 3:函数——Python的核心单位
Python里函数是一等公民,不像Java那样万物皆类。这一天要彻底搞懂函数的N种写法。
4.1 基本函数定义
# Python函数
def greet(name):
return f"Hello, {name}!"
# 调用
result = greet("张三")
print(result)
4.2 默认参数和返回值(这里我踩过大坑!)
def calc(a, b, operation="add"):
if operation == "add":
return a + b
elif operation == "sub":
return a - b
return 0
print(calc(10, 5)) # 15(默认add)
print(calc(10, 5, "sub")) # 5
警告:Python的默认参数只在函数定义时评估一次,这是当年我踩过的最大的坑!
当时我的代码是这样的:
# 错误的写法(别问我是怎么知道的 T_T)
def add_item(item, list=[]): # 千!万!别!这!样!写!
list.append(item)
return list
# 连续调用两次
print(add_item("a")) # ['a']
print(add_item("b")) # ['a', 'b'] # WTF?第二次调用居然保留了第一次的结果!
后来才搞明白:Python的默认参数在函数定义时就确定了,不是每次调用时重新创建。
正确的写法:
def add_item(item, list=None):
if list is None:
list = []
list.append(item)
return list
这个坑,希望你不要再踩。
4.3 *args 和 **kwargs(必懂)
# *args:接收任意数量的位置参数
def sum_all(*args):
total = 0
for num in args:
total += num
return total
print(sum_all(1, 2, 3, 4)) # 10
# **kwargs:接收任意数量的命名参数
def print_info(**info):
for key, value in info.items():
print(f"{key}: {value}")
print_info(name="张三", age=25, city="深圳")
4.4 匿名函数(lambda)
# Java的匿名内部类 -> Python的lambda
# Java写法
list.stream().map(s -> s.toUpperCase()).collect(Collectors.toList());
# Python写法
result = map(lambda s: s.upper(), ["a", "b", "c"])
list(result) # ['A', 'B', 'C']
# 常用场景:排序
users = [{"name": "张三", "age": 25}, {"name": "李四", "age": 30}]
sorted_users = sorted(users, key=lambda x: x["age"])
05 Day 4:面向对象—— Python 的类和 Java 不一样
第四天要理解Python的OOP。虽然Python也有class,但和Java的玩法不太一样。最大的区别:Python不需要把所有东西都塞进类里。
5.1 定义一个类
class User:
# 类属性(相当于Java的static字段)
count = 0
# 构造函数(__init__,不是构造方法)
def __init__(self, name, age):
self.name = name # 实例属性
self.age = age
User.count += 1
# 实例方法(第一个参数必须是self)
def greet(self):
return f"Hello, I'm {self.name}"
# 静态方法(用得少,但Java有)
@staticmethod
def get_count():
return User.count
# 创建实例
user = User("张三", 25)
print(user.greet()) # Hello, I'm 张三
看到没,Python的class不需要写public/private,写就完事儿了。
5.2 继承和多态(和Java几乎一样)
class Animal:
def speak(self):
pass
class Dog(Animal): # 继承
def speak(self):
return "wang wang!"
class Cat(Animal):
def speak(self):
return "miao miao!"
# 多态
def make_speak(animal):
print(animal.speak())
dog = Dog()
cat = Cat()
make_speak(dog) # wang wang!
make_speak(cat) # miao miao!
5.3 访问权限(Python的特色,没有关键字)
class User:
def __init__(self, name):
self.name = name # 公开(所有人可访问)
self._name = name # 受保护(约定:子类可访问)
self.__name = name # 名字重整(伪私有,外部访问不到)
Python没有真正的private关键字,靠的是约定和名字重整(name mangling)。刚看到__name的时候我也懵了,这啥玩意儿?后来才知道这是Python的「潜规则」。
5.4 特殊方法(xx,Java没有这货)
class User:
def __init__(self, name):
self.name = name
def __str__(self): # str() 调用时触发
return f"User: {self.name}"
def __eq__(self, other): # == 比较时触发
return self.name == other.name
user = User("张三")
print(user) # User: 张三
print(user == User("张三")) # True
这些__xx__方法叫做「魔术方法」或者「dunder method」(double underscore)。Javaer表示又打开了一扇新世界的大门。
06 Day 5:模块和包管理—— pip 和 virtualenv
第五天学Python的包管理。这块比Java的Maven/Gradle简单,但也更容易踩坑。
先说一句:Python的依赖管理真的比Java简洁太多了。一个requirements.txt甩过去就行,不用写pom.xml那样的一大坨。
6.1 pip 使用(Python的包管理器)
# 安装包(一行搞定)
pip install requests
# 查看已安装的包
pip list
# 导出依赖(项目交接神器)
pip freeze > requirements.txt
# 从文件安装
pip install -r requirements.txt
6.2 虚拟环境(必学!这是Python项目隔离的核心)
每个项目一个虚拟环境,别把所有包装进系统Python!血的教训!
血的教训是这样的:当时我在一台服务器上用pip安装了tensorflow,结果和我本地另一个项目冲突了,两个都跑不起来。(别笑,真的,当时我想死的心都有了。)
# 创建虚拟环境(相当于Java的Maven仓库隔离)
python3 -m venv myenv
# 激活(macOS/Linux)
source myenv/bin/activate
# 激活(Windows)
myenv\Scripts\activate
# 退出
deactivate
我的习惯是:每个项目一个venv,项目结束后直接删除目录,干干净净。
6.3 init.py(让你的文件夹变成包)
myproject/
├── __init__.py # 有了这个,myproject才是一个包
├── utils.py
└── models/
├── __init__.py
└── user.py
6.4 常用标准库(开工前先眼熟)
| 模块 |
用途 |
Java近似 |
os |
操作系统相关 |
java.io |
json |
JSON处理 |
Jackson |
datetime |
日期时间 |
java.time |
collections |
高级数据结构 |
Collections |
itertools |
迭代工具 |
Stream API |
functools |
函数式编程 |
lambda |
我的建议:不需要全部记住,但看到名字要知道它是干嘛的。
07 Day 6 & 7:实战项目—— 用Python解决一个真实问题
最后两天,做一个真实项目来巩固所学。
7.1 项目需求
读取一个CSV文件,统计里面每个城市的出现次数,按次数排序输出Top 10。
7.2 完整代码
import csv
from collections import Counter
def analyze_cities(filepath):
"""分析CSV中的城市数据"""
cities = []
# 读取CSV
with open(filepath, 'r', encoding='utf-8') as f:
reader = csv.DictReader(f)
for row in reader:
city = row.get('city', '')
if city:
cities.append(city)
# 统计次数
counter = Counter(cities)
# 返回Top 10
return counter.most_common(10)
if __name__ == "__main__":
results = analyze_cities("data.csv")
for city, count in results:
print(f"{city}: {count}")
7.3 运行结果
深圳: 150
北京: 120
上海: 100
广州: 80
杭州: 60
成都: 55
武汉: 45
西安: 40
南京: 35
苏州: 30
这就是一个完整的Python脚本!没有class,没有复杂的框架,就是解决问题。
08 总结:一周后的状态
一周后,你应该能:
最后说一句:Python不是Java的替代品,而是补充。Java处理复杂业务逻辑,Python处理数据脚本,各有所长。
有问题评论区聊,你们还想看什么Python实战?评论告诉我~