第2章:语法基础对比
作为 Java 开发者,你已经熟悉了 Java 的语法结构。Python 的语法更加简洁直观,但也有一些重要的区别。本章将详细对比两种语言的基础语法。
2.1 代码结构
Java 代码结构
// 包声明
package com.example;
// 导入语句
import java.util.ArrayList;
import java.util.List;
// 类声明
public class Example {
// 主方法
public static void main(String[] args) {
// 代码块
System.out.println("Hello");
}
}
Python 代码结构
# 导入语句
import os
import sys
# 函数定义
def main():
# 代码块
print("Hello")
# 执行入口
if __name__ == "__main__":
main()
对比:
| 特性 | Java | Python |
|---|---|---|
| 包管理 | 使用 package 声明 | 使用目录结构和 __init__.py 文件 |
| 导入语句 | import 语句,支持通配符 | import 语句,支持别名和部分导入 |
| 代码块 | 使用大括号 {} | 使用缩进(通常4个空格) |
| 主方法 | 必须有 main 方法 | 没有强制的主方法,使用 if __name__ == "__main__" |
| 语句结束 | 必须使用分号 ; | 不需要分号(可选) |
| 注释 | // 单行注释,/* */ 多行注释 | # 单行注释,''' ''' 或 """ """ 多行注释 |
2.2 变量声明
Java 变量声明
// 变量声明
int age = 25;
String name = "Alice";
double salary = 50000.0;
boolean isEmployee = true;
// 常量
final int MAX_AGE = 100;
Python 变量声明
# 变量声明(动态类型)
age = 25
name = "Alice"
salary = 50000.0
is_employee = True
# 常量(约定俗成,无强制)
MAX_AGE = 100
对比:
| 特性 | Java | Python |
|---|---|---|
| 类型声明 | 必须显式声明类型 | 动态类型,无需声明类型 |
| 变量命名 | 驼峰命名法(camelCase) | 蛇形命名法(snake_case) |
| 常量 | 使用 final 关键字 | 约定使用全大写字母 |
| 类型检查 | 编译时类型检查 | 运行时类型检查 |
| 变量初始化 | 可以声明后初始化 | 声明时必须初始化 |
2.3 数据类型
Java 数据类型
- 基本类型:byte, short, int, long, float, double, char, boolean
- 引用类型:String, Integer, ArrayList, 自定义类等
Python 数据类型
- 基本类型:int, float, str, bool, None
- 容器类型:list, tuple, dict, set
- 其他类型:bytes, bytearray, range 等
对比:
| Java 类型 | Python 类型 | 说明 |
|---|---|---|
| int | int | Python 的 int 没有大小限制 |
| double | float | Python 只有一种浮点类型 |
| char | str | Python 中单个字符也是字符串 |
| boolean | bool | Python 使用 True/False(首字母大写) |
| String | str | Python 的字符串更灵活 |
| int[] | list | Python 的列表可以包含不同类型 |
List<T> | list | Python 列表无需指定类型 |
Map<K,V> | dict | Python 的字典类似 Java 的 Map |
Set<T> | set | Python 的集合类似 Java 的 Set |
2.4 操作符
算术操作符
| 操作符 | Java | Python | 说明 |
|---|---|---|---|
| + | 相同 | 相同 | 加法 |
| - | 相同 | 相同 | 减法 |
| * | 相同 | 相同 | 乘法 |
| / | 整数除法截断 | 浮点数除法 | Python 3 中 / 总是浮点数除法 |
| % | 相同 | 相同 | 取模 |
| ++ | 有 | 无 | Python 中使用 x += 1 |
| -- | 有 | 无 | Python 中使用 x -= 1 |
| ** | 无 | 有 | 幂运算(Python) |
| // | 无 | 有 | 整数除法(Python) |
比较操作符
| 操作符 | Java | Python | 说明 |
|---|---|---|---|
| == | 相同 | 相同 | 相等比较 |
| != | 相同 | 相同 | 不等比较 |
| > | 相同 | 相同 | 大于 |
| < | 相同 | 相同 | 小于 |
| >= | 相同 | 相同 | 大于等于 |
| <= | 相同 | 相同 | 小于等于 |
| instanceof | 有 | 无 | Python 使用 isinstance() 函数 |
| === | 无 | 无 | 两者都没有 |
逻辑操作符
| Java | Python | 说明 |
|---|---|---|
| && | and | 逻辑与 |
| || | or | 逻辑或 |
| ! | not | 逻辑非 |
赋值操作符
| 操作符 | Java | Python | 说明 |
|---|---|---|---|
| = | 相同 | 相同 | 赋值 |
| += | 相同 | 相同 | 加赋值 |
| -= | 相同 | 相同 | 减赋值 |
| *= | 相同 | 相同 | 乘赋值 |
| /= | 相同 | 相同 | 除赋值 |
| %= | 相同 | 相同 | 取模赋值 |
| **= | 无 | 有 | 幂赋值(Python) |
| //= | 无 | 有 | 整数除法赋值(Python) |
2.5 字符串操作
Java 字符串
String str = "Hello";
String str2 = str + " World";
String str3 = String.format("Name: %s, Age: %d", name, age);
int length = str.length();
boolean contains = str.contains("ell");
String upper = str.toUpperCase();
Python 字符串
str = "Hello"
str2 = str + " World"
str3 = f"Name: {name}, Age: {age}" # f-string
length = len(str)
contains = "ell" in str
upper = str.upper()
对比:
| 操作 | Java | Python |
|---|---|---|
| 字符串拼接 | + 或 StringBuilder | + 或 f-string |
| 字符串格式化 | String.format() | f-string、format()、% 操作符 |
| 字符串长度 | length() 方法 | len() 函数 |
| 包含检查 | contains() 方法 | in 操作符 |
| 大小写转换 | toUpperCase()、toLowerCase() | upper()、lower() |
| 字符串切片 | 复杂 | 简单:str[0:5] |
| 多行字符串 | 需要 \n 或 StringBuilder | 三引号 ''' 或 """ |
2.6 输入输出
Java 输入输出
// 输出
System.out.println("Hello");
System.out.print("Hello ");
System.out.printf("Name: %s\n", name);
// 输入
Scanner scanner = new Scanner(System.in);
String input = scanner.nextLine();
int number = scanner.nextInt();
Python 输入输出
# 输出
print("Hello")
print("Hello ", end="") # 不换行
print(f"Name: {name}")
# 输入
input_str = input("Enter something: ")
number = int(input("Enter a number: "))
对比:
| 操作 | Java | Python |
|---|---|---|
| 输出 | System.out.println() | print() |
| 不换行输出 | System.out.print() | print(..., end="") |
| 格式化输出 | System.out.printf() | print(f"...") |
| 输入 | Scanner 类 | input() 函数 |
| 类型转换 | 手动转换 | 使用类型函数转换 |
2.7 代码风格
Java 代码风格
- 缩进:通常使用 4 个空格或 1 个制表符
- 大括号:新行开始
- 命名:驼峰命名法(camelCase)
- 每行长度:通常不超过 100 字符
Python 代码风格
- 缩进:强制使用 4 个空格(PEP 8 规范)
- 大括号:不需要,使用缩进
- 命名:
- 变量和函数:蛇形命名法(snake_case)
- 类:驼峰命名法(CamelCase)
- 常量:全大写(UPPER_CASE)
- 每行长度:通常不超过 79 字符(PEP 8 规范)
2.8 常见语法错误对比
Java 常见错误
- 缺少分号
; - 大括号不匹配
- 类型不匹配
- 未声明的变量
- 访问控制错误
Python 常见错误
- 缩进错误(最常见)
- 变量名拼写错误
- 冒号
:缺失 - 引号不匹配
- 混合使用空格和制表符
2.9 练习
- 变量练习:创建 Python 变量存储个人信息(姓名、年龄、职业),并打印出来
- 字符串练习:使用 f-string 格式化输出个人信息
- 操作符练习:实现一个简单的计算器,支持加减乘除
- 输入输出练习:编写程序,输入两个数,计算它们的和并输出
- 代码风格练习:按照 PEP 8 规范重写以下代码:
def calculate(a,b):return a+bname="alice"age=25print(Name+" is "+str(age)+" years old")
2.10 小结
- Python 的语法比 Java 更简洁,减少了样板代码
- Python 使用缩进代替大括号,强制代码风格一致性
- Python 的动态类型系统让代码更灵活,但也需要更多的运行时检查
- Python 的字符串操作更直观,特别是 f-string 格式化
- Python 的操作符更丰富,如
**幂运算和//整数除法 - Python 的输入输出更简单,不需要额外的类
通过本章的学习,你已经了解了 Java 和 Python 在语法基础上的主要区别。接下来,我们将深入学习 Python 的数据类型和操作。