【JAVA工程师从0开始学AI】,第二步:从强类型到动态语言:Java工程师的Python语法避坑指南

这是一篇介绍Python语法与JAVA语法区别文章,让我们以对比的方式,来学习一下Python的语法。

首先我们看一下下面的Python代码,和具体在java 当中分别代表了什么意思

numbers = [1,2,3,4,5,6,7,8,9]  # ① 创建数字列表(像Java的ArrayList,但不用写泛型)
odd_numbers = []  # ② 准备装奇数的空列表(类似Java的 new ArrayList<>())

# ③ 这个注释就像Java的 // 注释
for num in numbers:  # ④ 循环遍历,相当于Java的 for(int num : numbers)
    if num % 2 != 0:  # ⑤ 判断奇数(省去了Java的括号)
        odd_numbers.append(num)  # ⑥ 添加元素(像 list.add(num))

print ("the odd numbers are:", odd_numbers)  # ⑦ 打印结果(比System.out.println省事多了)

下面的代码区为JAVA的实现方法

// This code is translated from Python to Java
import java.util.ArrayList;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        List numbers = new ArrayList<>();  // ① Creating a list of numbers (like Java's ArrayList, but without generics)
        for (int i = 1; i <= 9; i++) {
            numbers.add(i);
        }
        
        List oddNumbers = new ArrayList<>();  // ② Preparing an empty list for odd numbers (similar to Java's new ArrayList<>())

        // ③ This comment is like Java's // comment
        for (int number : numbers) {  // ④ Looping through, equivalent to Java's for(int num : numbers)
            if (number % 2 != 0) {  // ⑤ Checking for odd numbers (skipping Java's parentheses)
                oddNumbers.add(number);  // ⑥ Adding element (like list.add(num))
            }
        }

        System.out.println("the odd numbers are: " + oddNumbers);  // ⑦ Printing the result (much simpler than System.out.println)
    }
}

Python与Java:编程美学的两重境界

在编程世界中,Python与Java如同水墨与工笔,演绎着截然不同的语法哲学。Python以动态类型和简洁语法著称,列表可承载万物,切片操作如诗行般优雅,一句[x**2 for x in range(10)]便能展开星辰大海;而Java坚守静态类型的严谨,ArrayList需明确定义,泛型约束如精密齿轮,每一行代码都需恪守契约。前者以缩进为律,用def轻启函数;后者以大括号为界,靠public static void郑重宣言。无论是“写意”还是“工笔”,两种语言在类型系统、代码结构和设计理念上的碰撞,恰是开发者探索效率与规范平衡的绝佳视角。

Java程序员一眼就能看出的差异点

Python特点

Java对比

举个栗子

动态类型

不用声明类型,直接写列表 = [元素]

Java得写List list = new ArrayList<>()

缩进即代码块

用4个空格代替花括号{}

Java必须用{}

包裹循环/条件体

简洁的循环语法

for num in numbers:

更接近英语表达

Java的for(int num : numbers)

稍显复杂

省分号

换行就是语句结束

Java必须用;

结尾

灵活的print

直接逗号分隔多个变量打印

Java需要+

拼接字符串


重点细节提醒(避坑指南)

  1. 缩进是命根子
    • Python靠缩进判断代码层级(像军事化管理)
    • 重要的事情说三遍!!!千万别混用Tab和空格Tab和空格Tab和空格!建议设置编辑器:1个Tab=4个空格
    • 如果缩进错乱,直接报IndentationError(比Java的编译错误更直接)
  1. 列表操作真香
# Python添加元素
odd_numbers.append(11)  # 直接append,不用考虑容量

// Java对比
oddNumbers.add(11);  // 虽然也简单,但得先声明List类型
  1. 条件判断更随意
if num % 2 != 0:  # 可以写成 if (num%2 !=0): 但括号非必须
  1. 注释小差别
# Python用井号注释单行
''' 多行注释用三引号 '''

// Java则是双斜杠
/* 多行注释 */


对比总结一下:Python代码量≈Java的1/3,但核心逻辑完全一致,就像把Java的模板代码都压缩了!

数字类型:比Java更省心的数学工具

# Python数字全家桶
a = 1000        # int(Python3不分int/long)
b = 1000.12     # float
c = 1000 + 12j  # complex(复数,Java没有原生支持)

Java对比表

特性

Python

Java

整数长度

自动扩展(不会溢出)

固定长度(int 32位,long 64位)

类型声明

直接赋值自动推断

必须显式声明(int/long)

复数支持

原生支持

需第三方库(如Apache Commons Math)

除法运算

/

真除法,//

整除

/

自动取整(两int相除)

避坑指南

  • Python3没有long类型,int自动处理大数
  • 想用Java式整除?用//操作符:
5 // 2   # 输出2(Java的 5/2 行为)
5 / 2    # 输出2.5(更符合数学直觉)

字符串:单双引号通吃的灵活派

# 三种字符串写法
s1 = '单引号'       # 普通字符串
s2 = u"Unicode字符串" # Python2需要u前缀,Python3默认就是
s3 = r"C:\temp\dir" # 原始字符串(正则/路径神器)

Java对比

特性

Python

Java

引号规则

单/双引号等价,三引号多行

必须双引号,多行需+

拼接

不可变性

同Java(修改即新建对象)

完全一致

原始字符串

r"..."

避免转义

无原生支持,需手动转义\\

