从JavaScript快速上手Python:关键差异与核心技巧

引言

如果你是JavaScript开发者,可能会对Python的简洁语法和丰富的生态感兴趣。但两种语言的设计哲学和实现细节存在显著差异。本文将通过对比JS与Python的核心概念,帮助你快速过渡,避免“踩坑”。


一、语法差异:告别大括号,拥抱缩进

1.1 代码块与缩进

Python用缩进(通常4空格)替代JS的大括号,强制代码可读性:

# Python
if x > 0:print("Positive")  # 缩进表示代码块
else:print("Non-positive")
// JavaScript
if (x > 0) {console.log("Positive");
} else {console.log("Non-positive");
}

注意:混合制表符(Tab)和空格会导致错误,建议IDE设置为“4空格缩进”。


1.2 变量与类型

  • 无需声明关键字:直接赋值即可
    name = "Alice"     # 字符串
    age = 30           # 整数
    is_active = True   # 布尔(首字母大写)
    
  • 动态类型:变量可随时改变类型
    x = 10      # 整数
    x = "hello" # 变为字符串(合法但需谨慎)
    

对比JS:Python没有let/const/var,也没有变量提升(Hoisting)行为。


二、数据类型:列表、字典与元组

2.1 列表(List) vs 数组(Array)

Python列表类似JS数组,但方法名不同:

fruits = ["apple", "banana"]
fruits.append("cherry")   # JS: push()
last = fruits.pop()       # JS: pop()
fruits.insert(1, "mango") # 在索引1插入

2.2 字典(Dict) vs 对象(Object)

Python字典是键值对集合,但键必须是不可变类型(如字符串、数字):

user = {"name": "Bob","age": 25,"skills": ["Python", "JS"]
}
email = user.get("email", "default@example.com")  # 安全获取

2.3 元组(Tuple):不可变序列

类似被Object.freeze()处理后的JS数组:

colors = ("red", "green", "blue")  # 创建后无法修改

三、函数:参数灵活,作用域清晰

3.1 定义与调用

使用def关键字,无需括号包裹参数:

def greet(name, greeting="Hello"):return f"{greeting}, {name}!"  # f-string格式化(Python 3.6+)print(greet("Alice"))              # "Hello, Alice!"
print(greet("Bob", greeting="Hi")) # "Hi, Bob!"

对比JS

  • 参数默认值直接在定义时设置(无需||兜底)
  • 支持关键字参数(明确指定参数名,提高可读性)

3.2 作用域规则

  • 无变量提升,函数内修改全局变量需global声明:
    count = 0
    def increment():global countcount += 1
    

四、循环与迭代:更简洁的语法

4.1 for循环

直接迭代元素,无需索引:

fruits = ["apple", "banana", "mango"]
for fruit in fruits:print(fruit)

需要索引时用enumerate

for index, fruit in enumerate(fruits):print(f"Index {index}: {fruit}")

4.2 range函数

替代JS的for (let i=0; i<n; i++)

for i in range(3):     # 0, 1, 2print(i)
for i in range(1, 4):  # 1, 2, 3print(i)

五、模块与包管理:生态利用

5.1 导入模块

类似require,但语法更灵活:

import math
print(math.sqrt(16))  # 4.0from datetime import datetime  # 按需导入
now = datetime.now()

5.2 包管理工具pip

安装第三方库(类似npm):

pip install requests  # 安装HTTP库
pip freeze > requirements.txt  # 生成依赖清单

六、异步编程:async/await的另一种实现

Python的async/await语法与JS相似,但需依赖asyncio库:

import asyncioasync def fetch_data():await asyncio.sleep(1)return "Data"async def main():data = await fetch_data()print(data)  # 输出 "Data"asyncio.run(main())

注意:Python的异步生态(如HTTP客户端、数据库驱动)通常需选择兼容async的库(如aiohttp)。


七、面向对象编程:类与继承

Python使用class关键字,构造函数为__init__

class Animal:def __init__(self, name):self.name = namedef speak(self):raise NotImplementedError("子类必须实现此方法")class Dog(Animal):def speak(self):return "Woof!"dog = Dog("Buddy")
print(dog.speak())  # "Woof!"

