0.2 语法与基础类型

概述

你已经熟练掌握了 JavaScript 的语法:大括号块、let/const===、模板字符串等。Python 的语法看起来更"干净"——它用缩进代替大括号、几乎不需要分号、没有 let/const。这一章把这些基础语法的差异一次性讲清楚,让你写 Python 时不至于被"没有大括号"卡住。

JS/TS ↔ Python 对照表

概念

JavaScript

Python

说明

代码块

{ ... } 大括号

缩进(4 空格)

Python 用缩进划分代码块

语句结尾

分号 ;(可选)

换行(分号极少用)

Python 基本不需要分号

变量声明

let / const / var

直接赋值 x = 1

无声明关键字

常量

const

约定大写 MAX = 10

无真正的常量,靠约定

整数

Number(全 64 位浮点)

int(任意精度)

Python 整数不会溢出

浮点数

Number

float

都是 IEEE 754 双精度

字符串

'...' / "..."

'...' / "..."(等价)

单双引号无区别

字符串插值

`...${x}...`

f"...{x}..." f-string

语法不同,功能一致

布尔值

true / false

True / False(大写)

注意大小写

空值

null / undefined

None

Python 只有一个空值

条件判断

if / else if / else

if / elif / else

elif 不是 else if

三元表达式

a ? b : c

b if a else c

顺序相反

逻辑与

&&

and

英文单词

逻辑或

||

or

英文单词

逻辑非

!

not

英文单词

相等比较

==(宽松)/ ===(严格)

==(按值,无 ===

Python 没有 ===

类型判断

typeof x

type(x)

用法不同

注释

// 单行、/* */ 多行

# 单行、""" """ 多行字符串

# 对标 //

循环(遍历)

for (const x of arr)

for x in seq:

for...in 语法完全不同

while 循环

while (cond) {}

while cond:

去掉括号加冒号

++/--

支持

不支持

x += 1

核心概念

1. 缩进代替大括号

你已经习惯用 {} 划定作用域。Python 用缩进层级来划分代码块,缩进是有语义的(不是可选的排版习惯)。

if (age > 18) {
  console.log("成年");
} else {
  console.log("未成年");
}
if age > 18:
    print("成年")       # 缩进 4 空格,属于 if 块
else:
    print("未成年")     # 属于 else 块
  • 冒号 : 表示"下面是一个新代码块"。

  • 同一块内的缩进必须一致(推荐 4 个空格,别混用 Tab)。

  • 类比:{ 相当于 :} 相当于"缩进退回一层"。

2. 变量声明:没有 let/const

Python 没有 letconstvar,直接赋值即声明:

let count = 0;
const name = "Alice";
count = 0
name = "Alice"
  • 没有真正的"常量",社区约定:全大写变量名表示"请不要改",如 MAX_RETRIES = 5

  • 变量可以随时重新赋值且类型可变(动态类型,和 JS 一样)。

3. 数字:int / float

JS 里所有数字都是 64 位浮点 Number(所以 0.1 + 0.2 !== 0.3)。Python 分两类:

const a = 42;          // Number(其实内部是浮点)
const b = 3.14;
console.log(Number.MAX_SAFE_INTEGER); // 9007199254740991
a = 42          # int,任意精度,永不溢出
b = 3.14        # float,IEEE 754 双精度
print(2 ** 100) # 1267650600228229401496703205376,精确!
  • Python 的 int任意精度2 ** 100 不会溢出、不会丢失精度。

  • 除法 / 总是返回 float5 / 2 == 2.5);整数除法用 //5 // 2 == 2)。

  • % 取余、** 幂运算和 JS 语义类似,但 ** 是 Python 的幂(JS 用 Math.pow**)。

4. 字符串与 f-string

JS 的模板字符串在 Python 里叫 f-string(格式化字符串):

const name = "Alice";
const age = 30;
console.log(`${name} is ${age} years old`);
name = "Alice"
age = 30
print(f"{name} is {age} years old")
  • f-string 前缀是 f,花括号内可以写任意表达式:f"{a + b}"

  • 单引号和双引号在 Python 中完全等价,多行字符串用三引号 """..."""

  • .format() 是旧式写法,新代码直接用 f-string。

5. 布尔值大写、None

  • JS 的 true / false → Python 的 True / False(首字母大写)。

  • JS 的 null / undefined → Python 只有一个 None

  • 假值判断:Python 中 NoneFalse00.0、空字符串 ""、空容器 []/{}/() 都为假,其余为真。和 JS 的 falsy 概念一致,但 Python 的空对象 {}[] 也是假的(JS 里 []{} 是 truthy)。

