Python新手入门:从交互模式、报错解读到数据类型实战
1. 这不是又一本“Python速成手册”——而是一份写给真实初学者的生存指南我带过不下两百个零基础转行学编程的学员从会计、教师、设计师到刚毕业的文科生。他们第一次打开终端输入python看到提示符时眼神里不是兴奋而是困惑这三道斜杠到底在等我干啥为什么敲完print(hello world)后屏幕上只蹦出一行字连个“恭喜入门”的弹窗都没有更别提那个神出鬼没的...续行符还有IndexError: string index out of range这种像天书一样的报错——它没说“你错了”它只冷冷地宣告“你的索引越界了”可我连“索引”长什么样都不知道。这篇《A Crash Course on Python — Part-1》的原始内容其实已经踩中了绝大多数新手最真实的痛点它不讲宏大的“人工智能未来”也不堆砌晦涩的“解释器抽象语法树”它就蹲在你敲下第一个字符的那一刻手把手告诉你Python 的世界里#是注释的起点是对话的邀请[0]是从左边数第一个[-1]是从右边数第一个。它把 Python 拆解成你每天都在用的“东西”数字像超市价签一样直接加减字符串像短信一样能拼接能换行列表像购物车一样能增删改查。这不是教科书里的“编程语言”这是你马上就能用来算工资条、整理通讯录、甚至自动给家人发节日祝福的工具。如果你是那个连if和for都分不清但心里又憋着一股劲想亲手做出点什么的人——这篇就是为你写的。它不要求你背概念只要求你敢敲、敢错、敢看报错信息。因为真正的编程入门从来不是从“学会语法”开始的而是从“看懂错误”开始的。2. 核心设计思路为什么我们不从“Hello World”讲起而是先聊“解释器”和“交互模式”2.1 解释器不是后台程序它是你的“实时翻译官”很多教程一上来就让你下载安装包、配置环境变量然后甩给你一句“安装成功后终端输入python就能进入交互模式”。这话没错但漏掉了最关键的一环你和 Python 之间隔着一个叫“解释器”的活人。它不是冷冰冰的编译器不会等你写完一万行代码再一次性吐出结果。它更像一个随时待命的翻译官你每说一句敲一行代码它立刻听懂、立刻执行、立刻反馈。你写2 2它秒回4你写deja_vu True它不吭声但这个变量已经活在内存里了你写if deja_vu: print(I have already seen this!)它看到冒号就明白“下面要缩进”看到缩进就准备执行最后真把那句话打印出来。这种“所见即所得”的即时反馈是 Python 对新手最温柔的馈赠。它让你的每一次尝试都像在跟一个耐心的朋友对话而不是在向一台沉默的机器提交申请。所以我们花时间讲和...不是为了炫技而是为了让你明白你不是在写一份等待批阅的作业你是在进行一场实时的、有回应的对话。当你下次看到...你就知道解释器在说“我听到了开头但还没听完请继续。” 这比死记硬背“缩进代表代码块”要直观一百倍。2.2 交互模式是你的“安全沙盒”不是摆设原始内容里那段python3.9.12 (main, Apr 5 2022...)的启动信息很多人会直接跳过。但恰恰是这行字藏着一个巨大优势你正在使用的是一个完全隔离、零风险的实验环境。在这里你可以肆无忌惮地创建变量、修改列表、甚至故意写错语法所有操作都不会影响你电脑里任何一个文件也不会让系统崩溃。我见过太多学员因为害怕“写错代码会搞坏电脑”在编辑器里反复删改迟迟不敢运行。而交互模式就是那个允许你“犯错”的安全区。_这个特殊变量上一次打印的结果更是神来之笔——它让你能像做数学题一样一步步推导先算total_price item_price tax再用_ - tax回头验证整个过程像草稿纸一样自然。这种“边想边试、边试边调”的节奏才是人类学习新技能最本能的方式。它把抽象的“编程逻辑”还原成了具象的“思考过程”。2.3 “内置数据类型”不是语法糖而是你省下的第一万行代码原始内容提到“Python 有高阶数据类型如列表和字典”并对比了 C/C。这个对比非常关键但需要更深一层的解读。在 C 语言里如果你想存一组学生的成绩你得先声明一个数组int scores[100];然后手动管理它的大小、遍历它的每一个元素、自己写逻辑去查找最高分。这个过程本质上是在用螺丝刀和胶水从零开始组装一辆自行车。而 Python 的list就像直接递给你一辆组装好的、带变速器和刹车的山地车。你只需要说scores.append(95)它就帮你把分数塞进去你说max(scores)它就立刻告诉你谁考得最好。这不是“偷懒”这是站在巨人的肩膀上把精力聚焦在解决业务问题本身而不是重复造轮子。原始内容里那个prime [2,3,5,7,...]的例子表面看只是列了一串数字但背后是 Python 已经为你封装好了内存分配、动态扩容、元素访问等所有底层细节。你不需要知道“指针”是什么就能高效地操作数据。这种“开箱即用”的能力正是 Python 能在数据分析、自动化脚本等领域快速普及的根本原因——它把程序员从与机器搏斗的泥潭里解放出来去思考人的问题。3. 核心细节解析与实操要点从“看得懂”到“写得对”的关键跃迁3.1 数字运算浮点数陷阱与整除的“地板思维”原始内容展示了20/3、20//3和20%3的区别但这背后藏着一个新手必踩的坑浮点数精度。你试试在交互模式里输入0.1 0.2得到的结果是0.30000000000000004而不是干净利落的0.3。这不是 Python 的 bug而是几乎所有计算机在用二进制表示十进制小数时的固有局限。0.1在二进制里是无限循环小数就像1/3在十进制里是0.333...一样。所以当你在做金融计算比如算利息、扣税时绝不能直接用float。这时候原始内容里提到的Decimal就派上大用场了from decimal import Decimal a Decimal(0.1) b Decimal(0.2) print(a b) # 输出0.3精准无误注意Decimal(0.1)必须用字符串初始化如果写成Decimal(0.1)它还是会先用不精确的float表示再转成Decimal结果还是错的。这就是为什么原始内容强调“Decimal是支持的”但没告诉你怎么用——实操中这个细节决定了你的程序是可靠还是灾难。至于//整除它的名字“地板除”floor division非常形象。它不是简单地“去掉小数”而是永远向负无穷方向取整。7 // 3是2没问题但-7 // 3是-3不是-2因为-3比-2.333...更小更负。如果你想要的是“截断小数”应该用int(-7 / 3)结果是-2。这个差异在处理负数索引或坐标计算时会引发意想不到的 bug。3.2 字符串不可变性是枷锁也是护身符原始内容说“字符串是不可变的”这句话太重要了但新手往往只记住“不能改”却忽略了“为什么不能改”以及“这有什么好处”。想象一下你有一个很长的字符串text hello world你想把w改成W。你不能写text[6] W会报TypeError。你必须写text text[:6] W text[7:]生成一个全新的字符串。这看起来很麻烦但好处是巨大的安全性。因为字符串一旦创建就不能被内部修改所以你可以放心地把它作为字典的键{text: 123}或者在多线程环境下共享完全不用担心其他代码偷偷把它改了。这就像一份盖了钢印的合同内容绝对可信。另一个常被忽略的点是原始内容里提到的rname \n hello world。r前缀的作用是让反斜杠\失去“转义”功能变成普通字符。这在处理 Windows 路径C:\Users\name\Documents或正则表达式\d匹配数字时是救命稻草。否则\n会被当成换行符\t被当成制表符路径就全乱了。所以当你看到路径里一堆双反斜杠\\那不是 Python 在刁难你而是你在没有r前缀的情况下被迫用\\来表示一个真正的\。3.3 列表浅拷贝的“影子”与嵌套的“俄罗斯套娃”原始内容提到prime[:]是“浅拷贝”并说它“返回一个副本”。这个描述容易让人误解为“完全独立的复制品”。实际上浅拷贝只复制了最外层的容器里面装的“东西”如果是可变对象比如另一个列表那么新旧列表指向的是同一个“东西”。看这个例子original [1, 2, [3, 4]] shallow_copy original[:] shallow_copy[2].append(5) # 修改内层列表 print(original) # 输出[1, 2, [3, 4, 5]]原列表也被改了 print(shallow_copy) # 输出[1, 2, [3, 4, 5]]original[2]和shallow_copy[2]指向的是内存中同一个[3, 4]列表。所以当你用append修改它时两边都看到了变化。这才是“浅拷贝”最危险也最常被忽视的地方。要得到真正互不影响的“深拷贝”得用import copy; deep_copy copy.deepcopy(original)。原始内容里那个nestedList [1,2, [hello,1],3]的例子完美展示了嵌套结构。访问nestedList[2][0]就像拆俄罗斯套娃先拿到第二层的[hello,1]再从这个新列表里拿第一个元素hello。这种层级访问在处理 JSON 数据、网页抓取的结构化信息时是家常便饭。理解它就等于拿到了打开复杂数据世界的第一把钥匙。3.4 变量与命名_不是下划线是你的“记忆暂存器”原始内容提到了交互模式下的特殊变量_说它存储“上一次打印的表达式”。这个设计极其人性化但新手常常不知道怎么用。它不是魔法它就是一个普通的变量名只是 Python 解释器在每次执行完一个表达式比如22或len(word)后会自动把结果赋值给_。所以_的值永远是你上一次“让 Python 把结果吐出来”的那个值。它最大的用途是链式计算和快速验证。比如你刚算出total_price 115.0想立刻看看税额占多少比例不用重新输入tax / total_price直接_ / tax就行前提是tax还在作用域里。再比如你用re.findall(r\d, text)找出一堆数字结果是一长串列表你想快速看第一个直接_就能调出来。它就像你大脑的“临时工作记忆区”把上一步的成果无缝传递给下一步。但要注意一旦你执行了一个不产生输出的语句比如x 5或print(hello)_的值就不会更新它还停留在上一次的表达式结果上。这个细节决定了你能不能流畅地进行探索式编程。4. 实操过程与核心环节实现从零开始亲手搭建你的第一个“数据小工坊”4.1 环境准备Anaconda 不是唯一选择但它是新手的“防坑盾牌”原始内容提到 Anaconda并给出了官网链接。这里必须强调对于纯新手Anaconda 是目前最稳妥的选择理由远不止“预装了包”这么简单。它的核心价值在于“环境隔离”。想象一下你今天用 Python 3.9 学基础明天想试试机器学习库 TensorFlow它可能要求 Python 3.8后天又想玩玩数据可视化发现某个库只兼容 Python 3.10。如果直接用官方 Python你得反复卸载重装痛苦不堪。而 Anaconda 的conda命令让你能一键创建多个互不干扰的“虚拟环境”# 创建一个叫 py39_base 的环境指定 Python 3.9 conda create -n py39_base python3.9 # 激活它Windows conda activate py39_base # 激活它macOS/Linux source activate py39_base # 现在你终端前缀会变成 (py39_base)所有 pip install 都只在这个环境里生效这样你的基础学习环境永远干净、稳定不会被其他项目的依赖搞崩。原始内容里(base) finder - - ~ % python的(base)就是 Anaconda 默认的 base 环境。虽然现在pip和venv也能做到类似效果但对于连PATH是什么都不知道的新手conda的命令更直白报错信息更友好社区支持也更成熟。所以我的建议是先用 Anaconda等你熟悉了 Python 生态再慢慢了解pip和venv的精妙之处。4.2 交互模式实战用“购物车”理解列表的所有核心操作让我们抛开所有概念用一个具体场景来练手。假设你要写一个小程序帮朋友管理他的“周末零食购物车”。我们需要能添加商品、查看清单、计算总价、找出最贵的零食、删除买多了的。这就涵盖了列表的全部核心操作。# 1. 创建空购物车列表 cart [] # 2. 添加商品append cart.append(薯片) cart.append(可乐) cart.append(巧克力) print(当前购物车:, cart) # [薯片, 可乐, 巧克力] # 3. 插入到特定位置insert比如可乐要放第一位 cart.insert(0, 可乐) print(插入后:, cart) # [可乐, 薯片, 可乐, 巧克力] —— 注意原来的可乐还在 # 4. 删除第一个匹配项remove只删掉一个可乐 cart.remove(可乐) print(删除一个可乐后:, cart) # [薯片, 可乐, 巧克力] # 5. 删除并获取最后一个pop模拟“结账时拿出最后一项” last_item cart.pop() print(结账拿走:, last_item, | 剩余:, cart) # 结账拿走: 巧克力 | 剩余: [薯片, 可乐] # 6. 排序sort按字母顺序排中文按 Unicode 码点 cart.sort() print(排序后:, cart) # [可乐, 薯片] # 7. 计算数量len print(购物车里还有, len(cart), 样东西)这段代码每一行都是一个真实需求的映射。append是随手往篮子里扔insert是临时改变主意调整顺序remove是发现买重了赶紧删pop是结账时一个个拿出来扫码。当你把抽象的list.append()和具体的“往购物车里加薯片”联系起来语法就不再是符号而是动作。这就是原始内容里prime.append(23)的深层意义——它不是一个孤立的函数调用而是一个解决问题的具体步骤。4.3 字符串实战用“短信模板”掌握切片、拼接与格式化原始内容展示了word[0:4]和word[5:]但没告诉你这在实际中怎么用。我们来模拟一个真实场景你有一段客户留言张三先生您的订单#12345已发货预计3天后送达。你需要提取出姓名、订单号和预计天数然后生成一条新的、更友好的通知短信。message 张三先生您的订单#12345已发货预计3天后送达。 # 1. 提取姓名从开头到第一个先生之前注意中文字符长度 name_start 0 name_end message.find(先生) # find 返回子串首次出现的位置 name message[name_start:name_end] # 张三 # 2. 提取订单号从#开始到下一个已之前 hash_pos message.find(#) order_end message.find(已, hash_pos) # 从#位置之后找已 order_id message[hash_pos:order_end] # #12345 # 3. 提取天数找到预计后的数字这里简化实际要用正则 days_start message.find(预计) 2 # 预计两个字所以2 days_end message.find(天, days_start) days message[days_start:days_end] # 3 # 4. 拼接新短信用 f-stringPython 3.6 最推荐的格式化方式 new_message f亲爱的{name}您好您的订单{order_id}已发出快递小哥正在飞奔{days}天内一定送到您手上 print(new_message) # 输出亲爱的张三您好您的订单#12345已发出快递小哥正在飞奔3天内一定送到您手上这个例子把find()查找位置、切片[:]提取子串、f-string格式化拼接全串起来了。它证明了字符串操作不是玩具而是处理真实文本数据日志、用户输入、API 返回的基石。原始内容里word[0:100]的“越界安全”特性在这里就体现为message[days_start:days_end]即使days_end超出了字符串长度也不会报错只会返回到末尾——这让你的代码更健壮不必每次都先检查长度。4.4 综合项目构建一个“简易通讯录”串联所有核心概念现在我们把数字、字符串、列表、条件、循环全揉在一起做一个能用的小工具。目标一个命令行通讯录能添加联系人、按姓名搜索、显示所有联系人。# 通讯录数据用列表存字典每个字典是一个联系人 contacts [ {name: 李四, phone: 13800138000, email: lisiexample.com}, {name: 王五, phone: 13900139000, email: wangwuexample.com} ] def add_contact(): 添加联系人 name input(请输入姓名: ) phone input(请输入电话: ) email input(请输入邮箱: ) # 创建新字典追加到列表 new_contact {name: name, phone: phone, email: email} contacts.append(new_contact) print(f已添加 {name} 的信息) def search_contact(): 按姓名搜索 search_name input(请输入要搜索的姓名: ) found False for contact in contacts: # 遍历列表 if contact[name] search_name: # 访问字典的键 print(f找到联系人: {contact[name]}, 电话: {contact[phone]}, 邮箱: {contact[email]}) found True break if not found: print(未找到该联系人。) def list_all(): 列出所有联系人 if not contacts: # 检查列表是否为空 print(通讯录为空。) return print(\n--- 全部联系人 ---) for i, contact in enumerate(contacts, 1): # enumerate 带序号遍历 print(f{i}. {contact[name]} | {contact[phone]} | {contact[email]}) # 主程序循环 while True: print(\n 简易通讯录 ) print(1. 添加联系人) print(2. 搜索联系人) print(3. 查看全部) print(0. 退出) choice input(请选择 (0-3): ) if choice 1: add_contact() elif choice 2: search_contact() elif choice 3: list_all() elif choice 0: print(再见) break else: print(无效选择请重试。)运行这个程序你就能亲手体验到input()获取用户输入字符串int()或float()转换数字虽然这里没用到但搜索时可能需要for循环遍历数据if条件判断分支enumerate()给列表加序号dict[key]访问结构化数据。它不再是一个个孤立的知识点而是一个有机运转的整体。原始内容里那些看似零散的numbers、strings、lists、conditions在这里汇成了一个能解决实际问题的工具。这才是编程学习的终极目标——让代码成为你延伸的手和脑而不是一道需要跨越的高墙。5. 常见问题与排查技巧实录那些没人告诉你的“踩坑现场”5.1 “IndentationError: unexpected indent” —— 缩进不是风格是语法这是新手遇到的第一个、也是最频繁的报错。原始内容提到“语句分组通过缩进而非括号”但没说清楚“缩进”有多严格。Python 要求同一代码块内的所有行必须有完全相同的缩进量。你不能混用 Tab 和空格也不能在一个if块里有的行缩进 2 个空格有的缩进 4 个。最稳妥的做法是永远用 4 个空格代替 Tab。几乎所有现代编辑器VS Code, PyCharm, Sublime Text都可以设置“Tab 键插入 4 个空格”。当你看到这个错误第一反应不是检查逻辑而是打开编辑器的“显示空白字符”功能通常在 View - Render Whitespace你会立刻看到那些不一致的 Tab 符号→和空格·。修复它只需全选报错行按Shift Tab退格再用空格重新缩进。记住if后面的冒号:是“缩进指令”它后面那一行必须缩进且缩进量必须和后续所有同级语句一致。5.2 “NameError: name xxx is not defined” —— 变量名是“身份证”不是“昵称”这个错误意味着你引用了一个 Python 完全不认识的名字。最常见的原因是拼写错误、大小写错误、或者变量根本就没被创建过。比如你写了user_name Alice然后想打印却写了print(username)少了个下划线或者写了UserName Alice然后用print(username)Python 区分大小写又或者你只在if语句块里定义了message Hello却在if外面试图print(message)变量作用域问题。排查时不要猜要“顺藤摸瓜”找到报错行看那个名字xxx然后在整个文件里CtrlF搜索确认它是否被正确定义、拼写是否完全一致、定义的位置是否在使用它的位置之前。原始内容里deja_vu True的例子如果写成deja_vu true小写 t就会立刻报这个错因为true不是 Python 的关键字True才是。5.3 “IndexError: list index out of range” —— 列表的“边界感”比你想象的强原始内容用word[100]展示了字符串索引越界。列表也一样。新手常犯的错误是用len(list)当作最大索引却忘了索引是从 0 开始的。一个有 5 个元素的列表my_list [1,2,3,4,5]它的合法索引是0,1,2,3,4len(my_list)是5但my_list[5]就越界了正确的最大索引是len(my_list) - 1。更安全的做法是永远用for item in my_list:来遍历而不是for i in range(len(my_list)):。后者虽然灵活但多了一层索引计算增加了出错概率。另外负索引[-1]是最后一个[-2]是倒数第二个这很好用但[-len(my_list)-1]同样会越界。记住负索引的有效范围是[-len(my_list), -1]。5.4 “SyntaxError: invalid syntax” —— 缺少冒号、括号、引号的“无声杀手”这个错误像幽灵一样常常不告诉你缺了什么只说“语法无效”。最常见的元凶是忘记if、for、while、def、class后面的冒号:括号()、[]、{}没有成对出现字符串的引号或没有闭合。比如if x 5 print(OK)就会报错因为if后面少了:。编辑器尤其是 VS Code 和 PyCharm的语法高亮是你的第一道防线如果一段代码的颜色突然变得和其他地方不一样比如本该是蓝色的字符串变成了黑色那八成是引号没闭合。其次看报错行和它的上一行如果上一行以(、[、{结尾而报错行是print(...)那几乎可以肯定上一行的括号没闭合。用编辑器的“括号匹配”功能把光标放在一个括号上它会高亮显示配对的另一个能瞬间定位问题。5.5 “ModuleNotFoundError: No module named xxx” —— 你的“工具箱”里没有这个“扳手”当你import requests却报这个错说明requests这个第三方库没装。原始内容提到“预定义模块”但没区分“内置模块”如math,os安装 Python 就自带和“第三方模块”如requests,numpy需要额外安装。解决方法很简单在终端里运行pip install requests。但要注意两点1确保你是在正确的 Python 环境里安装的如果你用了 Anaconda最好用conda install requests避免pip和conda混用导致环境混乱2如果公司网络有限制可能需要配置国内镜像源比如pip install -i https://pypi.tuna.tsinghua.edu.cn/simple/ requests。这个错误不是你的代码错了只是你的开发环境缺少必要的“零件”装上就好。提示所有这些报错都不是失败的标志而是 Python 在用最直接的方式告诉你“嘿这里有个地方需要你再确认一下。” 把它们当作代码的“纠错教练”而不是拦路虎。我刚开始学的时候一天能遇到二十次IndentationError现在看到它就像看到老朋友打招呼一样亲切——因为它意味着我的代码离正确运行只剩下一个空格的距离。6. 实操心得与避坑锦囊一个十年老手的私藏笔记6.1 “抄代码”不是捷径而是学习的必经之路很多人羞于“抄”别人的代码觉得那是“不思进取”。但我要说在入门阶段“抄”是最高效率的学习方式。原始内容里那个print(hello world)你必须亲手敲一遍感受、(、)、Enter的节奏那个prime.append(23)你必须在自己的终端里输入看着[2, 3, 5, ...]变成[2, 3, 5, ..., 23]。这个过程是在用肌肉记忆建立“代码手感”。就像学骑自行车看一百遍教程不如摔一次跤来得深刻。我带学员时会让他们把教程里的每一个例子不看答案先自己试着写写不出来就抄抄完立刻改一个参数比如把23改成29看结果变不变。这种“抄-改-试”的循环比死记硬背语法快十倍。等你抄够了五十个例子那些for、if、list的用法就自然长在你脑子里了。6.2 你的第一个“项目”应该小到可以 5 分钟内完成别一上来就想做个“微信”或“淘宝”。设定一个微小到不可思议的目标比如“写一个程序输入一个数字告诉我它是奇数还是偶数”。就这么简单。实现它你会用到input()、int()、if、%运算符。完成后再加一点点“如果输入的是 0就特别提醒‘0 既不是奇数也不是偶数’”。再加一点“如果输入的不是数字就提示‘请输入一个有效的整数’”。就这样像搭积木一样一小块一小块地垒。我见过太多人雄心勃勃要做“个人博客系统”结果卡在数据库连接三天最后放弃。而那个“奇偶数判断”你能在 5 分钟内完成、运行、看到结果这种即时的正反馈是支撑你走下去的最强燃料。原始内容说“从零开始”这个“零”就是你键盘上敲下的第一个print。6.3 把“报错信息”当作文档来读而不是障碍新手看到红色的报错文字第一反应是恐慌和关闭窗口。但高手会把它当宝。Python 的报错信息是世界上最友好的调试助手之一。它会明确告诉你1错误类型NameError,SyntaxError2错误发生的具体文件和行号File stdin, line 13错误的详细描述name xxx is not defined。这三点已经构成了一个完整的“故障报告”。我的习惯是遇到报错先把错误信息完整复制下来然后 Google 搜索Python NameError name xxx is not defined99% 的情况Stack Overflow 上已经有无数人踩过同样的坑答案就在第一条。久而久之你甚至能根据报错类型预判出大概的错误原因。这比任何教程都管用。原始内容里那个IndexError的例子就是最好的教学材料——它没有告诉你“怎么修”但它清清楚楚地告诉你“哪里错了”剩下的就是你和 Google 的合作了。6.4 用“注释”给自己写日记而不是写说明书原始内容说“注释以#开头”但没说怎么写好注释。我的经验是永远不要写“这行代码在做什么”而要写“我为什么这么写”。比如不要写x x 1 # 给x加1这毫无信息量。要写x x 1 # 修正初始计数偏移因索引从0开始。再比如处理一个复杂的字符串切片时不要写name text[5:10]而要写name text[5:10] # 从第5位姓名开始截取到第10位姓名结束因格式固定为ID:XXX|NAME:YYY。这样的注释是写给三个月后的你自己看的。当你回来维护代码时你不需要重新推导逻辑一眼就能看到当初的思考路径。它把代码从“机器指令”变成了“你的思维快照”。这也是为什么原始内容特意强调“注释不能出现在字符串里”——因为注释是给人看的不是给机器看的它必须独立于代码逻辑之外。6.5 今天学到的明天就用它解决一个真实的小问题学完list.append()今晚就写个脚本把你手机相册里所有.jpg文件名用append收集到一个列表里再用len()算算有多少张。学完string.split()明天就处理一下你导出的 Excel 表格保存为 CSV用split(,)把每一行拆成字段看看第一