关键差异

  • 显式传递self参数(类似JS的this
  • 继承语法更简洁(class SubClass(ParentClass)

八、避坑指南:常见问题

8.1 作用域陷阱

函数内修改全局变量需global声明:

x = 10
def update():global xx = 20
update()
print(x)  # 20

8.2 布尔运算符

使用单词而非符号:

if a and b:    # JS: &&
if c or d:     # JS: ||
if not e:      # JS: !

8.3 值比较

  • ==:比较值是否相等
  • is:比较对象身份(类似JS的===用于对象)
    a = [1, 2]
    b = [1, 2]
    print(a == b)  # True
    print(a is b)  # False
    

九、学习路径建议

  1. 基础巩固:完成Python官方教程(docs.python.org)
  2. 实战项目
    • 用Flask/Django重写Express项目
    • 用Pandas处理JSON/CSV数据
  3. 进阶资源
    • 书籍:《Python Crash Course》《Fluent Python》
    • 视频:Corey Schafer的Python教程(YouTube)

结语

Python以其简洁性和强大的库生态,成为自动化、数据分析、Web开发等领域的利器。通过对比JS与Python的核心差异,开发者可快速迁移技能。建议从一个小工具脚本开始实践,逐步深入理解Python的设计哲学。

讨论点:你在从JS转向Python时遇到了哪些挑战?欢迎在评论区分享经验!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/80646.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

TransmittableThreadLocal实现上下文传递-笔记

1.TransmittableThreadLocal简介 com.alibaba.ttl.TransmittableThreadLocal&#xff08;简称 TTL&#xff09;是阿里巴巴开源的一个工具类&#xff0c;旨在解决 ThreadLocal 在线程池中无法传递上下文变量 的问题。它是对 InheritableThreadLocal 的增强&#xff0c;尤其适用…

TDengine 安全部署配置建议

背景 TDengine 的分布式、多组件特性导致 TDengine 的安全配置是生产系统中比较关注的问题。本文档旨在对 TDengine 各组件及在不同部署方式下的安全问题进行说明&#xff0c;并提供部署和配置建议&#xff0c;为用户的数据安全提供支持。 安全配置涉及组件 TDengine 包含多…

在Cursor中启用WebStorm/IntelliJ风格快捷键

在Cursor中启用WebStorm/IntelliJ风格快捷键 方法一&#xff1a;使用预置快捷键方案 打开快捷键设置 Windows/Linux: Ctrl K → Ctrl SmacOS: ⌘ K → ⌘ S 搜索预设方案 在搜索框中输入keyboard shortcuts&#xff0c;选择Preferences: Open Keyboard Shortcuts (JSON) …

python打卡day30@浙大疏锦行

知识点回顾&#xff1a; 导入官方库的三种手段导入自定义库/模块的方式导入库/模块的核心逻辑&#xff1a;找到根目录&#xff08;python解释器的目录和终端的目录不一致&#xff09; 作业&#xff1a;自己新建几个不同路径文件尝试下如何导入 具体操作步骤&#xff1a; 在桌面…

【kafka】基本命令

创建 Kafka Topic 的命令 以下是创建 Kafka Topic 的几种常用方法&#xff1a; 1. 使用 kafka-topics.sh 基础命令&#xff08;Kafka 自带工具&#xff09; bin/kafka-topics.sh --create \--bootstrap-server <broker地址:端口> \--topic <topic名称> \--parti…

编程速递:适用于 Delphi 12.3 的 FMX Linux 现已推出

Embarcadero非常高兴地宣布&#xff0c;用于使用Delphi构建Linux客户端应用程序的FMX Linux UI库再次在RAD Studio 12.3版本以及RAD Studio 12.2版本中提供支持&#xff0c;同时也适用于更早的版本。 作为RAD Studio的一个附加库&#xff0c;FMX Linux为开发面向Linux的图形用…

通过实例讲解螺旋模型

目录 一、螺旋模型的核心概念 二、螺旋模型在电子商城系统开发中的应用示例 第 1 次螺旋:项目启动与风险初探

vue3 vite 路由

如路由是这种格式 http://localhost:7058/admin/product/brand路由配置如下 import { createRouter, createWebHistory } from vue-router import HomeView from ../views/HomeView.vue import NProgress from nprogress; import nprogress/nprogress.css; import {errorRour…

【Redis】Hash 存储相比 String 存储的优势

在 Redis 中&#xff0c;Hash 存储相比 String 存储具有以下 优势&#xff0c;特别适用于某些特定场景&#xff1a; ✅ 1. 更节省内存&#xff08;尤其适合存储对象&#xff09; Hash 内部使用压缩列表&#xff08;ziplist&#xff09;或哈希表实现&#xff0c;在数据量较小时…

CSS详解:特性、选择器与优先级

CSS详解&#xff1a;特性、选择器与优先级 目录 CSS详解&#xff1a;特性、选择器与优先级一、CSS的核心特性1. 层叠性&#xff08;Cascading&#xff09;2. 继承性&#xff08;Inheritance&#xff09;3. 优先级&#xff08;Specificity&#xff09;4. 响应式设计5. 动画与过渡…

《算法导论(第4版)》阅读笔记:p86-p90

《算法导论(第4版)》学习第 19 天&#xff0c;p83-p85 总结&#xff0c;总计 3 页。 一、技术总结 无。 二、英语总结(生词&#xff1a;2) 1. inkling (1)inkling: inclen(“utter in an undertone&#xff0c;低声说话”) c. a hint(提示)&#xff1b;a slight knowledg…

nginx概念及使用

一、Nginx 核心概念 Nginx&#xff08;发音为 "engine-x"&#xff09;是一个高性能、开源的 Web 服务器和反向代理服务器&#xff0c;由俄罗斯工程师伊戈尔・赛索耶夫&#xff08;Igor Sysoev&#xff09;于 2004 年开发&#xff0c;最初用于解决当时高并发场景下 Ap…

2025蓝桥杯JAVA编程题练习Day8

1. 路径 题目描述 小蓝学习了最短路径之后特别高兴&#xff0c;他定义了一个特别的图&#xff0c;希望找到图 中的最短路径。 小蓝的图由 2021 个结点组成&#xff0c;依次编号 1 至 2021。 对于两个不同的结点 a, b&#xff0c;如果 a 和 b 的差的绝对值大于 21&#xff0…

【赵渝强老师】Memcached的路由算法

Memcached支持两种不同方式的客户端路由算法&#xff0c;即&#xff1a;求余数Hash算法和一致性Hash算法。下面分别进行介绍。 一、 求余数的路由算法 求余数Hash算法的客户端路由是对插入数据的键进行求余数&#xff0c;根据余数来决定存储到哪个Memcached实例。 视频讲解如…

NLP学习路线图(一): 线性代数(矩阵运算、特征值分解等)

引言&#xff1a;语言与矩阵的奇妙邂逅 在自然语言处理&#xff08;NLP&#xff09;的魔法世界里&#xff0c;每个词语都像被施了变形术的精灵&#xff0c;在数学的殿堂中翩翩起舞。当我们用"king - man woman queen"这样的向量魔法破解语义密码时&#xff0c;线性…

BUUCTF PWN刷题笔记(持续更新!!)

ciscn_2019_c_1 64位&#xff0c;没有开启保护。点进去没发现明显的漏洞函数&#xff0c;考虑泄露libc基地址的rop构造。先看看有多少gadget 估计也够用了。puts函数只接受一个参数&#xff0c;观看汇编看看用的哪个寄存器传输的参数。 用的是edi。但是我们怎么找到so的版本呢…

Java EE初阶——线程安全

1. 线程的状态 1. 线程状态分类&#xff08;Thread.State 枚举&#xff09; Java 定义了 6 种线程状态&#xff0c;这些状态均由 java.lang.Thread.State 枚举表示&#xff1a; NEW&#xff08;新建&#xff09; 线程对象已创建&#xff0c;但尚未调用 start() 方法。此时线程…

Vue 3.0中响应式依赖和更新

响应式依赖和更新是Vue 3.0中最重要的机制&#xff0c;其核心代码如下&#xff0c;本文将结合代码对这个设计机制作出一些解释。 // 全局依赖存储&#xff1a;WeakMap<target, Map<key, Set<effect>>> const targetMap new WeakMap();// 当前活动的副作用函…

一、内存调优

一、内存调优 什么是内存泄漏 监控Java内存的常用工具 内存泄露的常见场景 内存泄露的解决方案 内存泄露与内存溢出的区别 内存泄露&#xff1a;在Java中如果不再使用一个对象&#xff0c;但是该对象依然在GC ROOT的引用链上&#xff0c;这个对象就不会被垃圾回收器回收&…

Linux /etc/rc.d/init.d/

在传统的 SysV init 系统中&#xff0c;服务启动脚本通常位于 /etc/rc.d/init.d/ 目录下。这些脚本可以直接执行以启动、停止或重启服务&#xff0c;并且可以接受参数如 start, stop, status 等。 如果你想知道位于 /etc/rc.d/init.d/ 目录下的某个脚本文件实际上指向哪里,如果…