6. if / elif / else

if (score >= 90) {
  console.log("A");
} else if (score >= 80) {
  console.log("B");
} else {
  console.log("C");
}
if score >= 90:
    print("A")
elif score >= 80:     # 注意是 elif,不是 else if
    print("B")
else:
    print("C")
  • 条件表达式不需要括号(写了也行,但官方风格不写)。

  • else if 写作 elif

7. for…in 遍历

JS 的 for...of 遍历元素,Python 的 for...in 也遍历元素(不是索引!):

for (const item of ["a", "b", "c"]) {
  console.log(item);
}
for item in ["a", "b", "c"]:
    print(item)
  • 想要"带索引遍历"用 enumerate(见第 0.3 章)。

  • 想要"遍历 0 到 n-1"用 range(n)for i in range(5):

8. while 循环

let i = 0;
while (i < 5) {
  console.log(i);
  i++;
}
i = 0
while i < 5:
    print(i)
    i += 1        # 没有 i++

9. 三元表达式(顺序相反)

const result = age >= 18 ? "成年" : "未成年";
result = "成年" if age >= 18 else "未成年"
  • 语法是 值A if 条件 else 值B,真值在前,与 JS 的 条件 ? 真 : 假 顺序相反,注意别写反。

10. 逻辑运算符

JS

Python

&&

and

||

or

!

not

if (!isLoading && (isAdmin || isEditor)) { ... }
if not isLoading and (is_admin or is_editor):
    ...

11. == 与 === 的区别

JS 有 ==(宽松)和 ===(严格),Python 只有 ==,但它是"按值严格比较"(类型不同直接不等):

"5" == 5;   // true(宽松,会类型转换)
"5" === 5;  // false(严格)
"5" == 5   # False,Python 的 == 不隐式转换,等价于 JS 的 ===
  • Python 的 == 等价于 JS 的 ===(不做类型转换)。

  • 想判断"是否为同一个对象"(类似 JS 的引用相等)用 is

12. 注释

// 单行注释
/* 多行注释 */
# 单行注释
"""
多行说明(其实是多行字符串,
但常被当注释用)
"""

代码示例

综合对照:一个判断奇偶并打印的例子

// JS
function describe(n) {
  if (typeof n !== "number") return "不是数字";
  return n % 2 === 0 ? `${n} 是偶数` : `${n} 是奇数`;
}
console.log(describe(4)); // "4 是偶数"
# Python
def describe(n):
    if not isinstance(n, int):
        return "不是数字"
    return f"{n} 是偶数" if n % 2 == 0 else f"{n} 是奇数"

print(describe(4))  # "4 是偶数"

最佳实践

  • 缩进统一用 4 个空格,不要混用 Tab(用编辑器把 Tab 设成 4 空格)。

  • 布尔、None 记住大写:True / False / None

  • 字符串插值一律用 f-string,别用旧式 % 格式化或 .format()

  • 比较相等直接用 ==(它已经是严格比较),判断"是否同一对象"才用 is

  • 自增用 x += 1,忘掉 x++

  • 常量用全大写命名表达"别改我"的意图。

前端开发者常见陷阱

  1. 忘记冒号 :if x > 0 后面要加冒号,否则语法错误——这是 JS 开发者最高频的错误。

  2. 缩进不一致:复制粘贴代码后缩进乱了,直接 IndentationError

  3. else if:Python 是 elif,写 else if 会报错。

  4. ===:Python 没有 ===,直接 SyntaxError

  5. let / const:Python 不需要,直接赋值即可;反之 x = 1 在 JS 里是全局污染,在 Python 里是正常声明。

  6. 三元表达式写反a if cond else b,别写成 JS 的 cond ? a : b

  7. && || !:写成 and or not

  8. i++:不存在的语法,用 i += 1

  9. 空对象是真值还是假值:JS 里 [] 是 truthy,Python 里 [] 是 falsy。if []: 在 Python 中是 False

  10. 字符串不可变:和 JS 一样,但 Python 字符串拼接频繁时用 join,别用 += 循环拼接(性能差)。

总结

  • 缩进(4 空格)+ 冒号 : 取代了 JS 的大括号 {}

  • 没有 let/const/var,直接赋值;常量靠大写命名约定。

  • True/False/None 首字母大写,elif 不是 else if,逻辑用 and/or/not

  • Python 的 == 等价于 JS 的 ===,没有 === 这个符号。

  • f-string 就是 Python 的模板字符串,x if cond else y 是它的三元表达式(注意顺序)。