每年一到开课季就会有零基础的朋友拿着“Python第一次作业”这个题目来问我该从哪儿下手、交上去能不能过、万一运行报错怎么办。问的人多了我发现这类朋友真正需要的不是一句“别怕很简单”而是有人把作业背后的逻辑拆出来讲清楚——为什么出这些题、每一行代码在干什么、报错该怎么看。Python第一次作业按我的理解就是一门语言的“见面礼”。它基本不会要求你写算法、做爬虫或者分析数据绝大多数情况下只是几道非常基础的小题用print输出内容、定义变量、完成简单的运算、用input接收用户的输入。可别小看这些内容能把它们毫无障碍地跑通说明你已经跨过了“看教程全靠眼睛、动手全靠想象”的那道坎。这篇文章会围绕Python第一次作业做一次完整拆解包含作业背后的考察逻辑、动手前必备的语法点、一份典型作业的逐行实现以及我这些年批改作业时总结的报错排查经验。文章里给出的代码路径和操作步骤都是基于常见教学实践的整理零基础的朋友可以直接照着写已经写过作业的朋友也可以拿来做自查清单。1. 第一次作业的设计思路与考察逻辑1.1 看似基础实际在测三层能力第一次作业的题目通常看起来简单得不像话有些同学甚至会怀疑是不是自己拿错了作业。但实际情况是出题人想通过这些小题验证的事情远比“你会不会print”要多。首先是验证开发环境真的搭好了。作业里的“输出一句话”这类题表面上是考print本质上是让你走一遍完整的运行流程新建文件、写代码、保存为.py文件、在终端或IDE里执行、看到结果。任何一个环节出问题代码再对也跑不出结果。我见过太多人交上来的作业截图里一片红色报错细问之下才发现连Python装的是哪个版本都说不清楚这种问题在第一次作业阶段集中爆发提前搞清楚比什么都值。其次是验证最基本的“输入—处理—输出”闭环有没有建立。第一次作业里一般都会有一道计算题比如根据半径求圆面积、根据摄氏温度求华氏温度。这类题考的其实不是数学公式而是你能不能想明白数据在程序里是怎么流动的用户输入的是字符串还是数字中间该做什么转换最后用什么方式把结果展示出来。这个闭环一旦通了后面学分支、循环、函数都会顺畅很多。最后是看你的代码习惯有没有雏形。变量名字起得是否可读、缩进是不是整整齐齐、有没有写注释的习惯这些在第一次作业阶段不直接影响“能不能得分”但绝对是后续学习的分水岭。我批改作业多了基本能从一份第一次作业判断这个学生后面几周会遇到什么问题这话一点都不夸张。1.2 四类常见题目各自在考什么把几年间见到的第一次作业题目归归类大致是四类每类的考察意图都不太一样。第一类是纯输出题比如“打印一段自我介绍”“输出一句欢迎语”。考的是print的基本用法和对字符串的第一印象顺带把引号、换行这些字符串相关的小知识带出来。别嫌它简单很多细节坑就是从这里开始的。第二类是变量与运算题比如“定义两个变量交换它们的值”“计算三个数的平均值”。考的是你懂不懂“变量只是给数据起的名字”这个核心概念以及Python里最基本的算术运算符。交换变量值这道题尤其经典既能用临时变量写也能用Python特有的多重赋值写能引出一堆值得琢磨的细节。第三类是简单输入交互题比如“输入你的名字输出欢迎语”“输入一个成绩判断是否及格”。这里的核心考点是input函数和类型转换。很多人第一次翻车就翻在这后面我会专门讲为什么。第四类是综合应用计算题比如“计算圆的面积”“华氏温度转摄氏温度”“根据身高体重算BMI”。这类题把变量、运算、输入输出串在了一起是第一次作业里含金量最高的题型也是零基础朋友应该优先研究透的。2. 动手前必须吃透的四个语法点2.1 print输出远不止是打印一句话先看print。这个函数几乎出现在每一行入门代码里但它的完整能力很多人直到做完第一次作业都没用上。最基本的使用是一个print跟一个字符串比如print(Hello, Python)。这里有一个细节容易被忽略print能一次接收多个值用逗号隔开就行。例如print(我的名字是, name, 今年, age, 岁)Python会自动在每两个值之间加一个空格这是print默认的行为。理解这个默认行为对看图说话排错很有帮助尤其是输出结果里出现莫名空格的时候。print还有两个常用参数end和sep。sep控制多个值之间的分隔符默认是空格你可以把它改成逗号、竖线甚至换行。end控制整条输出结束时的字符默认是换行所以连续两个print会各占一行。如果你想去掉这个换行比如题目要求两个输出在同一行写上end即可。举个作业里的实际场景题目要求连续打印一串数字又没让用循环很多同学会用笨办法写五行print其实只要写成print(1, 2, 3, 4, 5)一行就解决了这就是sep和end知识点的用武之地。字符串里的引号也值得单独说。print(他说‘你好’)没问题因为外层双引号内层单引号不冲突print(他说你好)也没问题反过来也一样。真正容易报错的是print(他说‘你好’)这种内层外层全是单引号的情况。解决办法有两个要么内层改用双引号要么用反斜杠转义比如print(他说你好)。第一次作业里偶尔会出现这种写法提前了解能省不少事。2.2 变量与类型动态类型不是随便写的借口变量这个概念再基础也值得认真对待。Python里变量不需要声明类型你直接写name 张三就是给内存里的一块数据贴上了名为name的标签再写age 20又创建了一个整数标签。这就是Python所说的动态类型——同一个变量名今天可以指向字符串明天可以指向整数。但动态类型不等于你可以随便写。一个最常见的错误场景是这样的age 20然后想输出“我今年20岁”直接写成print(我今年 age 岁)结果报TypeError。原因很简单字符串不能直接和整数做加法拼接。你脑子里觉得“20”就是“二十”但程序里的字符串“我今年”和整数20完全是两种对象。想拼得先转换str(age)把整数转成字符串或者用后面要讲的格式化方法。数据类型也是第一次作业的重要考点。int是整数、float是浮点数、str是字符串、bool是布尔值这几种至少要能认出来。一个比较隐蔽的坑是除法7 / 2的结果是3.5类型是float而7 // 2的结果是3类型是int。如果你在作业里用整数除法算平均值结果可能直接少掉小数部分这种错误在批改时出现的频率非常之高。变量命名规范也要从现在开始养成。Python官方的建议是变量名使用小写字母加下划线比如student_name而不要用studentName这种驼峰式。虽然Python没有强制但多数教学场景和代码风格检查工具都会建议前者。另外不要用keyword做变量名比如class、for、if这些是Python的保留字用了直接语法报错。我就亲眼见过有人写class 三年二班然后对着红红的SyntaxError发呆半天。2.3 字符串格式化三种写法怎么选输出一句话方法从来不止一种。第一次作业阶段你至少会接触到三种字符串拼接和格式化的方式我建议你三种都看一眼然后固定用其中一种练熟。第一种是加号拼接print(我的名字是 name 。)。优点是直观缺点也很明显字符串和数字不能直接加拼接长句子时加号和引号多了特别容易乱。这个方式我不推荐作为主打写法但你必须看得懂因为网上老代码里到处都是。第二种是百分号格式化print(我的名字是%s今年%d岁 % (name, age))。这是很经典的写法%s占字符串的位置%d占整数的位置%f占浮点数的位置。它的好处是格式和内容分离数字也能直接放进去不用手动转字符串。缺点是写多了占位符容易看花眼而且一旦占位符数量和变量对不上程序运行到这一行才报错调试时要多费一点眼神。第三种是f-stringprint(f我的名字是{name}今年{age}岁)。这是目前个人强烈推荐的方式。在字符串前面加一个小写f把变量用花括号直接嵌进去代码读起来跟人话一样清楚。f-string里还能直接写表达式比如{fahrenheit * 9 / 5 32:.1f}其中:.1f表示结果保留一位小数。第一次作业里凡是涉及面积、温度、BMI这类需要保留小数的题f-string配合格式说明符几乎是最省心的写法。三种方式没有绝对对错但我给零基础朋友的建议是加号拼接用来理解原理f-string用来写作业百分号格式化至少要能看懂。一旦选定f-string就保持风格统一不要这份作业用f-string下份作业又切换回百分号风格切换本身也是一种无谓的踩坑。2.4 input与类型转换第一道分水岭input是所有第一次作业里最容易让人当场懵掉的知识点而且懵的原因出奇地一致。input函数的作用是接收用户在终端里输入的内容。注意“输入的内容”这几个字要划重点。无论用户敲进去的是123、3.14还是张三input返回给你的永远是一个字符串永远带着str这个类型标签。这不是错觉也不是某种特殊设置这是设计使然。明白了这一点后面的事情就顺了。想拿输入的数字去运算第一步必须转换。radius float(input(请输入半径))这行代码是先把用户输入的内容转成浮点数再交给radius。如果你忘了转换直接拿input的结果去做乘法会得到这个经典报错TypeError: cant multiply sequence by non-int of type float。翻译过来就是你不能把一个字符串和一个浮点数相乘。报错信息里还超级贴心地告诉了你到底是哪一行出的问题只要顺着读就能找到元凶。类型转换还有一道经典陷阱乱转。用户输入的是一个带小数点的圆半径你用int(input(...))去接结果输入3.5直接报ValueError: invalid literal for int() with base 10: 3.5。因为int只能转整数字符串碰到小数点就罢工。想兼容小数就用float如果题目要求整数输入环节也得先写成int然后做好“用户可能不按套路输入”的心理准备。第一次作业一般不会刁难你处理异常输入但了解这个边界后面学异常处理时会轻松很多。3. 一份典型作业的实操全流程3.1 把题目拆成可执行的小步骤空讲语法容易飘我们直接拿一份有代表性的第一次作业走一遍全流程。假设题目是这样的使用print输出一行“欢迎学习Python编程”。定义变量name和age分别存储你的姓名和年龄然后输出一句话介绍自己。输入一个圆的半径输出该圆的面积圆周率取3.14结果保留两位小数。输入一个摄氏温度输出对应的华氏温度公式为F C * 9 / 5 32结果保留一位小数。拿到题先别急着敲键盘。第一步永远是拆题。这四道小题分别考的是print基础输出、变量定义与字符串格式化、input加类型转换加浮点运算、input加类型转换加表达式计算。前两题是热身后两题是硬骨头。心里有了这个判断写起来就不会乱。再想一下每道题的输入和输出分别是什么。第3题输入是浮点数半径输出是一个带两位小数的面积第4题输入是浮点摄氏温度输出是带一位小数的华氏温度。输入输出清楚了中间的运算公式就是沿着这个方向填充而已。这一步看起来不起眼但对零基础者来说学会在写代码前先描述“我要什么输入、要什么输出”比会背十个语法都重要。3.2 代码逐题编写与逐行解读拆完题开始写。第一题最简单一行搞定print(欢迎学习Python编程)注意引号要成对中英文标点别混用。很多人第一次写代码的报错就是中文引号引起的编辑器里看着好像没问题运行起来就是SyntaxError。这一点我在后面第4节还会专门讲。第二题需要定义变量并输出一句话我建议这样写name 张三 age 20 print(f我是{name}今年{age}岁。)这里用到了前面说的f-string。有的同学会用加号拼print(我是 name 今年 str(age) 岁。)。能跑但格式串里的引号加号数量一多改起来就想摔键盘。用f-string整句话的长相和你想输出的文案基本一致维护起来省心太多。第三题是圆面积我预期中的标准答案是pi 3.14 radius float(input(请输入圆的半径)) area pi * radius ** 2 print(f圆的面积是{area:.2f})这四行代码信息量不小。第一行把圆周率存成变量这是好习惯万一题目给的是3.14159改一个地方就全变了。第二行的float(input(...))是这套代码的核心它把用户敲进来的字符串转成浮点数。第三行用了幂运算符**代替radius * radius这是Python里非常自然的平方写法。第四行的:.2f让面积保留两位小数不管radius是1.5还是2.333输出都干干净净。有同学会问为什么不用math.pi因为第一次作业一般还没教导入模块题目也说了取3.14那我就不引入额外概念先把基础模型跑通。如果作业允许后面学了import再用math.pi会更精确但这不是当前阶段的重点。第四题是温度转换celsius float(input(请输入摄氏温度)) fahrenheit celsius * 9 / 5 32 print(f对应的华氏温度是{fahrenheit:.1f})公式本身不难难的是别把公式抄错。华氏温度和摄氏温度的转换式是F C * 9 / 5 32注意乘除的顺序。有人写成(celsius 32) * 9 / 5这是错的结果能差出一大截。这里最稳妥的做法是写完后用常识验算0摄氏度应该等于32华氏度100摄氏度应该等于212华氏度。把这个数往程序里一输结果对上了这道题至少跑掉一半的心。3.3 运行验证与提交前自查代码写完不等于作业写完至少还要过三关。第一关是逐题运行。每一道题都要亲手在终端或IDE里运行一遍别只看编辑器里没有红色波浪线就觉得自己写完了。编辑器检查的是语法层面的明显错误它管不了你变量名拼错、公式写反这类逻辑问题。运行的时候把边界值也测一遍半径输入0面积应该输出0.00温度输入0华氏应该输出32.0。边界值能通过说明代码基本靠谱。第二关是文件名和保存路径。建议每道题一个文件或者按作业要求命名比如homework1.py、homework2.py。保存的时候确认文件名后缀真的是.py而不是.py.txt。这个坑我一点都不夸张在Windows上新建文本文件后直接改名很多人会保存成“homework1.py.txt”运行的时候要么找不到文件要么被文本编辑器打开怎么看怎么别扭。解决办法是在IDE里直接新建文件或者保存时在文件类型里选“所有文件”别让它偷偷给你加.txt后缀。第三关是自查清单。我一般建议学生提交前过这么几项代码里有没有中文标点print里的引号成不成对input的提示语里外引号有没有冲突变量名有没有拼错注释里有没有说明核心逻辑每道题运行结果有没有截图留存。这些检查项目看着琐碎但能拦截掉至少一半的批改扣分点。我自己批作业时发现扣分最多的从来不是“不会写”而是“写对了但小错误不断”。4. 高频报错与排查实录4.1 错误的三种类型先分清楚再动手会看报错是比会写代码更早应该掌握的技能。第一次作业阶段遇到的报错大致分三类。第一类是语法错误SyntaxError。这类错误发生在代码被真正运行之前通常是拼写、标点、缩进之类的低级问题。比如中英文引号混用、漏了冒号、多打了括号、把print拼成prnit。报错信息通常会直接指向出错的行有时还带一个小箭头标到具体位置。看到SyntaxError别慌先顺着提示往前看几行十有八九是标点或者关键词拼错了。第二类是运行时错误。代码语法上没问题运行时才炸出来。常见的有NameError提示某个变量没定义多半是拼写不一致TypeError提示类型不匹配比如字符串和整数相加ValueError提示值不合适比如用int去转带小数点的字符串。这类报错的关键信息在报错文本的最后几行它会告诉你出错的文件名、行号以及具体原因照着位置找基本一找一个准。第三类是逻辑错误。这种最隐蔽代码能跑、不报错但结果不对。比如温度转换公式写反了、平均值算完之后变成整数、把半径的平方写成半径乘2。逻辑错误不会给你任何报错提示只能靠人工验算来发现。这也是为什么我一直强调写完代码后要用边界值和常识值去验证因为逻辑错误唯一的敌人就是你自己。4.2 第一次作业报错速查表下面这张表是我这些年批改第一次作业时遇到频率最高的报错每条后面附上最常见的原因和一句处理建议。你可以把它存下来遇到问题先对照一遍。报错信息常见原因处理建议SyntaxError: invalid syntax中英文标点混用、引号不成对、漏了冒号或括号看报错指向的行重点检查标点和拼写SyntaxError: Non-UTF-8 code文件编码不是UTF-8通常是中文注释导致的在文件首行加# -- coding: utf-8 --或统一把文件保存为UTF-8编码NameError: name xxx is not defined变量名拼错或某处变量从未赋值检查name的拼写是否前后一致变量是否真的赋过值IndentationError: unexpected indent不该缩进的地方多了缩进或缩进不统一统一用4个空格缩进不要混用Tab和空格TypeError: can only concatenate str字符串直接和数字拼接先用str()转字符串或者改用f-stringTypeError: cant multiply sequence by non-int用字符串直接做乘法比如input结果没转类型先float()或int()转换再运算ValueError: invalid literal for int()用int转换带小数的字符串改用float()转换FileNotFoundError 或文件打不开文件名后缀其实是.py.txt或路径不对在IDE里新建文件确认扩展名为.py这张表肯定不完整但覆盖了绝大多数第一次作业会碰到的情况。我还想特别强调一下编码问题。有些同学在文件里写了中文注释然后保存的时候没有选择UTF-8编码运行时会报Non-UTF-8 code的错。解决办法是在保存文件时明确选择UTF-8或者在文件最顶部加一行# -- coding: utf-8 --。老教材里经常看到这行魔法注释现在多数IDE默认就是UTF-8但搞明白它的存在和意义排查时会少走很多弯路。还有一点必须单独拎出来说报错信息是程序在帮你不是在骂你。它的每一句话几乎都是有用的线索文件名、行号、错误类型、具体原因全在信息里。我见过太多初学者一看到满屏红色就慌了直接关掉窗口找别人帮忙。其实冷静下来读一读大部分问题自己就能定位。4.3 批改时反复出现的坏习惯除了报错还有一些不报错但很要命的坏习惯我每次批改都能碰上几个。第一个是复制粘贴改都不改。有些同学从网上找了一段代码变量名都不换就贴进作业里结果输出和自己的题目完全对不上。复制可以但你得看得懂、改得动。我给学生的底线是凡是交上来的代码每一行都得能解释清楚是干什么的。解释不清楚的代码和没写没区别。第二个是只截图不保存源文件。还有些同学交作业只交运行结果截图源文件不放上来。这样就算结果对了老师也没法看你写的思路更没法指出代码风格和潜在问题。第一次作业的重要目的就是让老师了解你的起点所以源文件和运行记录最好一起交。第三个是缩进不统一。Python用缩进表示代码块缩进错误直接IndentationError。而有些人一会儿用Tab一会儿用空格编辑器里看起来整整齐齐一运行就报错。建议从现在开始固定用4个空格大多数IDE在设置里都可以把Tab键自动转换成空格一劳永逸。第四个是不写注释。第一次作业的代码可能就几行不写注释没什么影响。但我要说一句实话注释不只是写给别人看的更多是写给三天后的自己看的。三天后你回头看这段代码有几个变量名能一眼明白含义一个个变量名起得不清不楚又没有注释辅助复盘作业的时候会非常痛苦。从第一次作业开始养成写注释的习惯是最值得做的长期投资。5. 第一次作业之后下一步怎么走作业交上去不是终点它最大的价值是帮你确认两件事环境是否就绪、基础语法是否有了手感。这两件事有了后面的学习才算真正开始。5.1 先按这条路径补基础我建议你顺着这几个方向往下走。首先是分支和循环这是程序逻辑的骨架if、for、while这三个关键词能解决的问题覆盖了绝大多数日常脚本需求。其次是函数学会把重复的代码抽出来用def定义自己的函数你会发现同样的作业用函数组织起来清晰不止一个档次。然后是列表和字典它们是Python里最常用的两大容器存数据、读写数据的能力会一次到位。有不少朋友会问是不是应该直接去学爬虫、数据分析这些看起来炫酷的方向。我的回答一直是先别急。爬虫要基于网络请求、HTML解析这些前置知识数据分析要基于Pandas、NumPy这些第三方库的语法习惯。这些都不是不能学但如果你连第一次作业里的字符串格式化都要想半天贸然跳到高阶方向很容易被报错信息淹没然后产生“我是不是不适合编程”的错觉。5.2 记录作业也是一项能力我个人的体会是第一次作业真正该收获的不是分数而是一种对报错的脱敏。什么时候你看到红色报错信息不再心跳加速而是顺手点开报错详情、定位行号、读一读提示语你就已经迈过入门阶段最大的心理障碍了。代码世界里没有不报错的程序员区别只在于有人把报错当线索有人把报错当判决书。最后再分享一个小技巧。每次跑完作业把你写过的代码按题目存成一个文件夹顺手在文件顶部写一个简短的注释比如这个作业考了哪些点、你踩了哪个坑。积累三五份之后回头翻一翻你会非常直观地看到自己的进步。这比盲目刷题有意义得多也更适合零基础阶段的节奏。