资讯动态

前端转 AI 100 天 Day 2: list / dict / 推导式,Python 比 JS 爽在哪

发布时间:2026/9/12 20:44:19 来源:尧图企业网站定制
前端转 AI 第 2 天list / dict / 推导式Python 比 JS 爽在哪昨日回顾Day 1 把 Python 环境跑起来了也搞懂了一件事Python 不是新语言是 JS 的另一种写法。今天进入真正的语法层。学完最大的感受是Python 的数据结构比 JS 好用但好用得有点“反直觉”尤其是切片和推导式第一次看会懵。Day 2 目标把 list / tuple / dict / set 四个容器吃透顺手拿下切片和推导式。一、四大容器先建立直觉JS 里我们其实只有两种常用结构Array和Object。Python 直接给你四种各有各的脾气Python中文对应 JS可变有序能重复写法list列表Array✅✅✅[1, 2, 3]tuple元组无类似Object.freeze的数组❌✅✅(1, 2, 3)dict字典Object/Map✅✅3.7key 不能重复{a: 1}set集合Set✅❌❌{1, 2, 3}记不住没关系先记住一句话列表 数组字典 对象元组 只读数组集合 去重神器。1. list就是 JS 数组但更强skills[Vue,React,Node]skills.append(Python)# 末尾加等于 pushskills.insert(0,HTML)# 指定位置插入skills.remove(Vue)# 按值删除lastskills.pop()# 弹出末尾等于 popprint(skills)# [HTML, React, Node]print(len(skills))# 3注意不是 .length⚠️ 坑点JS 用arr.lengthPython 用len(arr)。这是函数不是属性写多了就习惯了。2. tuple不可变的 listpoint(3,5)# point[0] 10 # ❌ 报错元组不能改x,ypoint# 解构和 JS 一模一样print(x,y)# 3 5为什么要有元组两个原因性能更好内存占用比 list 小可以当 dict 的 keylist 不行因为可变就不安全# 元组可以作为字典的键locations{(39.9,116.4):北京,(31.2,121.5):上海,}print(locations[(39.9,116.4)])# 北京这个特性后面做 Agent 缓存、坐标索引时会用到。3. dict对象 Map 的结合体user{name:前端,age:25,skills:[Vue,React],}print(user[name])# 前端print(user.get(gender,未知))# 未知取不到给默认值比 JS 的 ?. 爽user[city]上海# 新增/修改deluser[age]# 删除# 遍历forkey,valueinuser.items():print(key,value)对比一下 JS 的写法你会发现// JSObject.entries(user).forEach(([k,v])console.log(k,v));# Pythonfork,vinuser.items():print(k,v)Python 更直白没有entries/keys/values三件套的负担虽然它也有。4. set去重 集合运算a{1,2,3,3,3}print(a)# {1, 2, 3} 自动去重b{3,4,5}print(ab)# {3} 交集print(a|b)# {1,2,3,4,5} 并集print(a-b)# {1,2} 差集最常用的场景数组去重nums[1,1,2,3,3,3]uniquelist(set(nums))print(unique)# [1, 2, 3]JS 里你要写[...new Set(nums)]Python 就list(set(nums))思路完全一样。二、切片Python 的杀手锏这是今天最让我震撼的东西。JS 里想取数组的一段你得用slice// JSconstarr[0,1,2,3,4,5];arr.slice(1,4);// [1, 2, 3]arr.slice(-2);// [4, 5]Python 直接用中括号 冒号arr[0,1,2,3,4,5]arr[1:4]# [1, 2, 3] 从 1 到 4不含 4arr[:3]# [0, 1, 2] 从头到 3arr[3:]# [3, 4, 5] 从 3 到结尾arr[-2:]# [4, 5] 倒数两个arr[::2]# [0, 2, 4] 步长为 2arr[::-1]# [5, 4, 3, 2, 1, 0] 反转语法公式arr[起始 : 结束 : 步长]三个参数都能省略规则省略起始 → 从头开始省略结束 → 到结尾步长为负 → 倒着走对字符串同样适用sHello, Pythonprint(s[:5])# Helloprint(s[-6:])# Pythonprint(s[::-1])# nohtyP ,olleH 一行反转字符串JS 里字符串反转要split().reverse().join()Python 一行搞定这就是爽点。三、推导式JS map/filter 的合体这是今天第二个震撼点。假设我要把数组里每个数平方JS 怎么写// JSconstnums[1,2,3,4];constsquaresnums.map(nn*n);Python 不用.map()直接推导nums[1,2,3,4]squares[n*nforninnums]print(squares)# [1, 4, 9, 16]带条件等于 filternums[1,2,3,4,5,6]evens[nforninnumsifn%20]print(evens)# [2, 4, 6]字典推导式user{name:前端,age:25}upper{k:vfork,vinuser.items()}print(upper)# {name: 前端, age: 25}集合推导式nums[1,1,2,2,3]unique{nforninnums}print(unique)# {1, 2, 3}语法公式[表达式for变量in可迭代对象if条件]一行顶 JS 的map filter两层写起来非常过瘾。⚠️ 坑点推导式别写太复杂。超过两个for或者条件嵌套太深就该拆成普通循环了。可读性第一。四、条件与循环和 JS 的小差异条件判断age25ifage18:print(未成年)elifage60:print(成年人)else:print(老年人)和 JS 几乎一样区别JS 是else ifPython 是elifJS 用{}Python 用冒号 缩进三目运算符// JSconstlabelage18?成年:未成年;# Pythonlabel成年ifage18else未成年Python 的写法是A if 条件 else B读起来像自然语言。第一次看会觉得别扭用多了反而觉得比?:清楚。for 循环JS 的for...offor(constitemoflist){console.log(item);}Python 的for...inforiteminlist:print(item)几乎一样。但要同时拿到索引时Python 比 JS 舒服skills[Vue,React,Node]fori,skillinenumerate(skills):print(i,skill)# 0 Vue# 1 React# 2 NodeJS 里你得forEach((item, index) {})Python 用enumerate()是一个很常用的内置函数。while 循环count3whilecount0:print(count)count-1print(发射!)和 JS 一样不再赘述。⚠️ 坑点Python没有和--想加一就写count 1。这个我第一天写代码时报错找了半天。五、实战练习通讯录管理脚本今天用学的东西写一个小脚本巩固一下。新建day02/contacts.py# 一个简单的通讯录管理contacts[{name:张三,phone:13800138001,city:北京},{name:李四,phone:13800138002,city:上海},{name:王五,phone:13800138003,city:北京},]# 1. 打印所有联系人print( 全部联系人 )fori,cinenumerate(contacts,start1):print(f{i}.{c[name]}-{c[phone]}({c[city]}))# 2. 按城市筛选找到所有北京的联系人beijing[cforcincontactsifc[city]北京]print(\n 北京联系人 )forcinbeijing:print(f{c[name]}-{c[phone]})# 3. 统计每个城市有多少人fromcollectionsimportCounter city_countCounter(c[city]forcincontacts)print(\n 城市统计 )forcity,countincity_count.items():print(f{city}:{count}人)# 4. 按名字排序sorted_contactssorted(contacts,keylambdac:c[name])print(\n 按名字排序 )names[c[name]forcinsorted_contacts]print(names)运行python contacts.py输出 全部联系人 1. 张三 - 13800138001 (北京) 2. 李四 - 13800138002 (上海) 3. 王五 - 13800138003 (北京) 北京联系人 张三 - 13800138001 王五 - 13800138003 城市统计 北京: 2 人 上海: 1 人 按名字排序 [张三, 李四, 王五]这个小脚本用到了今天所有知识点list、dict、推导式、enumerate、lambda。别小看它后面 Agent 处理工具返回结果时全是这类数据操作。六、今日踩坑len()记成.length→ Python 里属性改函数了写多就顺元组赋值改不了→point[0] 1会报TypeError要改就转 list/--不存在→ 用 1/- 1切片边界不含右端→arr[1:4]只有 3 个元素这点和 JSslice(1, 4)一样推导式里的变量不会泄漏到外面→ 这是和 JSfor的差异但 Python 里是好事七、今日总结今天核心记住三件事四大容器list / tuple / dict / set分别对应数组、只读数组、对象、集合切片arr[起:止:步]一行干翻 JS 的slice reverse推导式[表达式 for x in 数据 if 条件]map 和 filter 的合体有个感受特别明显Python 用“少写代码”换“多表达意图”JS 用“多写代码”换“更接近机器模型”。两种风格各有取舍但做数据处理和 AI 时Python 的写法确实更省心。Day 2 完成度✅明日预告Day 3函数定义、参数默认值、可变参数*args/**kwargs作用域global/nonlocal是什么鬼lambda 匿名函数和 JS 箭头函数的区别小练习写一个函数工具箱去重、分组、排序最后如果这篇对你有用点个赞让我知道有人在看。有问题评论区见我们第 3 天继续。100 天第 3 天见。附系列目录持续更新天标题01从切图仔出发100 天走向 Agent 开发 ✅02list / dict / 推导式Python 比 JS 爽在哪 ✅03函数、参数、作用域别再写function了04面向对象class 和 JS class 的异同05文件读写与异常处理06pip / conda / 虚拟环境彻底搞懂依赖管理07requests 爬虫实战抓一个 API08异步 asyncioPromise 的另一种形态……31FastAPI 入门写第一个接口46调通第一个大模型 API61RAG 实战让模型读懂你的文档81LangChain Agent让模型自己调工具100上线我的第一个 AI Agent 应用

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价