从 JavaScript 的角度理解 Python 语法
1. 前言从 JavaScript 的角度学习 Python你会发现两者有很多相似之处都是动态、解释型、多范式语言但语法和设计哲学上也有显著差异。下面我以一名 JavaScript 开发者的视角带你快速理解 Python 的核心语法和概念相信通过本文的学习你就算入门 Python 了。2. 核心差异速览特性JavaScriptPython代码块{ }缩进通常4空格语句结束;可选换行布尔值true/falseTrue/False空值null/undefinedNone逻辑运算两个竖线!andornot数组Arraylist对象Objectdict当前实例thisself方法第一个参数构造函数constructor()__init__()继承extendsclass Child(Parent):3. 变量声明JavaScript 使用var、let、const声明变量而 Python 直接赋值即可无需关键字。Python 变量的作用域由所在代码块函数、模块决定没有块级作用域。// JavaScript - 需要声明关键字 const name Alice // 常量不可重新赋值 let age 25 // 块作用域变量 var city Beijing // 函数作用域变量旧式# Python - 直接赋值动态类型 name Alice # 变量无需关键字作用域由所在代码块决定 age 25 city Beijing # 约定常量全大写但实际仍可修改如 PI 3.144. 代码块与缩进规则Python 使用缩进通常4个空格表示代码块不再使用花括号{}。缩进必须严格一致不能混用空格和制表符。// JavaScript - 使用花括号 {} 界定代码块 if (score 90) { let grade A; console.log(优秀); } else { let grade B; console.log(加油); } // 花括号内缩进仅为可读性语法不强制# Python - 使用缩进表示代码块 if score 90: grade A # 缩进内的代码属于if块 print(优秀) else: grade B print(加油) # 缩进必须一致不能混用空格和制表符4. 布尔值、空值与逻辑运算Python 的布尔值首字母大写True/False空值只有None没有undefined。逻辑运算符使用英文单词and、or、not。and并且两个条件都为 Trueor或者任意一个为 Truenot取反True 变 FalseFalse 变 True// JavaScript - 布尔小写空值有null/undefined let isDone true; // 或 false let empty null; // 主动赋空 let notDefined; // undefined if (isDone !empty) { // 逻辑运算符 || ! console.log(执行); }# Python - 布尔首字母大写空值只有None is_done True # 或 False empty None # 唯一空值 # 变量必须赋值后才能使用无undefined if is_done and not empty: # 逻辑运算符 and or not print(执行)5. 数组与对象 / 列表与字典Python 的列表list对应 JavaScript 的数组字典dict对应 JavaScript 的对象。但方法名称和访问方式有所不同。// JavaScript - 数组和对象 let arr [1, 2, 3]; arr.push(4); // 添加元素 let obj { name: Alice, age: 25 }; obj.city Beijing; // 添加属性 console.log(obj.name); // 点语法访问# Python - 列表list和字典dict arr [1, 2, 3] arr.append(4) # 添加元素 obj {name: Alice, age: 25} obj[city] Beijing # 字典键访问必须用中括号 # 点语法不适用于字典只能用 obj[key] print(obj[name])6. 函数定义Python 使用def关键字定义函数支持默认参数、可变参数*args、**kwargs。匿名函数用lambda表达式但只能写单行。# Python - def 关键字 def add(a, b): return a b multiply lambda a, b: a * b # lambda 仅限单行表达式 # 可变参数示例 def log(*args, **kwargs): print(args, kwargs)7. 类定义构造函数、继承Python 的类使用class关键字构造函数为__init__所有实例方法第一个参数必须是self相当于 JavaScript 的this。继承时在类名后加括号指定父类。# Python - classself 显式 from hashlib import new class Person: def __init__(self, name, age): # 构造函数 self.name name self.age age def greet(self): # 方法必须带 self return fHi, Im {self.name} class Student(Person): # 继承 def __init__(self, name, age, grade): super().__init__(name, age) # 调用父类构造函数 self.grade grade res Student(zs, 18, 男) print(res.greet())8. 控制流if / forPython 的if条件语句不需要括号但条件后必须跟冒号。for循环直接迭代可迭代对象类似 JavaScript 的for...of。range()用于生成数字序列。# Python - if 和 for x 10 arr [1, 2, 3, 4, 5] if x 0: print(正数) else: print(非正数) for i in range(5): # range 生成数字序列0-4 print(i) for item in arr: # 直接遍历可迭代对象 print(item)9. 异常处理Python 使用try/except捕获异常可以指定异常类型并支持else子句无异常时执行。finally无论是否异常都会执行。// JavaScript - try/catch try { let result 10 / 0; if (!isFinite(result)) throw new Error(除零错误); } catch (error) { console.log(error.message); } finally { console.log(清理工作); }# Python - try/except try: result 10 / 0 except ZeroDivisionError as e: print(除零错误, e) except Exception as e: print(其他错误, e) else: print(没有异常发生) finally: print(清理工作)10. 异步编程Python 通过asyncio库和async/await实现异步编程需要显式运行事件循环。与 JavaScript 不同Python 的异步是协作式多任务需要主动让出控制权如await asyncio.sleep()。// JavaScript - async/await async function fetchData() { let response await fetch(url); let data await response.json(); return data; } fetchData().then(console.log);# Python - asyncio import asyncio async def fetch_data(): await asyncio.sleep(1) # 模拟IO return data async def main(): result await fetch_data() print(result) asyncio.run(main()) # 启动事件循环11. 模块和导入导出JavaScriptES6使用import/export管理模块而 Python 使用import和from ... import ...。每个 Python 文件都是一个模块文件夹可以通过包含__init__.py成为包Python 3.3 可省略但推荐保留math_my.py模块PI 3.14159 def add(a, b): return a b class Calculator: passmain 导入模块import math_my print(math_my.PI) print(math_my.add(1, 2))只把 PI 和 add 导入当前作用域from math_my import PI, add print(PI) print(add(1, 2))Python 的import会执行整个模块导入后的名称通过模块名访问如math.PI。可以使用as别名import math as m或from math import PI as pi。没有默认导出的概念但可以通过__all__控制from module import *的行为。以上是从 JavaScript 角度快速理解 Python 语法的核心要点。掌握这些差异后你就可以开始编写 Python 代码并逐步熟悉更多高级特性如装饰器、生成器等。两种语言各有千秋灵活运用会让你的编程之路更加宽广。附一为什么有 \ 在代码后面这个\是 Python 的行续接符line continuation character表示当前代码行还没结束下一行是它的延续。例如client lark.Client.builder() \ .app_id(APP_ID) \ .app_secret(APP_SECRET) \ .log_level(LogLevel.INFO) \ .build()如果不加\Python 会把每一行视为独立语句导致语法错误。加了\后Python 知道这几行实际上是同一条语句。用括号包裹的方式更 Pythonic不需要\例如client (lark.Client.builder() .app_id(APP_ID) .app_secret(APP_SECRET) .log_level(LogLevel.INFO) .build())两者功能完全一致\写法在 Builder 模式中也很常见只是要注意\后面不能有空格或注释否则会报错。我们更推荐使用括号包裹的方式。附二__init__.py文件在 Python 中的作用1. 标记目录为 Python 包在 Python 中一个普通的文件夹如果想要被当作包来导入必须包含一个__init__.py文件在 Python 3.3 之前这是强制性的。例如假设你有这样的目录结构mypackage/ __init__.py module1.py module2.py当你执行import mypackage或from mypackage import module1时Python 会识别出mypackage是一个包因为它下面有__init__.py。如果没有这个文件Python 就会把该文件夹当作一个普通的目录无法从中导入模块除非使用命名空间包见后文。2. 执行包的初始化代码当包被首次导入时__init__.py文件中的代码会被自动执行。你可以在其中放置包级别的初始化逻辑例如设置包级别的全局变量导入包内其他子模块或子包配置日志检查运行环境、版本等例如在mypackage/__init__.py中# mypackage/__init__.py print(Initializing mypackage) VERSION 1.0.0 from . import module1 from .module2 import some_function这样当用户import mypackage时会看到打印信息并且可以直接通过mypackage.some_function调用module2中的函数而不必写mypackage.module2.some_function。3. 控制包的导入行为定义__all__在__init__.py中定义一个名为__all__的列表可以指定当用户使用from package import *时哪些子模块会被导入。例如# mypackage/__init__.py __all__ [module1, module2]那么from mypackage import *只会导入module1和module2其他未列出的模块则不会被导入。延迟导入有时为了避免循环导入或提高启动速度可以在__init__.py中使用函数或属性来延迟导入子模块# mypackage/__init__.py def get_module1(): from . import module1 return module14. 简化导入路径通过__init__.py将子模块中的对象“提升”到包级别可以让用户使用更简洁的导入语句。例如# mypackage/__init__.py from .module1 import MyClass from .module2 import my_function之后用户可以直接写from mypackage import MyClass, my_function5. Python 3.3 的变化命名空间包从 Python 3.3 开始引入了隐式命名空间包PEP 420。如果一个目录下没有__init__.py但它是 Python 路径上的一个有效目录并且包含其他 Python 模块或子目录那么它会被视为一个命名空间包namespace package。命名空间包允许将多个目录合并成一个逻辑上的包常用于将大型项目拆分到多个代码仓库。重要区别传统包regular package必须包含__init__.py可以有初始化代码。命名空间包不需要__init__.py但不能包含任何初始化代码因为它只是多个目录的逻辑合并。因此如果你需要执行包的初始化代码或者想要明确地将一个目录标记为包尤其是为了兼容旧版 Python仍然建议保留__init__.py。理解__init__.py的作用有助于你更好地理解 Python 项目。总结是不是通过对比学习突然发现 Python 其实是一门非常简单的语言呢加油吧前端们。在 AI 时代掌握多一门语言很重要并且说 Python 的是 AI 的原生语言也不为过。我们可以在各种前端技术群里看到很多前端觉得学习 Python 太麻烦了所以还继续学习 Node.js当然如果你是一名 Node.js 专家级前端那么你继续学习使用 Node.js 是没有什么问题的。如果你只是一名普通的前端只想找一份工作那么在这个由后端统治的世界里即便现在有很多以 Node.js 为主的产品比如 OpenClaw、Claude Code但专门的 Node.js 岗位依然少得可怜。尤其是国内基本没有大一点的公司会把 Node.js 作为核心开发语言。当然如果你是所谓的独立开发者那么无论是 Node.js 还是 Python 还是 Java 甚至 PHP 都无所谓了。但从打工人找工作的角度看就不一样了。

