Python 笔记:给前端开发者的语法对照
- 1Python 笔记:给前端开发者的语法对照本文
这篇只记 JavaScript 开发者最容易误判的 Python 差异。默认你已经会写 JS,不重复解释变量、循环是什么。
先看结论
| 场景 | JavaScript | Python |
|---|---|---|
| 输出 | console.log(x) | print(x) |
| 字符串插值 | `${x}` | f"{x}" |
| 布尔值与空值 | true / false / null | True / False / None |
| 逻辑运算 | && || ! | and or not |
| 代码块 | { ... } | : + 缩进 |
| 遍历 | for (const x of a) | for x in a |
| 长度 | a.length | len(a) |
| 最后一个元素 | a.at(-1) | a[-1] |
| 字典/对象读取 | obj.key | d["key"] / d.get("key") |
| 函数定义 | function f() {} | def f(): |
| 实例引用 | this | self |
| 异常捕获 | catch (err) | except Error as err: |
| 变量声明 | let / const | 直接赋值,没有 const |
| 实例化 | new Person() | Person() |
| 包管理 | npm + node_modules | pip + venv |
变量与字符串
let name = "Mia";const age = 20;
console.log(`${name} is ${age}`);name = "Mia"age = 20
print(f"{name} is {age}")Python 没有 let / const。变量只是名字,重新赋值就是重新绑定:
name = "Mia"name = "Leo"约定使用 snake_case,常量通常写全大写:
MAX_RETRY = 3字符串拼接不同类型会报错,需要显式转换:
age = 20print("Age is " + str(age))代码块与条件
JavaScript 靠花括号,Python 靠缩进。缩进不是格式,是语法。
if (age >= 18) { console.log("Adult");} else if (age >= 12) { console.log("Teenager");} else { console.log("Child");}if age >= 18: print("Adult")elif age >= 12: print("Teenager")else: print("Child")另一个容易忽略的差异:Python 的条件和循环不会创建块级作用域。
if True: level = "adult"
print(level) # adultJS 里 let level 写在 if 内,块外不能访问;Python 可以。
数字、布尔值和空值
| 写法 | JavaScript | Python |
|---|---|---|
| 除法 | 7 / 2 → 3.5 | 7 / 2 → 3.5 |
| 整除 | Math.floor(7 / 2) | 7 // 2 |
| 乘方 | 2 ** 10 | 2 ** 10 |
| 类型 | typeof 2 | type(2) |
| 相等 | 优先用 === | 用 == |
| 逻辑 | && || ! | and or not |
| 空值 | undefined / null | None |
| 布尔 | true / false | True / False |
Python 的 == 比较值,is 比较是不是同一个对象。不要拿 is 代替 ==。
2 == "2" # False2 is 2 # TrueNone is None # TruePython 和 JS 的真值判断也不同:
bool([]) # Falsebool({}) # Falsebool("") # Falsebool(0) # Falsebool(None) # FalseJS 中空数组和空对象都是真值,这是最常见的迁移坑之一。
列表 vs 数组
| 操作 | JavaScript | Python |
|---|---|---|
| 追加 | arr.push(x) | arr.append(x) |
| 长度 | arr.length | len(arr) |
| 最后一个 | arr.at(-1) | arr[-1] |
| 切片 | arr.slice(1, 3) | arr[1:3] |
| 包含 | arr.includes(x) | x in arr |
| 删除 | arr.splice() | del arr[i] / pop() |
| 排序 | arr.sort() 原地修改 | sorted(arr) 返回新列表 |
nums = [3, 10, 4, 1, 5]
nums.append(9)print(len(nums)) # 6print(nums[-1]) # 9print(nums[1:3]) # [10, 4]print(4 in nums) # Trueprint(sorted(nums)) # [1, 3, 4, 5, 9, 10]sorted() 返回新列表,nums.sort() 才是原地排序:
result = sorted(nums)nums.sort()列表推导式可以直接替代 filter + map:
result = [n * 2 for n in nums if n > 3]执行逻辑是:先过滤 n > 3,再把满足条件的 n 变成 n * 2。
字典 vs 对象
| 操作 | JavaScript | Python |
|---|---|---|
| 读取 | book.title | book["title"] |
| 缺失键 | 返回 undefined | 抛 KeyError |
| 安全读取 | book.rating ?? 0 | book.get("rating", 0) |
| 遍历 | Object.entries(book) | book.items() |
book = {"title": "Dune", "year": 1965}
print(book["title"]) # Duneprint(book.get("rating", 0)) # 0
for key, value in book.items(): print(key, value)注意:get() 的默认值只在键不存在时生效。键存在但值是 None,仍然会返回 None。
循环
for (const fruit of fruits) { console.log(fruit);}for fruit in fruits: print(fruit)需要索引时,Python 用 enumerate():
for index, fruit in enumerate(fruits): print(index, fruit)数数字用 range(),右边界不包含:
for i in range(5): print(i) # 0 1 2 3 4Python 没有 i++:
count = 0while count < 5: count += 1函数
function greet(name, greeting = "Hi") { return `${greeting}, ${name}!`;}
greet("Mia");greet("Mia", "Hello");def greet(name, greeting="Hi"): return f"{greeting}, {name}!"
greet("Mia")greet("Mia", "Hello")greet(name="Mia", greeting="Hello")关键差异:
- Python 支持关键字参数,JS 通常用对象参数模拟。
- Python 缺少必填参数会直接抛
TypeError;JS 可能得到undefined。 - Python 函数没有
return时返回None。 lambda只能写单个表达式,复杂逻辑应写普通函数。
排序函数的写法也不同:
words = ["banana", "fig", "apple"]
sorted(words, key=len) # 按长度sorted(words, key=lambda w: w[-1]) # 按最后一个字符类
class Person { constructor(name) { this.name = name; }
speak() { return `${this.name} is speaking`; }}
const person = new Person("Mia");class Person: def __init__(self, name): self.name = name
def speak(self): return f"{self.name} is speaking"
person = Person("Mia")记住三点:构造方法叫 __init__,实例方法第一个参数是 self,创建实例不用 new。
异常处理
try { const data = JSON.parse(text); console.log(data.age);} catch (error) { console.log(error.message);}import json
try: data = json.loads(text) print(data["age"])except json.JSONDecodeError as error: print(error)主动抛错:
throw new Error("Invalid data");raise ValueError("Invalid data")不要捕获所有异常后什么都不做。至少记录错误,或只捕获明确的异常类型。
异步
JS 中 async 函数由运行时调度;Python 中协程需要事件循环执行。
async function main() { const data = await fetchData();}import asyncio
async def main(): data = await fetch_data()
asyncio.run(main())调用 main() 只是创建协程,不会自动执行;asyncio.run() 才会启动事件循环。
运行、依赖与模块
| 场景 | JavaScript | Python |
|---|---|---|
| 运行文件 | node app.js | python app.py |
| 安装依赖 | npm install | pip install |
| 项目配置 | package.json | requirements.txt / pyproject.toml |
| 依赖位置 | 当前项目 node_modules | 默认全局,项目通常使用 venv |
| 导入 | import x from "./x.js" | import x / from x import y |
Python 项目建议始终创建虚拟环境:
python -m venv .venv
# Windows PowerShell.\.venv\Scripts\Activate.ps1
# macOS / Linuxsource .venv/bin/activate激活后再安装依赖,避免污染系统 Python:
pip install requestspip freeze > requirements.txt最容易踩的坑
-
空数组不是“有值”:Python 的
[]是假值,JS 的[]是真值。 -
数组排序语义不同:JS
sort()默认按字符串比较且原地修改;Pythonsorted()返回新列表。 -
对象缺键不返回 undefined:Python 字典缺键会抛
KeyError,不确定时用get()。 -
没有
++:用i += 1。 -
不要用可变对象做默认参数:
def add(item, items=None):if items is None:items = []items.append(item)return items -
赋值不等于复制:
a = [1, 2]b = ab.append(3)print(a) # [1, 2, 3]需要副本时用
b = a.copy()或b = a[:]。 -
缩进错误就是语法错误:不要混用 Tab 和空格。
-
None不是undefined:Python 没有undefined,缺值统一用None。
支持与分享
如果这篇文章对你有帮助,欢迎分享给更多人或打赏支持!






























































































































