编码处理

Python3默认UTF-8

需指定new String(bytes, "UTF-8")

经典场景

# 文件路径(Java要写双反斜杠)
path = r"C:\Users\Project\data.txt" 

# 正则表达式(避免转义地狱)
regex = r"\d+\.\d+"  # 匹配数字如3.14

这个真的对比JAVA 键值太爽了! 下面是对应的 java 代码

// This code snippet is a simple file path and regex definition in Java.

String filePath = "C:\\Users\\Project\\data.txt"; // 文件路径(Java要写双反斜杠)
String regexPattern = "\\d+\\.\\d+"; // 正则表达式(避免转义地狱)匹配数字如3.14

类型转换:更智能的自动升级

# 自动类型提升
x = 10 + 3.14  # int + float → float
y = 10 * (1 + 2j)  # int * complex → complex

# 显式转换
s = str(100)    # "100"(等同Java的Integer.toString())
num = int("42") # 42(类似Java的Integer.parseInt())

Python四大核心集合类型详解

1. 列表(list)
  • Java等效java.util.ArrayList(但Python列表更灵活)
  • 示例['apple', 'ball', 'ball']
  • 关键特性
    • 可变性:支持增删改操作(append(), remove(), insert()
    • 有序性:元素顺序被严格保留
    • 允许重复:可以包含相同值的多个元素
    • 异构存储[1, "two", 3.0, [4,5]] 是完全合法的
  • 典型操作
fruits = ['apple', 'banana']
fruits.append('cherry')       # 添加元素
fruits[1] = 'blueberry'       # 修改元素
sub_list = fruits[1:3]        # 切片操作
2. 元组(tuple)
  • Java等效:不可变的ArrayList(Java中没有直接对应)
  • 示例('apple', 'ball', 'ball')
  • 关键特性
    • 不可变性:创建后不能修改(内存更高效)
    • 有序性:元素顺序固定
    • 允许重复:类似列表
    • 作为字典键:因为不可变,可用作字典的键
  • 特殊语法
single_element_tuple = (42,)  # 必须加逗号
empty_tuple = ()
3. 字典(dict)
  • Java等效java.util.HashMap
  • 示例{'fruit': 'apple', 'toy': 'ball'}
  • 关键特性
    • 键值对存储:快速查找(O(1)时间复杂度)
    • 键不可变:键必须是不可变类型(字符串/数字/元组)
    • 无序性(Python 3.7前):现在保持插入顺序
  • 常用操作
inventory = {'apples': 5, 'oranges': 3}
inventory['bananas'] = 2      # 添加/修改
del inventory['oranges']      # 删除
keys = inventory.keys()       # 获取所有键
4. 集合(set)
  • Java等效java.util.HashSet
  • 示例{'apple', 'ball'}
  • 关键特性
    • 唯一性:自动去重
    • 无序性:元素没有固定顺序
    • 可变性:可增删元素(但有不可变的frozenset
    • 集合运算:支持并集(|)、交集(&)、差集(-)
  • 典型用法
primes = {2, 3, 5, 7}
primes.add(11)                # 添加元素
evens = {2, 4, 6, 8}
common = primes & evens       # 交集 {2}

关键差异对比表

特性

list

tuple

dict

set

可变性

✔️

✔️

✔️

有序性

✔️

✔️

✔️(Python 3.7+)

允许重复元素

✔️

✔️

键唯一

元素唯一

查找速度

O(n)

O(n)

O(1)

O(1)

内存效率

较低

较高

中等

中等


设计哲学解析

  1. 内置类型的优势
    • 无需导入即可使用(如list() vs Java的new ArrayList<>()
    • 语法糖支持:[]创建列表,{}创建字典/集合
    • 运算符重载:+连接列表,in判断成员存在
  1. 不可变性的价值
    • 线程安全:元组可以在多线程中安全共享
    • 哈希能力:元组可用作字典键
    • 数据完整性:保证数据不被意外修改
  1. 动态类型的体现
mixed_list = [
    42,                        # 整数
    "hello",                   # 字符串
    ["nested", "list"],        # 嵌套列表
    {"key": "value"},          # 字典
    lambda x: x**2             # 函数对象
]

这种灵活性虽然强大,但也需要开发者自行维护类型一致性


使用场景建议

  • 需要修改数据 → 选择list
  • 数据字典/快速查找 → 选择dict
  • 保证数据不被修改 → 选择tuple
  • 去重/集合运算 → 选择set
  • 配置数据 → 元组存储不可变配置参数
  • 缓存数据 → 字典实现快速键值查找
  • 数据流水线 → 列表处理可变数据流

理解这些集合类型的特性和适用场景,是写出高效Python代码的基础。它们的组合使用(如字典中嵌套列表)可以构建非常复杂的数据结构,同时保持代码的简洁性。

下面特意说一个 Python的 语法糖

  1. 嵌套推导式
matrix = [[1,2,3], [4,5,6], [7,8,9]]
flatten = [num for row in matrix for num in row]  # [1,2,3,4,5,6,7,8,9]

等同于下面代码

matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
flatten = []
for row in matrix:
    for num in row:
        flatten.append(num)
print(flatten)  # [1, 2, 3, 4, 5, 6, 7, 8, 9]

非常有意思吧。

有问题可以发邮件给我:[email protected]

你可能感兴趣的:(JAVA工程师从0开始学AI,python,java,windows)