相关新闻

久坐党、运动人放松好物|低敏草本舒缓贴,贴一天也舒服

久坐党、运动人放松好物|低敏草本舒缓贴,贴一天也舒服

长期伏案办公、经常健身锻炼,肩颈、四肢很容易出现紧绷沉重感,很多人会选择草本贴敷做日常放松。试过不少传统贴敷产品,要么闷热闷肤、撕完满是胶印,要么气味刺鼻不适合办公室使用。今天实测一款全家通用的名氏草本舒缓贴&#xf…

2026/6/26 6:47:52阅读更多 →
vulnhub靶场From SQL injection to Shell

vulnhub靶场From SQL injection to Shell

一、概括 通过基础潘顿和推测网页存在sql注入漏洞验证存在漏洞利用sql注入获得数据库中敏感数据,登录到网页管理员页面发现存在文件上传漏洞利用文件上传漏洞,获取服务器的信息 二、通关过程 nmap获得靶机访问地址通过靶机的mac地址和探测结果&#xff0…

2026/6/26 6:42:52阅读更多 →
并查集的典型应用:统计省份数量

并查集的典型应用:统计省份数量

题目来源:https://leetcode.com/problems/number-of-provinces/description/ 有 n 个城市,其中一些彼此直接相连,另一些则没有直接相连。如果城市 a 与城市 b 直接相连,且城市 b 与城市 c 直接相连,那么城市 a 与城市 …

