直接扔给你一句“day2 基础语法”,听起来好像很轻松,但带过几批新人的同学心里都清楚:Day 1 装好环境、跑通 Hello World 时的兴奋感还在,Day 2 开始啃变量、数据类型、循环、函数这些硬骨头时,才是第一个真正的分水岭。很多人不是学不会,而是被“语法细节”和“抽象概念”双重夹击,当天晚上就开始怀疑自己适不适合写代码。
这篇文章我按自己带人时总结的“day2 该掌握的最小必要知识集”来写,不追求覆盖一门语言的全部语法,而是把最核心、最常用的那 20% 讲透:变量到底在内存里干了什么、数据类型为什么非要分、运算符有哪些反直觉的坑、流程控制怎么从“顺序执行”跳出来、函数和缩进为什么是新手重灾区。如果你正在自学,或者刚带人入门,这篇可以直接当第二天的基础讲义用。
1. 内容整体设计与思路拆解
1.1 Day 2 为什么是“劝退高发期”
先泼一盆冷水:Day 1 的 Hello World 本质上只做了一件事——让你确认“我的电脑能跑代码”。它几乎没有语法负担,print 一下完事,成就感到手极快。Day 2 就完全不一样了,你开始接触的是“让代码有逻辑”的东西,也就是变量、条件、循环、函数,每一个都要求你在脑子里建立一套“程序如何执行”的动态模型。
我见过太多人卡在这里,不是因为他们笨,而是因为 Day 2 的学习材料普遍有一个毛病:把语法当“知识点”罗列,而不是当“解决问题的工具”来讲。比如讲变量就只会说“变量是存储数据的容器”,这种定义背下来没有任何用,你根本不知道什么时候该用变量、为什么要用。
所以 Day 2 的正确设计思路应该是:每个语法概念都绑一个真实的小问题。讲变量,就讲“如何把用户输入的名字存下来,供后面使用”;讲条件,就讲“如何让程序根据分数输出不同评语”;讲循环,就讲“如何不写一百行 print 就输出一百个数字”。语法是手段,问题是目的,这个顺序不能反。
1.2 从“抄代码”到“写代码”的过渡策略
Day 2 其实是你第一次被要求“默写”。前一天的练习基本是照着敲,第二天再这么搞就废了——因为语法太多太碎,照着抄会给你一种“我都会”的错觉,合上材料立刻大脑空白。
我的做法是“三步剥洋葱”:
- 第一步,通读一遍当天语法,只求理解,不求记忆,这个阶段允许看材料。
- 第二步,合上材料,自己敲一个“同款不同内容”的练习。比如教程里让算圆的面积,你就改成算矩形的面积,逼自己想起语法长什么样。
- 第三步,隔一天再做一遍,这步最关键。能不看任何东西独立写出来,才说明语法真正长在你脑子里了。
这套策略的核心逻辑是:语法知识必须经过“回忆-提取”的过程才能进入长期记忆,而大多数人学一天语法就把这步省了,第二天全忘光,又开始从零学,恶性循环。
1.3 本篇文章的结构说明
后面几节我按照“从产生数据、加工数据、控制流程、封装逻辑”这条主线来拆解,这其实也是绝大多数主流编程语言基础语法的通用骨架。不管你是学 Python、Java 还是 JavaScript,只要把这条主线上的概念吃透,换语言时只需要对照着查差异就行,不需要从头学一遍。
2. 核心细节解析与高频易错点
2.1 变量:存数据之前,先想清楚这个名字的作用域
变量这个概念,教科书爱说“变量是内存中一块存储区域的命名引用”,这没错,但对初学者来说反而绕。我更喜欢用“贴了名字的盒子”这个类比:
一个盒子里装了一个值,盒子上贴了个标签,标签就是变量名。你用标签去找盒子里的值,而不是直接去翻内存地址。给盒子重新赋值,就相当于把盒子里的旧东西倒掉,换上新东西,而不是换个盒子。
这个类比能解释两个新手最常见的困惑。一是“为什么要给变量起有意义的名称”——因为你要靠名字记住这个盒子里装的是什么交易,叫total_price比叫t好一百倍,别在 Day 2 就养成起烂名的习惯。二是“a = a + 1 到底怎么读”——这不是数学等式,而是“从名为 a 的盒子里取出当前值,加上 1,再把新值放回同一个盒子”,读作“把 a 自增 1”更准确,其中右侧的 a 先被取值、左侧的 a 是赋值目标,这是理解后续所有复杂表达式的基础。
不过,类比归类比,有两点必须跟新手说清楚,否则会形成误解。第一,变量名不是盒子本身,它只是一张标签,同一个标签可以贴到不同盒子上(在有些语言里叫“引用”),所以两个变量名完全可能指向同一个内存对象,修改其中一个会影响另一个——这个概念 Day 2 不需要深挖,但至少别把“复制”和“引用”瞎理解为一个东西。第二,变量必须先赋值再使用,很多语言里直接用未赋值的变量会直接报错,或者是拿到一个特殊值(比如 Java 的 null、Python 的 NameError),这条规则和“先开盒子才能取东西”的生活常识完全一致,非常好记。
实践时还有个容易忽视的细节:变量命名规则。大多数现代语言都要求变量名只能包含字母、数字、下划线,且不能以数字开头,不能是语言保留字(if、for、while这些)。我记得有个学员把变量起名为class,结果程序直接报语法错误,他对着屏幕看了十分钟才反应过来——这种低级错误一次就能长记性。
2.2 数据类型:为什么不能把“1”和“1”混为一谈
数据类型可能是 Day 2 最容易被“跳过”的知识点,因为很多教程的示例都显得“不用类型也能跑”。但我强烈建议 Day 2 就把类型当成头等大事来理解,原因很简单:程序中绝大多数的错误,源头都是“类型比你预期的要窄”。
初学者最需要掌握的几类基础类型就够用了:整数(int)、浮点数(float,也就是小数)、字符串(str,一串文本)、布尔值(bool,True/False)以及列表(list,一串元素的集合)。我见过最好用的类比是:“整数是整数,小数是小数,文本是加了引号的文本,布尔值是是/否开关。”关键是第二句话——文本必须加引号,1和"1"在程序里根本不是同一个东西。前者是数字,能直接参与加减乘除;后者是文本,只能拼接,你一写"1" + 1就会报错。
这里我要强调一个 Day 2 最容易踩、也最容易被人忽略的坑:输入数据的类型永远是字符串。几乎所有语言的默认输入函数返回的都是字符串。比如让你输入年龄age = input("请输入年龄:"),你得到的是"20",不是数字20。如果你直接拿它去比较age >= 18,很多语言会报类型错误,或者比较结果完全不符合预期。正确做法是先转换类型:age = int(input("请输入年龄:"))。这个坑几乎每个新人都踩,踩过一次之后就再也不会忘。
另外,不同语言对类型的“宽容度”差别很大,这也是新手换语言时最容易懵的地方。Python 这种动态类型语言,变量可以今天存整数、明天存字符串,解释器不拦你;Java、C 这类静态类型语言则要求你先声明“这个变量只能装整数”,之后再塞别的值就直接编译失败。Day 2 你不需要背这两种风格的优劣,只需要记住:动态类型写起来快但容易藏错,静态类型写起来啰嗦但编译器帮你挡了一堆低级错误。先把你正在学的语言的规则搞清楚就够了。
2.3 运算符:算数运算符好懂,比较和逻辑运算符才是重灾区
算数运算符(+ - * /)跟数学课差不多,大多数人看一遍就会,难点在“字符串能不能用加号”——大多数语言里可以,表示拼接,"hello" + " " + "world"结果就是"hello world"。真正容易翻车的是比较运算符和逻辑运算符。
比较运算符(> < >= <= == !=)第一个坑是“等于”的写法:判断相等是两个等号==,单等号=是赋值。这个问题我在批改作业时反复出现,if score = 100:这种写法在 Python 里直接就语法错误,在 C 系语言里甚至不报错,把 100 赋给 score 再判断真值,导致逻辑永远是对的,极其隐蔽。第二个坑是“链式比较”的歧义,数学里的0 < x < 10在 Python 里完全合法,在 JavaScript 里却是先算0 < x得到 bool 值再跟10比较,结果永远为true,完全不是你想要的意思。
逻辑运算符(and、or、not,在 C 系语言里写作&&、||、!)是 Day 2 理解起来最费劲的一块,因为它的运算对象是“布尔逻辑”,而不是具体数字。我给新人的解释是:逻辑运算符连接的是几个条件判断,把它们拼成一个更长的“总条件”。比如“及格线判定”要同时满足“分数不小于 60”和“没作弊”,就是score >= 60 and not cheat_flag。
还有一个细节是运算符的短路特性(short-circuit):and左侧一旦是假,右侧就不会执行;or左侧一旦是真,右侧就不会执行。这个特性 Day 2 理解不了也没关系,但必须知道它存在,因为不少人上了专业课还是靠踩坑才明白。打个比方,False and whatever()里 whatever 函数根本不会被调用,这在后面写防御性代码时很有用。
2.4 流程控制:顺序、条件、循环是程序的“三原色”
程序的执行逻辑归根结底就三件事:按顺序往下走(顺序结构)、分岔路(条件或分支结构)、绕圈走(循环结构)。Day 2 的核心任务就是把三原色的写法练熟。
条件判断的核心语法是if / elif / else(以 Python 为例),它的执行逻辑非常像“电闸分路”:从上往下依次检查每个条件,命中第一个为真的分支就执行里面的代码,剩下的分支不再看。这里新手最爱犯的错是条件顺序。举例:判断成绩等级,如果先写if score >= 60:再写if score >= 90:,那 95 分的人会走进第一个分支,根本到不了第二个。正确顺序是“先写更严格的条件,再写更宽松的条件”,也就是先判score >= 90。
循环则是 Day 2 最容易产生“我懂了但写不对”感觉的部分。for循环适合“确切知道要循环几次”的场景,比如遍历一个有 5 个元素的列表;while循环适合“循环次数不确定,但知道什么时候该停”的场景,比如不断让用户输入,直到输入 quit。我的经验是先让新手用for循环把“重复做某事”的感觉建立起来,到后面学到列表和字典时,你才发现循环简直是跟容器类型配合的天作之合。
循环里还有一个经常被忽略的细节:循环体怎么把累积的结果带出来。比如求和,你得在外面先定义total = 0,循环里每轮total = total + 1或i,最后打印 total。这个“累计变量”的写法是许多新人的盲区,觉得循环只是做了一遍一遍又一遍的事,忘了把结果收集下来。如果 Day 2 能把“累加器”这个写法搞明白,后面学统计分析会轻松非常多。
2.5 函数与作用域:把“重复的代码”变成“可复用的零件”
函数是 Day 2 的绝对重点,也是真正的难点。我不敢说所有新手一下午就能吃透,但它至少要达到“能写出一个带参数、带返回值的简单函数”的水平。
我对函数的定义是“给一段逻辑起个名字,以后通过名字调用它,还可以给它传入口数据,它把结果返回给你”。类比可以是“一个榨汁机”:你投进去水果(参数),它转几圈(函数体),出来果汁(返回值)。你不需要每次喝果汁都重新发明榨汁机,调用一次make_juice("苹果")就行。
写函数最核心的思维转变是“把动作拆出来”,跟写流程代码完全不同。新手经常犯的错是“把所有事都写在主流程里”,不写函数,看起来也能跑,但代码一旦超过一百行就乱成一锅粥。Day 2 我唯一的硬性要求是:凡是在一个程序里出现两次以上的重复逻辑,必须抽成函数。这是成本最低、收益最明确的工程化习惯。
作用域这个概念,DAY2 时可以简化成一句话:“函数内部用到的变量,默认只在函数内部有效,外面拿不到。”为什么要有这规矩?因为程序大了之后,如果所有变量都全局可改,你都不知道哪一行把你的值改了,排查起来是灾难。作用域隔离就像是每个函数有自己的“小房间”,避免你乱动别人的东西。至于全局变量和局部变量怎么互相访问,不同语言细节有差异,但“函数内优先从自己房间找,找不到再看外面”是绝大多数语言都遵守的原则。
让我特别提醒一个 Day 2 常犯的“引用 vs 复制”问题:传参时,如果你传入的是列表这种可变对象,函数内部对它修改往往会“传染”给外面的原列表,这在很多语言里都一样,是一个极其阴险的隐性坑。如果暂时理解不了“为什么”,至少记住判断标准:函数里对参数的修改行为,如果作用于对象本身(比如.append()),外面会被影响;如果是重新给参数赋值,外面通常不受影响。这比背一堆“值传递/引用传递”的概念更实用。
2.6 缩进与代码块:看着像形式要求,其实是语法的一部分
如果只能选一个 “Day 2 一定要强调的语法细节”,我选缩进。
Python 用缩进来表示“哪些代码是一个块”,这件事对新手来说非常不直观。在很多其他语言里(JavaScript、Java、C),代码块是靠花括号{}来划分的,缩进只是好看,不缩进程序也能跑;而 Python 的缩进是语法的一部分,缩进错了程序直接崩。
不少从别的语言转来学 Python 的新手,第一个小时里有三次报错都来自缩进。常见情况:
if条件下一行忘了缩进,报IndentationError: expected an indented block- 缩进混用了 Tab 和空格,报
TabError或者死活编译不过去,尤其在编辑器里根本看不出来 - 函数体里的代码没有统一缩进,导致函数只包含第一行,后面全变成“全局代码”,逻辑全错
我的建议是:编辑器的缩进方式统一设置为“4 个空格”,并且在设置里开启“显示空白字符”,把 Tab 和空格的差异可视化。这条建议没什么技术含量,但实际操作中能帮人省下大量掉头发时间。
2.7 注释与命名:没人逼你写,但你迟早要为不写付出代价
Day 2 的语法清单里往往没有“注释”这个项目,但我觉得它必须算进基础语法的一部分。注释就是写给未来的自己和其他人看的人话,机器执行时忽略它。
新手通常有一种“我的代码这么简单,注释什么”的心理。但过两个星期再看自己写的代码,大部分人都得花很长时间才想起来当初这个变量是干嘛的、这个分支为什么这样写。所以我的建议是:Day 2 不要求每个函数都写正式文档注释,只需要在关键逻辑处写一句“为什么这样做”,比如注释里写# 这里除以 2 是因为坐标要取中心点,而不是写# 定义变量 x,后者是废话。
命名和注释是同一枚硬币的两面。给变量起名尽量“一眼懂”:user_count好过uc,is_valid好过flag。很多语言里都有“匈牙利命名法”或“驼峰命名法”的历史演变,Day 2 不用卷这些,只要起名符合真实语义就行。等代码量大了你才会发现,清晰命名才是最大的注释。
3. 实操过程与核心环节实现——用一套完整小案例串完 Day 2 语法
光讲概念没用,我一般会让新人写一个“迷你评分系统”,这个练习几乎覆盖了 Day 2 全部知识点,而且写完会很有成就感。
3.1 需求描述与拆解
需求是这样的:
- 反复让用户输入一个学生的考试成绩(0-100)
- 输入
-1表示结束 - 每次输入后,自动说出该成绩的等级(优秀 90+,良好 80-89,及格 60-79,不及格 <60)
- 结束之后,统计一共输入了几个学生、平均分是多少
这个需求里,你需要用到的语法正好是 Day 2 清单:变量存输入值、数据类型转换、比较和逻辑运算符、条件分支、循环、累加器、循环终止条件,以及一个“把等级判断封装成函数”的机会。
3.2 不带函数的版本先跑通
先不要一上来就写函数,把主流程写顺,这也是我推荐新人的行动路径:先跑通逻辑,再重构抽象。
total_score = 0 # 累加器:存总分 count = 0 # 累加器:存人数 while True: score_str = input("请输入成绩(-1退出):") score = int(score_str) # 类型转换 if score == -1: break # 判断等级 if score >= 90: grade = "优秀" elif score >= 80: grade = "良好" elif score >= 60: grade = "及格" else: grade = "不及格" print(f"该成绩属于:{grade}") # 更新累加器 total_score = total_score + score count = count + 1 if count > 0: avg = total_score / count print(f"共录入 {count} 名学生的成绩,平均分是 {avg:.1f}") else: print("没有录入任何成绩")我带着学员一行一行过这段代码时,会重点强调几个地方:
一是while True搭配break的写法,这是“未知次数循环”最经典的模式。这里True表示永远为真,循环会一直转,直到执行到break才退出。新手常问“为什么不直接用while score != -1”,原因是你不知道用户下一次会不会输入 -1,只有真正输入之后判断才有意义,这种while True + break的写法表达“在循环中途根据条件退出”更自然。
二是score的类型转换。你如果不写int(score_str),拿到的就是字符串"85",后面score >= 90会直接报错,因为字符串不能和整数比较。这是 Day 2 必踩的现场演示。
三是条件分支的顺序。if score >= 90写最前面,然后是elif score >= 80,这样 95 分只匹配第一支,不会被 80 分那支截胡。如果反过来先写if score >= 80再写elif score >= 90,那么 95 分的人会拿到“良好”,这个顺序问题属于“运行没错但结果错”的典型——比报错更讨厌。
四是累加器的位置。total_score = total_score + score写在循环体内部,每次循环都会被更新一次;写在外面就只会执行一次,完不成统计任务。
3.3 把等级判断抽成函数
主流程跑通后,再把它“重构”成带函数的版本。重构的过程比写第一版更能训练抽象思维。
def get_grade(score): # 输入分数,返回等级字符串 if score >= 90: return "优秀" elif score >= 80: return "良好" elif score >= 60: return "及格" else: return "不及格" total_score = 0 count = 0 while True: score_str = input("请输入成绩(-1退出):") score = int(score_str) if score == -1: break print(f"该成绩属于:{get_grade(score)}") total_score += score # 简写形式,等价于 total_score = total_score + score count += 1 if count > 0: avg = total_score / count print(f"共录入 {count} 名学生的成绩,平均分是 {avg:.1f}") else: print("没有录入任何成绩")对比两个版本,函数版本的get_grade(score)就是把原来那串 if/elif/else 逻辑抽出来,封装成“给一个分数,还你一个等级”的零件。这样主流程变得更简短、可读性更高,而且将来想改等级规则(比如 85 就算优秀),只需要改一处,而不是在循环里翻来翻去。
这里还有个细节:total_score += score是total_score = total_score + score的简写。+=、-=、*=这类复合赋值运算符也是 Day 2 常用语法,建议当场让学生手写一遍等价关系,别光看着眼熟。我发现不少人在读别人代码时看到+=会愣住,就是因为第一天没做这个换算练习。
3.4 带函数的版本要讲的一个“坑”
在这个例子里,函数get_grade很简单,参数 score 和主流程里的变量 score 重名,但它们是两个完全独立的变量——一个在函数内部,是函数的参数;一个是主流程里通过 input 得到的变量。它们各自存在自己的作用域里,互不干扰。
这个“重名不冲突”的现象,几乎人人第一次看到都会疑惑:这不是同一个 score 吗?为什么改了一个,另一个不受影响。我通常这样解释:调用get_grade(score)时,程序只是把主流程 score 的值“复制”了一份交给函数参数,函数内部对参数做的任何修改,都不会改变主流程里那个 score。这个例子特别适合用来建立“参数传递是值的复制”这个直觉,虽然它不适用于所有语言的所有数据类型,但作为 Day 2 的认知起点是没问题的。
上面的练习跑通后,我还会让学员改两个变体:一是把-1退出改成“输入 q 直接退出”,这样要处理字符串类型判断;二是加一个“统计最高分”的功能。变体练习的目的是防止“照猫画虎”,逼你把语法在稍微不同的场景里再用一次,这种迁移练习最终比刷一百道填空题有用得多。
4. 常见问题与排查技巧实录
4.1 高频报错速查表
Day 2 的报错,翻来覆去就那么几种,我把最常见的一组整理成了速查表,每一条都是我见过真人踩的次数最多的:
| 报错信息 | 常见原因 | 排查思路 |
|---|---|---|
SyntaxError | 语法错误,少写了括号、引号、冒号,或者用了中文标点 | 看报错行号,前后各看一行,八成是漏了:或者引号没闭合 |
IndentationError | 缩进不对,该缩进的没缩进,或者不该缩进的多了缩进 | 检查 if/for/while/def 后面的代码块是否统一缩进 |
TabError | Tab 和空格混用了 | 编辑器里开启“显示空白字符”,把所有 Tab 统一替换成 4 个空格 |
NameError | 变量名拼写错误,或者用了未赋值的变量 | 检查变量名拼写,确认先赋值再使用导致报错 |
TypeError | 类型不匹配,比如字符串和数字做加法 | 用type()查看变量的类型,先转换再计算 |
ZeroDivisionError | 除以 0 | 检查除数是否可能为 0,循环中尤其要留意累加器所在位置 |
这里需要特别说一下“中文标点”这个看起来荒谬、实际超高发的坑。中文输入法状态下写出来的,和;在多数编程语言里都不被识别,开头的第一行就报SyntaxError。这种问题代码编辑器一般会高亮红色,但新手经常找不到原因。解决方法是:写代码时直接把输入法切成英文状态,或者用代码编辑器的“保存时自动替换中文标点”功能。这个提醒我几乎每次课都要说,每次上课都有人踩。
4.2 逻辑对但结果错的排查思路
比“报错”更让新手崩溃的是“不报错但结果不对”。这种题目很典型:代码跑完了,输出跟预期差一点,但又不知道差在哪。我给新人的建议是练三个排查习惯:
第一,打印中间变量。这是最原始也最有效的调试手段。在怀疑出错的位置插一行print("变量名 =", 变量),看是不是跟你想的一样。就在上面评分系统例子里,你可以打印score看是不是 int 类型,打印total_score看每轮累加是否正确。学到“调试器”之前,print 就是你的第一帮手。
第二,用“小人模拟法”走查代码。拿起笔纸,自己扮演 CPU,按顺序逐行执行代码,把所有变量的值写在纸上的表格里。这看起来笨,但其实是建立“程序执行模型”最有效的方式。很多学员做了三次走查之后,就再也不怕“为什么结果不对”这种问题了,因为他们能自己头脑里跑代码了。
第三,拆半查找。当一段逻辑比较长时,在中间位置加打印,先判断“前半段对不对”,如果对就把怀疑范围缩到后半段,再在后半段中间加打印,如此反复,初学者排查速度极快。很多新人习惯从头到尾一行行看,其实不如这种二分式排查高效。
4.3 一个现场排查小案例
我拿一个真实案例来收尾这个过程,这种记录最直观。
某个学员写了这么一段:
n = 5 for i in range(5): print(n) n += 1他预期输出 5、6、7、8、9,实际输出也是 5、6、7、8、9,但他困惑的是:n += 1写在 print 之后,为什么第一次就输出了 5 而不是 6?他的真正困惑点是“循环体一执行,n 是不是就该先变”。其实这里print(n)在n += 1之前,先打印当前 n 值,再加 1,所以第一轮打印的是未修改的 5。
排查这类问题,我让他用“小人模拟法”把每一轮循环的 n 变化写出来:
| 轮次 | 进入循环时 n | print 输出 | 执行 n+=1 之后 |
|---|---|---|---|
| 1 | 5 | 5 | 6 |
| 2 | 6 | 6 | 7 |
| 3 | 7 | 7 | 8 |
| 4 | 8 | 8 | 9 |
| 5 | 9 | 9 | 10 |
表格一出来,他立刻懂了。这个例子提醒我们:循环不是同时执行所有语句,而是把循环体里的代码从上到下依次执行,执行完一轮再回到顶部执行下一轮。这个执行时序,是 Day 2 循环学习中最关键的心理模型,比背多少循环语法都有用。
4.4 Day 2 最容易被忽略的三个小技巧
- 把长字符串拆成多行拼接。当一个字符串特别长时,别硬堆一行,用“字符串拼接”拆开,例如
print("统计结果:" + str(total))或者 f-string 写法print(f"统计结果:{total}")。f-string 在 Python 里是 Day 2 就能用的强力工具,读代码效率高不少。 - 不要用
input()做数学题。输入得到的是字符串,你需要转换类型,这个习惯一旦在 Day 2 建立好,能帮你避免接下来半年绝大部分类型错误。 - 小步快跑,每几行就运行一次。“一次写好几十行再运行,然后报错不知道在哪”是新手最浪费时间的行为。改成每写一个分支、一个循环就运行测试,报错能精准定位到刚刚写的几行里,整个 Day 2 作业的完成时间至少缩短一半。
Day 2 的基础语法,说白了就是“给逻辑搭骨架”的那点东西。变量、类型、运算符、条件、循环、函数,这些概念放在一起看有点吓人,逐项拆开逐个练,每一样其实都只需要二十分钟的投入。我见过太多人在第二天晚上焦虑到失眠,觉得自己“就是个写不了代码的料”,但事实是,绝大多数人只是没搞懂“先赋值再使用”“字符串要转换”“条件分支顺序”“循环体顺序”这四个小坑。
把这一天的内容过完,你手上已经有了足够的基础语法去写任何“输入-处理-输出”的小程序,比如自动计算器、猜数字游戏、成绩统计这种。下一步不管是去啃列表、字典,还是学面向对象,都能站得稳。我个人带人时的体会是,Day 2 最后不要贪多,核心目标只有一个:你能够合上资料,独立写出一个包含循环、条件、函数的小程序。做到这一点,你就已经赢过了绝大多数第一次尝试学编程的人。