语法速通:关掉脑内的 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 = 424# 整数没有溢出,不区分 int/long5big = 10_000_0006# 标注可选,运行时不强制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 += 12 if i % 2 == 0:3 print("even")4 else:5 print("odd")67# Java 14+ 的 switch 表达式,Python 3.10+ 叫 match8command = "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 = None2if s is None: # 判空惯例:is None3 s = "default"45# == 比内容(相当于 equals),is 比身份(同一对象)6# == 相当于 Java 的 equals,is 相当于 Java 的 ==
- 只有
None,没有 undefined。判断惯例永远写x is None/x is not None。
练一练
这张卡的示例代码已在游乐场中备好,改一改再运行。