2026/6/26 6:42:52阅读更多 →
低成本MMX多材料3D打印换色方案设计与优化

低成本MMX多材料3D打印换色方案设计与优化

1. MMX换色机构概述与核心优势 MMX(Multi-Material Extruder)是一种基于舵机切换的3D打印多材料换色方案。相比市面上主流的兔子换色系统,这套方案最大的特点就是结构简单、成本低廉。我自己组装下来总成本控制在150元左右,如果用…

2026/6/26 14:46:31阅读更多 →
3分钟完成Windows与Office永久激活:KMS_VL_ALL_AIO智能激活指南

3分钟完成Windows与Office永久激活:KMS_VL_ALL_AIO智能激活指南

3分钟完成Windows与Office永久激活:KMS_VL_ALL_AIO智能激活指南 【免费下载链接】KMS_VL_ALL_AIO Smart Activation Script 项目地址: https://gitcode.com/gh_mirrors/km/KMS_VL_ALL_AIO 还在为Windows和Office的激活弹窗烦恼吗?KMS_VL_ALL_AIO智…

2026/6/26 14:46:31阅读更多 →
生物质锅炉在制药企业中的应用与环境影响分析

生物质锅炉在制药企业中的应用与环境影响分析

2026年4月,辽源市生态环境局东辽县分局出具了吉林省鑫辉药业有限公司生物质锅炉建设项目的环评批复文件。该项目为制药企业能源基础设施升级提供了典型案例。吉林鑫辉药业一、项目概况该项目为扩建项目,建设地点位于东辽县渭津镇尚义村。主要建设内容包括…

2026/6/26 14:46:31阅读更多 →
【稀缺首发】VMware官方未公开的OVF导出隐藏参数大全:--skipManifest、--noSSLVerify等8个高危但高效的调试开关

