PyPyBridge

语法速通:关掉脑内的 Java 编译器

没有声明、没有分号、没有大括号,缩进就是语法。把 Java 的仪式感全部删掉。

15 分钟 · 右栏代码可点击「运行」


变量:赋值即定义,类型标注只是提示

Java
1final String name = "Ada";
2int n = 42;
3long big = 10_000_000L;
4var scores = new ArrayList<Integer>();
Python
1# 没有 final,常量靠约定(全大写)
2name = "Ada"
3n = 42
4# 整数没有溢出,不区分 int/long
5big = 10_000_000
6# 标注可选,运行时不强制
7scores: list[int] = []
  • Python 是强类型但动态类型:1 + "a" 会报错,和 Java 一样;区别是错误发生在运行时
  • NAMES = [] 全大写是「这是常量」的社会约定,配合 typing.Final 可以让 mypy 帮你守护。

控制流:缩进即语法,没有 switch(用 match)

Java
1for (int i = 0; i < 3; i++) {
2 if (i % 2 == 0) {
3 System.out.println("even");
4 } else {
5 System.out.println("odd");
6 }
7}
Python
1for i in range(3): # 没有 i++,用 i += 1
2 if i % 2 == 0:
3 print("even")
4 else:
5 print("odd")
6
7# Java 14+ 的 switch 表达式,Python 3.10+ 叫 match
8command = "start"
9match command:
10 case "start": print("starting")
11 case _: print("unknown")
  • 条件不用括号,冒号必写。冒号是 Java 的 {
  • 没有 ?: 三元,写作 x = a if cond else b
  • 逻辑运算用 and / or / not,不是 && / || / !

字符串:f-string 取代一切拼接

Java
1String name = "Ada";
2String msg = String.format(
3 "Hi %s, total is %.2f", name, 19.8 * 1.08);
4String joined = String.join(",", List.of("a", "b"));
Python
1name = "Ada"
2msg = f"Hi {name}, total is {19.8 * 1.08:.2f}"
3joined = ",".join(["a", "b"]) # 注意:是分隔符.join(列表)
  • f-string 里可以放任意表达式,包括函数调用和格式说明 :.2f。新代码里不应该再出现 + 拼接。
  • 字符串不可变,这点和 Java 一致;拼接大字符串用 join 而不是 +=(见陷阱清单 P08)。

null → None,== 与 is

Java
1String s = null;
2if (s == null) {
3 s = "default";
4}
5// Java 的 == 对引用比地址,equals 比内容
Python
1s = None
2if s is None: # 判空惯例:is None
3 s = "default"
4
5# == 比内容(相当于 equals),is 比身份(同一对象)
6# == 相当于 Java 的 equals,is 相当于 Java 的 ==
  • 只有 None,没有 undefined。判断惯例永远写 x is None / x is not None

练一练

这张卡的示例代码已在游乐场中备好,改一改再运行。

在游乐场中打开