Python 笔记:给前端开发者的语法对照

1235 字
6 分钟
Python 笔记:给前端开发者的语法对照
  1. 1Python 笔记:给前端开发者的语法对照本文

这篇只记 JavaScript 开发者最容易误判的 Python 差异。默认你已经会写 JS,不重复解释变量、循环是什么。

先看结论#

场景JavaScriptPython
输出console.log(x)print(x)
字符串插值`${x}`f"{x}"
布尔值与空值true / false / nullTrue / False / None
逻辑运算&& || !and or not
代码块{ ... }: + 缩进
遍历for (const x of a)for x in a
长度a.lengthlen(a)
最后一个元素a.at(-1)a[-1]
字典/对象读取obj.keyd["key"] / d.get("key")
函数定义function f() {}def f():
实例引用thisself
异常捕获catch (err)except Error as err:
变量声明let / const直接赋值,没有 const
实例化new Person()Person()
包管理npm + node_modulespip + 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 = 20
print("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) # adult

JS 里 let level 写在 if 内,块外不能访问;Python 可以。

数字、布尔值和空值#

写法JavaScriptPython
除法7 / 2 → 3.57 / 2 → 3.5
整除Math.floor(7 / 2)7 // 2
乘方2 ** 102 ** 10
类型typeof 2type(2)
相等优先用 ===用 ==
逻辑&& || !and or not
空值undefined / nullNone
布尔true / falseTrue / False

Python 的 == 比较值,is 比较是不是同一个对象。不要拿 is 代替 ==。

2 == "2" # False
2 is 2 # True
None is None # True

Python 和 JS 的真值判断也不同:

bool([]) # False
bool({}) # False
bool("") # False
bool(0) # False
bool(None) # False

JS 中空数组和空对象都是真值,这是最常见的迁移坑之一。

列表 vs 数组#

操作JavaScriptPython
追加arr.push(x)arr.append(x)
长度arr.lengthlen(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)) # 6
print(nums[-1]) # 9
print(nums[1:3]) # [10, 4]
print(4 in nums) # True
print(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 对象#

操作JavaScriptPython
读取book.titlebook["title"]
缺失键返回 undefined抛 KeyError
安全读取book.rating ?? 0book.get("rating", 0)
遍历Object.entries(book)book.items()
book = {"title": "Dune", "year": 1965}
print(book["title"]) # Dune
print(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 4

Python 没有 i++:

count = 0
while 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() 才会启动事件循环。

运行、依赖与模块#

场景JavaScriptPython
运行文件node app.jspython app.py
安装依赖npm installpip install
项目配置package.jsonrequirements.txt / pyproject.toml
依赖位置当前项目 node_modules默认全局,项目通常使用 venv
导入import x from "./x.js"import x / from x import y

Python 项目建议始终创建虚拟环境:

Terminal window
python -m venv .venv
# Windows PowerShell
.\.venv\Scripts\Activate.ps1
# macOS / Linux
source .venv/bin/activate

激活后再安装依赖,避免污染系统 Python:

Terminal window
pip install requests
pip freeze > requirements.txt

最容易踩的坑#

  1. 空数组不是“有值”:Python 的 [] 是假值,JS 的 [] 是真值。

  2. 数组排序语义不同:JS sort() 默认按字符串比较且原地修改;Python sorted() 返回新列表。

  3. 对象缺键不返回 undefined:Python 字典缺键会抛 KeyError,不确定时用 get()。

  4. 没有 ++:用 i += 1。

  5. 不要用可变对象做默认参数:

    def add(item, items=None):
    if items is None:
    items = []
    items.append(item)
    return items
  6. 赋值不等于复制:

    a = [1, 2]
    b = a
    b.append(3)
    print(a) # [1, 2, 3]

    需要副本时用 b = a.copy() 或 b = a[:]。

  7. 缩进错误就是语法错误:不要混用 Tab 和空格。

  8. None 不是 undefined:Python 没有 undefined,缺值统一用 None。

支持与分享

如果这篇文章对你有帮助,欢迎分享给更多人或打赏支持!

打赏
Python 笔记:给前端开发者的语法对照
https://blog.ddlyt.top/posts/2026/1028/
作者
兜兜里有糖
发布于
2026-10-28
许可协议
CC BY-NC-ND 4.0

评论区

Profile Image of the Author
兜兜里有糖
越努力,越幸运。
公告
欢迎来到 DBlog,这里记录前端开发、技术学习和一些实用工具。
分类
标签
最新动态
站点统计
文章
20
分类
2
标签
18
总字数
12,351
运行时长
0 天
最后活动
0 天前
访问次数
--
站点信息
构建平台
EdgeOne Pages
博客版本
Firefly v2.0.0
文章许可
CC BY-NC-ND 4.0
文章目录