【稀缺首发】VMware官方未公开的OVF导出隐藏参数大全:--skipManifest、--noSSLVerify等8个高危但高效的调试开关

更多请点击: https://intelliparadigm.com 第一章:OVF导出隐藏参数的发现背景与风险认知 OVF(Open Virtualization Format)作为虚拟机标准化分发格式,被广泛应用于vSphere、VirtualBox、OVirt等主流平台。然而&#x…

2026/6/26 14:46:31阅读更多 →
从vSphere到开源替代:一位CTO亲历的6个月迁移实战(含Kubernetes+OpenZiti平滑过渡路径)

从vSphere到开源替代:一位CTO亲历的6个月迁移实战(含Kubernetes+OpenZiti平滑过渡路径)

更多请点击: https://kaifayun.com 第一章:VMware博通收购后的战略转向与生态剧变 博通于2023年11月完成对VMware的收购,标志着企业虚拟化领域进入以“精简、集成、订阅优先”为内核的新周期。此次整合并非简单品牌延续,而是系统…

2026/6/26 14:46:31阅读更多 →
ExifToolGUI:免费开源图片元数据批量编辑终极指南

ExifToolGUI:免费开源图片元数据批量编辑终极指南

ExifToolGUI:免费开源图片元数据批量编辑终极指南 【免费下载链接】ExifToolGui A GUI for ExifTool 项目地址: https://gitcode.com/gh_mirrors/ex/ExifToolGui 你是否曾面对数百张照片的拍摄时间混乱而束手无策?是否需要在大量图片中批量添加版…

2026/6/26 14:41:30阅读更多 →
【人工智能】一文搞定到底什么是智能体

【人工智能】一文搞定到底什么是智能体

【人工智能】一文搞定到底什么是智能体 一文搞定到底什么是智能体【人工智能】一文搞定到底什么是智能体一. LM,WorkFlow,Agent分别有什么么不同二. Agent的思考过程是怎样的三. Agent的五个核心部分1)LLM2)Prompt3)Me…

2026/6/26 11:03:22阅读更多 →
嵌入式GUI控件实战:ROTARY、SCROLLBAR、SLIDER原理与应用

嵌入式GUI控件实战:ROTARY、SCROLLBAR、SLIDER原理与应用

1. 嵌入式GUI控件:从原理到实战的深度解析在嵌入式系统开发中,图形用户界面(GUI)的设计与实现往往是项目从“能用”到“好用”的关键一跃。不同于资源充沛的PC或移动平台,嵌入式设备的GUI需要在有限的CPU性能、内存空间…

2026/6/26 4:15:25阅读更多 →
Google AI Studio 300美元额度的真相与实战指南

Google AI Studio 300美元额度的真相与实战指南

1. 这300美金不是“送钱”,而是Google埋下的第一道技术门槛 你看到标题里那个醒目的“$300美金”时,第一反应可能是:又一个免费额度?领完就完事?我亲手试过——这300美金根本不是红包,而是一张入场券&…

2026/6/26 9:29:01阅读更多 →
HPE (慧与) 服务器专用 ESXi 9 全套官方定制资源详解 + 完整部署升级教程

HPE (慧与) 服务器专用 ESXi 9 全套官方定制资源详解 + 完整部署升级教程

一、前言:企业运维痛点与资源价值自博通收购 VMware 之后,原 VMware 公开免费下载渠道全面关闭,企业运维人员想要获取适配 HPE 慧与服务器的 ESXi 9 原厂镜像,必须注册博通账号、绑定有效授权才能下载,无授权账号无法获…

2026/6/26 0:02:15阅读更多 →
Kotlin的@JvmStatic与@JvmField:与Java互操作的注解

Kotlin的@JvmStatic与@JvmField:与Java互操作的注解

Kotlin作为一门现代编程语言,与Java的互操作性一直是其核心优势之一。为了让Kotlin代码能够无缝对接Java,Kotlin提供了多种注解来优化互操作体验,其中JvmStatic和JvmField是两个关键注解。它们分别用于解决静态成员和字段在Java中的访问问题&…

2026/6/26 0:02:15阅读更多 →
深入解析musl libc中的mmap实现源码

深入解析musl libc中的mmap实现源码

最近在阅读musl libc源码时,发现其mmap的实现非常精妙,特分享给大家。 一、代码整体结构 这段代码实现了__mmap函数,并通过weak_alias导出为mmap。这是典型的musl libc风格——提供弱符号以便用户可以重写。 weak_alias(__mmap, mmap); 二…

2026/6/26 0:02:15阅读更多 →