开始前需要什么 不需要任何编程经验。你不用先知道什么是变量或循环,每个词第一次出现时,课里都会解释。 一台带现代浏览器的电脑、平板或手机。第一次点“运行”时需要联网,因为页面要下载 Python(约 10 MB,只下载一次)。 学校里学过的算术:数的加减乘除,以及比较哪个数更大。 想在自己的电脑上运行程序时(一开始可以不做):一台允许你安装软件的 Windows、macOS 或 Linux 电脑。 时间:如果每个例子都亲手输入,并做完自测题,每课大约需要半小时。 本篇目录 程序是什么,运行你的第一行代码 值、变量名和 print 文字:拼接、计数和变换 用 if 做判断 用 for 和 while 重复 列表 函数 读懂报错信息并修好程序 准备你的电脑 一开始可以跳过:下面的例子在这个页面上就能运行。
开始学习不需要安装任何东西。每节课里的“运行”按钮,会在你的浏览器里运行一份真正的 Python。等你想把程序保存成文件、在自己的电脑上运行时,再回到这一节。
步骤很短。先安装 Python,再让它报出版本号,证明它能用。然后把一行程序保存成名为 hello.py 的文件并运行。终端是一个窗口:你在里面输入命令,它在下面回复文字。Windows 里叫 PowerShell,macOS 里叫“终端”(Terminal)。
请使用 Python 3.10 或更新的版本,python.org 下载页上最新的版本就很合适。Python 2 早已停止维护,程序的写法也不一样。如果课里的结果和你看到的不同,先检查版本。
有一个小区别:在 Windows 上输入 python,在 macOS 和 Linux 上输入 python3。下面每个系统都会告诉你该输入哪一个。
Windows 在浏览器里打开 python.org/downloads,点击 Download Python install manager。打开下载好的文件(文件名以 .msix 结尾),点击 Install(安装)。Python 官方文档对 Windows 10 及更新的系统推荐这种方式。你也可以在 Microsoft Store 里安装同一个程序:搜索 Python Install Manager。
打开一个新的终端:点击“开始”,输入 PowerShell,按回车。如果安装之前就开着终端,请先关掉再重新打开。旧窗口不会发现在它启动之后才装好的程序。
输入下面这一行,按回车。第一次运行时,安装管理器可能会先下载 Python 本体,并请你确认。接受默认选项,耐心等待。 python --version
在文件资源管理器里新建一个文件夹,名字叫 python-practice,例如放在桌面上。
打开“记事本”(开始,输入 Notepad)。输入下面这一行: print("Hello, Python!") 点击“文件”,再点“另存为”。打开“保存类型”菜单,选择“所有文件”。文件名输入 hello.py,保存位置选 python-practice 文件夹,然后点击“保存”。
在文件资源管理器里打开 python-practice 文件夹。点击顶部的地址栏,输入 powershell,按回车。一个终端会在这个文件夹里打开。输入: python hello.py 下一行应该显示 Hello, Python!。如果提示找不到文件,文件名可能变成了 hello.py.txt。在文件资源管理器里点击“查看”,再点“显示”,勾选“文件扩展名”,然后重命名文件。
检查是否成功
python --version 你应该看到 类似 Python 3.15.2 的一行。只要是 3.10 及以上的版本都可以,数字可能和这里不同。
macOS 在浏览器里打开 python.org/downloads,下载 macOS 安装包(.pkg 文件)。打开它,按提示一步步安装。安装时会要求输入 Mac 的登录密码,因为 Python 是装给这台电脑所有用户的。你的 Mac 里本来有苹果自带的一份 Python,但它版本较旧,是给苹果自己的工具用的。请使用 python.org 的这一份。
打开“终端”:同时按 Command 和空格键,输入 Terminal,按回车。如果安装时就开着终端窗口,请重新打开一个新窗口。
输入下面这一行,按回车。在 macOS 上命令是 python3,不是 python。如果弹出窗口提示安装开发者工具,请点“取消”,并检查第 1 步是否已经安装完成。 python3 --version
直接在终端里新建文件夹和文件。下面的命令一行一行输入,每行输完按回车: mkdir python-practice cd python-practice nano hello.py 最后一行会打开 nano,这是一个在终端里运行的小型文本编辑器。
在 nano 里输入这一行: print("Hello, Python!") 然后按 Control 和 O(字母 O),再按回车确认文件名,最后按 Control 和 X 退出 nano。
运行程序: python3 hello.py 下一行应该显示 Hello, Python!。
检查是否成功
python3 --version 你应该看到 类似 Python 3.15.2 的一行。只要是 3.10 及以上的版本都可以,数字可能和这里不同。
Linux 大多数 Linux 系统已经自带 Python 3,所以请先做第 3 步的检查。如果检查失败,再用系统的软件包管理器安装。Debian 和 Ubuntu: sudo apt update sudo apt install python3 Fedora: sudo dnf install python3 Arch Linux: sudo pacman -S python sudo 命令会要求输入密码。输入密码时屏幕上不会显示任何字符,这是正常的。
打开一个终端。在很多桌面环境里,同时按 Control、Alt 和 T 就能打开。否则,在应用程序里搜索“终端”(Terminal)。
输入下面这一行,按回车。 python3 --version
新建文件夹和文件。下面的命令一行一行输入,每行输完按回车: mkdir python-practice cd python-practice nano hello.py 最后一行会打开 nano,这是一个在终端里运行的小型文本编辑器。
在 nano 里输入这一行: print("Hello, Python!") 然后按 Control 和 O(字母 O),再按回车确认文件名,最后按 Control 和 X 退出 nano。
运行程序: python3 hello.py 下一行应该显示 Hello, Python!。
检查是否成功
python3 --version 你应该看到 类似 Python 3.12.3 的一行。3.10 及以上的版本都可以。更老的版本也能运行这些代码,但报错信息没有这么清楚。
如果看到报错 python : The term 'python' is not recognized as the name of a cmdlet, function, script file, or operable program.Windows 找不到 Python。要么还没有安装,要么这个终端窗口是在安装之前打开的。关掉终端,重新打开一个,再试一次。
如果仍然不行,请重做 Windows 的第 1 步。然后点击“开始”,搜索“管理应用执行别名”(Manage app execution aliases),确认 Python (default) 的开关是打开的。你也可以试试 py --version,有时 python 不行而 py 可以。
Python was not found; run without arguments to install from the Microsoft Store, or disable this shortcut from Settings > Manage App Execution Aliases.在装好 Python 之前,Windows 会在 python 这个名字下放一个占位的快捷方式。请按 Windows 的第 1 步安装 Python,再打开一个新终端重试。如果消息还在,打开“管理应用执行别名”,确认 Python (default) 的开关是打开的。
zsh: command not found: pythonmacOS 里没有名叫 python 的命令。请改输 python3,例如 python3 --version 和 python3 hello.py。
bash: python: command not found在 Linux 上命令是 python3。有的系统会显示 Command 'python' not found, did you mean 之类的提示,意思相同。在 Debian 和 Ubuntu 上,你也可以运行 sudo apt install python-is-python3,这样 python 也能用。
zsh: command not found: python3没有安装 Python 3,或者安装没有完成。macOS:重做第 1 步,并打开新的终端窗口。Linux:用软件包管理器安装(Linux 的第 1 步),此时 bash 显示的是 bash: python3: command not found。Windows:输入 python,不要输入 python3。
python3: can't open file '/home/mia/hello.py': [Errno 2] No such file or directoryPython 本身没问题,只是在终端当前所在的文件夹里找不到你的文件。先看看终端在哪个文件夹:macOS 和 Linux 用 ls 列出文件,Windows 用 dir,看有没有 hello.py。如果没有,用 cd python-practice 进入文件夹,或者像 Windows 第 6 步那样直接从文件夹里打开终端。
再检查拼写。文件名必须正好是 hello.py,不能是 Hello.py,也不能是 hello.py.txt。在 Windows 上,请在文件资源管理器里打开“文件扩展名”(查看,显示),就能看到真实的文件名。
IndentationError: unexpected indent某一行开头多了 Python 没预料到的空格。Python 用每行开头的空格来给代码分组。请删掉多余的空格,让这一行和上一行对齐。只有紧跟在以冒号结尾的那一行之后,才应该往右缩进四个空格。
相反的提示 IndentationError: expected an indented block after 'if' statement on line 2,意思是以冒号结尾的那一行下面没有缩进的内容。请补上四个空格。不要把 Tab 字符和空格混着用,否则 Python 会报 TabError。第 4 课会讲缩进。
SyntaxError: invalid syntaxPython 看不懂某一行的写法,所以整个程序一行都没有运行。看一看报错里的行号,以及这一行下面的 ^ 标记。错误就在那个位置,或者在它的前面一点。常见原因有:漏了冒号,漏了引号或括号,从文档里复制来的弯引号,以及不带括号的 Python 2 式 print。
其他以 SyntaxError 开头的消息,例如 SyntaxError: unterminated string literal (detected at line 1),说得更具体,会告诉你哪里不对。第 8 课会一步步教你读懂它们。
01
程序是什么,运行你的第一行代码 学完你能 在本页运行一个 Python 程序,并改掉它显示的文字。
程序是一串写给计算机的指令。计算机不会猜你的意思,所以每条指令都要用它能看懂的语言来写。Python 就是这样的一种语言。
计算机一次执行一条指令,从最上面一行到最下面一行。运行程序,就是让计算机去执行这些指令。程序显示给你看的内容,叫作输出。
你的第一条指令是 print。它让 Python 在屏幕上显示一点东西。要显示的内容写在圆括号里。如果内容是文字,就要用引号把文字包起来。引号告诉 Python:这几个词是文字,不是指令。
现在来运行一次。点击下面代码下方的“运行”按钮。第一次点击时,页面要下载 Python,需要几秒钟。输出会出现在代码下面。然后点击“修改代码”,改掉引号之间的文字,再点击“运行”。你在这里输入的任何内容都不会损坏你的电脑,点“还原”就能回到原来的代码。
新词
程序 一串写给计算机的指令。
Python 一种写法容易读懂的编程语言。
运行 让计算机去执行程序里的指令。
输出 程序运行时显示或写出的内容。
print 一条 Python 指令,把你交给它的内容显示出来。
引号 文字两边的 " "。它们告诉 Python 这些词是文字。 完整例子 Python 3 复制代码
print ( "Hello, Leon!" )
先预测输出,再看结果 逐步讲解 Python 读取这一行。print 这个词,Python 本来就知道该怎么做。
圆括号 ( ) 里放的是 print 要显示的内容。括号之间的东西会交给 print。
引号告诉 Python:Hello, Leon! 是文字。没有引号的话,Python 会去找一条叫 Hello 的指令,找不到就出错。
print 显示文字时不带引号,显示完再换到新的一行。输出就是 Hello, Leon!
动手试试:点击“修改代码”,把 Leon 改成你自己的名字,再点“运行”。然后再加第二行 print("It works!"),重新运行。各行按你写的先后顺序出现。
常见错误 Python 把大写字母和小写字母当作不同的字母。它认识 print,不认识 Print。报错是:NameError: name 'Print' is not defined. Did you mean: 'print'? Python 甚至把改法都提示给你了。
少了结尾的引号,Python 不知道文字到哪里结束。报错是:SyntaxError: unterminated string literal (detected at line 1)。每个开头的引号都要有同一种的结尾引号,每个左括号都要有右括号。
把代码从文字处理软件或网页里复制出来时,常常会混进这种弯引号。Python 只接受直引号 " 或 '。报错是:SyntaxError: invalid character '“' (U+201C)。
为 Python 2 写的旧教程里,print 不带括号。在 Python 3 里必须带括号。报错是:SyntaxError: Missing parentheses in call to 'print'. Did you mean print(...)?
检查自己 把程序改成向 Mia 问好,而不是向 Leon。写出完整的一行。
先自己做,再看答案 print("Hello, Mia!")。只有引号之间的文字变了。
写一个两行的程序,第一行显示 Start,第二行显示 Finish。如果把两行对调,输出会变成什么?
先自己做,再看答案 print("Start") print("Finish") 对调之后,先显示 Finish,再显示 Start,因为 Python 按从上到下的顺序执行各行。
02
值、变量名和 print 学完你能 把数字存到变量名下,用它们做算术,并把结果显示出来。
值就是一条信息,例如数字 12 或者单词 Mia。Python 里有不同种类的值。像 12 这样的整数叫整型(integer)。像 2.5 这样带小数点的数叫浮点数(float)。文字叫字符串(string),你在第 1 课已经写过一个,就是引号之间的那段文字。
变量是你贴在一个值上的名字,这样以后就能用这个名字找到这个值。变量用等号来创建。price = 4 这一行的意思是:拿到值 4,给它起名叫 price。在数学里,= 表示两边相等。在 Python 里,它是一条“存起来”的指令。Python 先算出右边,再把结果存到左边的名字下。变量名可以包含字母、数字和下划线,不能以数字开头,不能含有空格。请起一个能说明这个值是什么的名字。
之后,凡是能用这个值的地方,都可以改用它的名字。total = price * 3 这一行先算出 4 乘以 3,再把 12 存到名字 total 下。算术符号是:+ 加,- 减,* 乘,/ 除。圆括号控制运算顺序,和学校里的数学一样。用 / 做除法,结果总是浮点数,所以 10 / 4 是 2.5,10 / 2 是 5.0。
要当心:变量保存的是一个值,不是一条规则。如果 total 是用 count 算出来的,之后你改了 count,total 仍然是旧值,直到你重新计算一次。例子里会演示这一点。
print 可以一次显示好几样东西。用逗号隔开,print 会在各部分之间写一个空格。以 # 开头的一行是注释,Python 会忽略它。注释是写给读代码的人看的备注。
新词
值 一条信息,例如 12 或 "Mia"。
整型(整数) 像 12 或 -3 这样的整数。
浮点数 带小数点的数,例如 2.5。
字符串 程序里的文字,写在引号之间。
变量 贴在一个值上的名字。
赋值 用 = 把一个值存到一个名字下。
注释 以 # 开头的备注,Python 会忽略它。 完整例子 Python 3 复制代码
# total cost of the notebooks
price = 4
count = 3
total = price * count
print ( "Total:" , total )
count = 5
print ( "Still:" , total )
total = price * count
print ( "Now:" , total )
先预测输出,再看结果 预期输出 Total: 12
Still: 12
Now: 20 逐步讲解 第一行是注释,说明这段代码是做什么的,Python 会跳过它。意思是“笔记本的总价”。
price = 4 把整数 4 存到名字 price 下。count = 3 对 count 做同样的事。
在 total = price * count 里,Python 先算右边。price 是 4,count 是 3,结果是 12。Python 把 12 存到名字 total 下。
print("Total:", total) 先显示文字 Total:,再显示一个空格,再显示值 12。
count = 5 给 count 一个新值,旧值 3 就没有了。但 total 是之前算好的,所以它仍然是 12。print("Still:", total) 这一行证明了这一点。
total = price * count 把右边重新算了一遍,也就是 4 乘以 5,并存入 20。print 显示 Now: 20。
动手试试:点击“修改代码”,把 price 改成 2.5,再运行。总价会变成浮点数:7.5、7.5 和 12.5。
常见错误 名字写在左边,值写在右边。数字不能当名字用。报错是:SyntaxError: cannot assign to literal here. Maybe you meant '==' instead of '='?
错误写法 print(total)
total = 5 Python 从上到下执行各行。到第一行的时候,total 还不存在。报错是:NameError: name 'total' is not defined。要先创建变量,再使用它。
正确写法 total = 5
print(total) 变量名里不能有空格。Python 看到两个名字挨在一起,不知道是什么意思。报错是:SyntaxError: invalid syntax。请用下划线把单词连起来。
错误写法 price = 4
count = 3
total = price * count
count = 5
print(total) 这段代码打印的是 12,不是 20。没有任何报错,所以更难发现。total 只算了一次,一直是 12。改了 count 之后,要把 total 重新算一遍。
正确写法 price = 4
count = 3
total = price * count
count = 5
total = price * count
print(total) 检查自己 预测这个程序会打印什么:
a = 2
b = a + 3
a = 10
print(b)
先自己做,再看答案 5。b 是在 a 等于 2 的时候算出来的,所以 b 是 5。之后把 a 改成 10,并不会改变 b。
写三行代码:把 9 存到名字 apples 下,把 4 存到名字 oranges 下,再打印水果的总数。
先自己做,再看答案 apples = 9 oranges = 4 print("Fruit:", apples + oranges) 输出 Fruit: 13。
预测 print(7 / 2) 和 print(8 / 2) 的输出。
先自己做,再看答案 3.5 和 4.0。用 / 做除法,结果总是浮点数,即使答案是整数也一样。
03
文字:拼接、计数和变换 学完你能 拼接几段文字,数出字符个数,改变大小写,并把值放进文字里。
字符串就是文字。写的时候用引号括起来,可以是双引号 "double",也可以是单引号 'single',只要两头一致。字符串里可以有字母、数字、空格和标点。字符串 "5" 是一段看起来像数字的文字,它不是数字 5。
用 + 可以把两个字符串连起来,这叫拼接。"Hello, " + "Mia" 得到 "Hello, Mia"。空格是第一个字符串的一部分,因为 Python 不会替你加空格。字符串和数字不能用 + 混在一起。"Age: " + 5 会出错,因为 Python 分不清你是想相加,还是想拼接。
你已经用过一个函数:print。函数是一个有名字的动作,它接收一些东西,通常还会交回一个结果。另一个函数是 len,它给出字符串里字符的个数,空格也算。方法是属于某个值的动作。写法是:值、一个点、方法名和圆括号。"Mia".upper() 得到 "MIA"。方法名必须拼写准确,而且是小写字母。方法不会改变原来的字符串,它交回的是一个新的字符串。
把值放进文字里,有一个整洁的办法,叫 f-string。在开头的引号前面紧挨着写一个字母 f,把变量名或小的计算式放在花括号 { } 里。Python 会把每对花括号换成它的值。f"{name} has {len(name)} letters" 会变成一句带着真实名字和真实字数的话。
新词
拼接 用 + 把字符串首尾连起来。
字符 字符串里的一个字母、数字、空格或标点。
函数 一个有名字的动作,接收一些东西,常常交回一个结果。print 和 len 都是函数。
方法 属于某个值的动作,写在点的后面,例如 "Mia".upper()。
f-string 开头引号前带 f 的字符串。花括号 { } 里的值会被填进去。 完整例子 Python 3 复制代码
name = "Mia"
greeting = "Hello, " + name + "!"
print ( greeting )
print ( len ( name ))
print ( name . upper ())
print ( f " { name } has { len ( name ) } letters." )
先预测输出,再看结果 预期输出 Hello, Mia!
3
MIA
Mia has 3 letters. 逐步讲解 name = "Mia" 把字符串 Mia 存到名字 name 下。
"Hello, " + name + "!" 把三个字符串连在一起:Hello, 、name 的值、一个感叹号。结果 Hello, Mia! 存到 greeting 下。此时还没有显示任何东西,print(greeting) 才会把它显示出来。
len(name) 数出字符 M、i、a,答案是数字 3。print 显示它时不带引号。
name.upper() 由值、一个点和方法名组成。它交回一个新的字符串 MIA。变量 name 仍然保存着 Mia。
在 f-string 里,{name} 被换成 Mia,{len(name)} 被换成 3,结果是一整句话。
动手试试:把 "Mia" 改成 "Noah" 再运行。四行输出都会变:Hello, Noah!、4、NOAH 和 Noah has 4 letters.
常见错误 错误写法 age = 5
print("Age: " + age) + 号不能把文字和数字连在一起。报错是:TypeError: can only concatenate str (not "int") to str。这里 str 是字符串,int 是整数。可以把数字放进 f-string 里,也可以用 str(age) 把它变成文字,写成 "Age: " + str(age)。
正确写法 age = 5
print(f"Age: {age}") 没有引号,Python 会去找一个叫 Hello 的变量。报错是:NameError: name 'Hello' is not defined。文字要加引号,变量名不加。
两边都是文字,所以 + 把它们连在一起。这段代码打印的是 55,不是 10,而且没有任何报错提醒你。想做加法,要用数字:5 + 5。
错误写法 name = "Mia"
print(name.Upper()) 方法名必须拼写准确,大写的 U 是另一个字母。报错是:AttributeError: 'str' object has no attribute 'Upper'. Did you mean: 'upper'?
正确写法 name = "Mia"
print(name.upper()) 检查自己 预测 print(len("Hello, Mia")) 的输出。
先自己做,再看答案 10。这个字符串有 Hello(5 个字符)、一个逗号、一个空格和 Mia(3 个字符):5 + 1 + 1 + 3 = 10。
写一个程序:把 "Noah" 存到名字 name 下,并打印 NOAH has 4 letters。用 f-string 组成这句话。
先自己做,再看答案 name = "Noah" print(f"{name.upper()} has {len(name)} letters.") 凡是能写在 print( ) 里的表达式,也都能写在花括号里。
04
用 if 做判断 学完你能 让程序在几种做法之间做出选择。
程序经常需要做选择。学校的应用会根据分数显示“通过”或“不通过”。选择从一个答案是“是”或“否”的问题开始。Python 把这个问题写成比较。score >= 80 问的是:score 至少是 80 吗?答案是一个叫 True 或 False 的值。这样的值叫布尔值。
比较符号有:== 等于,!= 不等于,< 小于,> 大于,<= 小于或等于,>= 大于或等于。要特别当心 ==:一个等号是存储一个值,两个等号是提出一个问题。
if 语句要用到比较。先写单词 if,再写比较,最后写一个冒号。下面几行是要执行的代码,向右缩进四个空格。把代码向右移动,叫作缩进。Python 靠缩进知道哪些行属于这个 if。缩进的行只在比较结果为 True 时才执行。回到最左边的那一行,就不再属于这个 if,它每次都会执行。
加上 else: 可以说明答案为 False 时该怎么做。加上 elif(else if 的缩写)可以在第一个答案为 False 时再问第二个问题。Python 从上往下检查这些问题,执行第一个 True 对应的代码,其余的跳过。所以问题的先后顺序很重要。
新词
比较 像 score >= 80 这样的问题,答案是 True 或 False。
布尔值 只有两种取值的值:True 或 False。
条件 写在 if 或 elif 后面的比较。
缩进 一行开头的空格。Python 用它给代码分组。 完整例子 Python 3 复制代码
score = 72
if score >= 80 :
print ( "Grade: A" )
elif score >= 60 :
print ( "Grade: B" )
else :
print ( "Grade: C" )
print ( "Done" )
先预测输出,再看结果 逐步讲解 score = 72 把 72 存到名字 score 下。
if score >= 80: 问 72 是否至少为 80。答案是 False,所以 Python 跳过它下面缩进的那一行。
elif score >= 60: 问 72 是否至少为 60。答案是 True,所以 Python 执行它下面缩进的那一行,打印 Grade: B。
因为前面已经有一个问题的答案是 True,Python 现在跳过 else 部分。三个分支里只会执行一个。
print("Done") 没有缩进。它不属于这条 if 链,所以每次都会执行。
动手试试:把 score 依次改成 95、40、80。你应该依次看到 Grade: A、Grade: C、Grade: A,因为 >= 包含 80 本身。
常见错误 错误写法 score = 80
if score = 80:
print("Exactly 80") 一个等号是存储一个值。要问两个东西是否相等,要用两个等号。报错是:SyntaxError: invalid syntax. Maybe you meant '==' or ':=' instead of '='?
正确写法 score = 80
if score == 80:
print("Exactly 80") 错误写法 score = 80
if score >= 80
print("A") if 那一行末尾漏了冒号。报错是:SyntaxError: expected ':'。引出缩进代码块的行,例如 if、elif、else、for、while 和 def,末尾都要有冒号。
正确写法 score = 80
if score >= 80:
print("A") 错误写法 score = 80
if score >= 80:
print("A") if 下面那一行没有缩进,Python 发现这个 if 里面是空的。报错是:IndentationError: expected an indented block after 'if' statement on line 2。请把这一行缩进四个空格。
正确写法 score = 80
if score >= 80:
print("A") 错误写法 score = 90
if score >= 60:
print("Grade: B")
elif score >= 80:
print("Grade: A") 这里没有报错,但是 90 分会打印 Grade: B。第一个问题“至少 60”已经是 True,所以 Python 永远走不到第二个问题。要把最严格的问题放在最前面。
正确写法 score = 90
if score >= 80:
print("Grade: A")
elif score >= 60:
print("Grade: B") 检查自己 当 score 等于 80 时,例子会打印什么?
先自己做,再看答案 先打印 Grade: A,再打印 Done。score 恰好等于 80 时,比较 score >= 80 的结果是 True。
预测输出:
x = 5
if x > 3:
print("A")
if x > 4:
print("B")
else:
print("C")
先自己做,再看答案 先输出 A,下一行输出 B。这是两个各自独立的 if 语句。第一个打印 A。第二个问 5 是否大于 4,答案是 True,所以打印 B,并跳过它的 else。
写一个程序:age 是 16。如果 age 大于或等于 18,打印 Adult,否则打印 Minor。
先自己做,再看答案 age = 16 if age >= 18: print("Adult") else: print("Minor") 输出 Minor。
05
用 for 和 while 重复 学完你能 用 for 循环和 while 循环重复执行步骤,并知道该选哪一种。
循环会重复执行一段代码。要是没有循环,把 100 个数加起来的程序就得写 100 行。Python 有两种循环。
for 循环对一组东西里的每一项各执行一次。最简单的一组东西是 range。range(1, 6) 给出整数 1、2、3、4、5。它从第一个数开始,在第二个数之前停下。range(3) 是 range(0, 3) 的简写,给出 0、1、2。写法是 for number in range(1, 6): ,然后是要重复的代码,缩进四个空格。每循环一次,number 就是下一个值。把缩进的代码执行一遍,叫作一次迭代。
while 循环在比较结果一直为 True 时重复执行。Python 在每一轮之前都会检查比较。循环内部必须有东西改变比较所看到的内容,否则它会一直是 True,这叫死循环,程序永远不会停。在终端里,按 Control 和 C 可以让它停下。在本页上,请不要运行永远不会结束的循环;万一发生,刷新页面即可。
知道要遍历什么、或者要重复多少次,就用 for。要一直重复到某件事发生为止,就用 while。一个常见的模式是累计:先让一个变量从 0 开始,在循环里不断往它上面加。
新词
循环 会重复执行的代码。
迭代 把循环里的代码执行一遍。
range 得到一串连续整数的方式,到结束数之前停止。
死循环 比较结果永远不会变成 False 的循环,所以永远不会停。 完整例子 Python 3 复制代码
total = 0
for number in range ( 1 , 6 ):
total = total + number
print ( "added" , number , "total is" , total )
print ( "Sum:" , total )
count = 3
while count > 0 :
print ( "Countdown:" , count )
count = count - 1
print ( "Liftoff" )
先预测输出,再看结果 预期输出 added 1 total is 1
added 2 total is 3
added 3 total is 6
added 4 total is 10
added 5 total is 15
Sum: 15
Countdown: 3
Countdown: 2
Countdown: 1
Liftoff 逐步讲解 total = 0 让累计值从零开始。
for number in range(1, 6): 让 number 依次取 1、2、3、4、5。range(1, 6) 在 6 之前停止。
缩进的两行会执行五次。每一次,total = total + number 把当前的数加到累计值上,print 显示进度。
print("Sum:", total) 没有缩进。它在循环结束之后只执行一次。
while 循环从 count = 3 开始。Python 在每一轮之前都会问 count > 0。对 3、2、1,答案都是 True。
count = count - 1 这一行负责改变 count。count 是 1 的那一轮结束后,count 变成 0,问题的答案是 False,循环结束,然后打印 Liftoff。
动手试试:把 range(1, 6) 改成 range(1, 11),最后的 Sum 会变成 55。把 count = 3 改成 count = 5,倒数会更长。
常见错误 错误写法 for n in range(5):
print(n) 这段代码打印 0、1、2、3、4。一共五个数,但是从 0 开始,到 5 之前停止。它没有报错,所以要自己检查输出。想要 1 到 5,要写成 range(1, 6)。
正确写法 for n in range(1, 6):
print(n) 错误写法 count = 3
while count > 0:
print(count) count 一直不变,所以 count > 0 一直是 True,程序会不停地打印 3。在终端里按 Control 和 C 可以让它停下。要在循环里改变这个变量。
正确写法 count = 3
while count > 0:
print(count)
count = count - 1 for 循环需要一组可以遍历的东西,而单独一个数字不是。报错是:TypeError: 'int' object is not iterable。要遍历 0 到 4,请用 range(5)。
正确写法 for i in range(5):
print(i) 错误写法 total = 0
for n in range(1, 4):
total = total + n
print("running total", total) 假如你想在每一步之后都看到累计值。这里的 print 和 for 对齐,所以它不属于循环,只在最后执行一次,只显示 6。缩进决定了哪些代码会被重复。
正确写法 total = 0
for n in range(1, 4):
total = total + n
print("running total", total) 检查自己 预测输出:
for i in range(3):
print(i * 2)
先自己做,再看答案 写一个循环,依次打印 10、20、30、40、50,各占一行。
先自己做,再看答案 for n in range(1, 6): print(n * 10) 另一种输出相同的写法是 range(10, 51, 10),不过你还没有学过这种形式。
预测输出:
count = 1
while count < 4:
print(count)
count = count + 1
先自己做,再看答案 1、2、3,各占一行。count 变成 4 时,问题 count < 4 的答案是 False,循环结束。
06
列表 学完你能 把多个值放在一起,按位置读取其中一个,并逐个处理所有的值。
列表把许多个值按顺序放在一个名字下。把值写在方括号里,用逗号隔开:scores = [70, 85, 90]。列表里可以放数字、字符串,也可以混着放。函数 len 告诉你列表里有多少项。
每一项都有一个位置,叫作索引。计数从 0 开始,不是从 1 开始。在 scores 里,索引 0 的项是 70,索引 1 是 85,索引 2 是 90。写 scores[0] 就能得到第一项。负的索引从末尾往前数,所以 scores[-1] 是最后一项。如果你要的位置不存在,Python 会以 IndexError 停下来。字符串也用同样的办法:"Mia"[0] 是 "M"。
列表是可以改变的。方法 append 在末尾添加一项。scores.append(60) 直接改变 scores 本身,它不交回任何东西。
for 循环可以逐项遍历列表:for score in scores: 就是第 5 课里的那种 for 循环,只是用列表代替了 range。有了列表,就能对一组分数求和、求平均,例子里做的就是这件事。
新词
列表 按顺序放在一个名字下的多个值,写在方括号里。
项(元素) 列表里的一个值。
索引 一项所在的位置。第一项的索引是 0。
append 一个列表方法,在末尾添加一项。 完整例子 Python 3 复制代码
scores = [ 70 , 85 , 90 ]
print ( scores [ 0 ])
print ( scores [ - 1 ])
scores . append ( 60 )
print ( len ( scores ))
total = 0
for score in scores :
total = total + score
print ( "Average:" , total / len ( scores ))
先预测输出,再看结果 预期输出 70
90
4
Average: 76.25 逐步讲解 scores = [70, 85, 90] 创建一个包含三个整数的列表。
scores[0] 是索引 0 的项,也就是第一项:70。
scores[-1] 从末尾往前数,所以它是最后一项:90。
scores.append(60) 在末尾添加 60。列表现在是 [70, 85, 90, 60]。
len(scores) 现在是 4。
循环让 score 依次取 70、85、90、60。total 累计到 70 + 85 + 90 + 60 = 305。
total / len(scores) 是 305 / 4 = 76.25,也就是平均分。
动手试试:在第一个 append 后面再加一行 scores.append(100),然后运行。现在有五个分数,总和是 405,最后一行显示 Average: 81.0。
常见错误 错误写法 scores = [70, 85, 90]
print(scores[3]) 这个列表有三项,索引是 0、1、2,没有索引 3。报错是:IndexError: list index out of range。最后一个有效的索引是 len(scores) - 1,也可以写成 -1。
正确写法 scores = [70, 85, 90]
print(scores[2]) 错误写法 scores = [70, 85, 90]
print(scores[1]) 如果你想要的是第一个分数,这样写就错了,而且没有报错提醒你。scores[1] 是第二项,也就是 85。第一项的索引是 0。
正确写法 scores = [70, 85, 90]
print(scores[0]) 错误写法 scores = [70, 85]
scores = scores.append(60)
print(len(scores)) append 会改变列表,并且什么也不交回,Python 把这叫作 None。把这个结果存到 scores 里,等于把列表丢掉了。报错是:TypeError: object of type 'NoneType' has no len()。要把 append 单独写成一行。
正确写法 scores = [70, 85]
scores.append(60)
print(len(scores)) 错误写法 scores = [70, 85, 90]
print(scores(0)) 圆括号表示调用函数,方括号才是取出一项。报错是:TypeError: 'list' object is not callable。
正确写法 scores = [70, 85, 90]
print(scores[0]) 检查自己 预测输出:
names = ["Leon", "Mia", "Emma"]
print(names[1])
print(names[-1])
先自己做,再看答案 先输出 Mia,再输出 Emma。索引 1 是第二项,-1 是最后一项。
用上面的 names 列表,写一个循环,依次打印 Hello, Leon、Hello, Mia 和 Hello, Emma。
先自己做,再看答案 for name in names: print("Hello, " + name)
一个列表有 6 项。最大的有效索引是多少?
先自己做,再看答案 5,因为计数从 0 开始。你也可以用 -1 取到最后一项。
07
函数 学完你能 写一个接收输入、返回结果的函数,并调用它。
你已经用过函数了:print、len 和 range。函数是一组有名字的步骤,可以反复使用。你也可以自己写函数。
先写 def,再写函数名,再写圆括号,括号里是参数,最后是一个冒号。参数是给输入起的名字,函数里把它当变量用。函数的步骤缩进写在下面。return 这个词把结果送回给使用这个函数的代码,这个结果叫作返回值。
定义一个函数并不会运行它。def 这一行只是让 Python 学会一个新名字。要运行它,就要调用这个函数:写出函数名,再在圆括号里给它几个值,例如 average(class_a)。你交给函数的值叫作实参。每个实参按顺序存进对应的参数里。
在函数里创建的名字,只在函数运行期间存在,它们是局部的。这是一种保护:函数不会不小心改掉程序里其他地方的变量。
return 和 print 不一样。print 是给人看的,把内容显示在屏幕上。return 把一个值交回给程序,这样它就能被存起来、被相加,或者被打印。如果函数结束时没有 return,它交回的是 None,意思是“没有值”。return 还会立刻结束函数。
新词
函数 一组有名字的步骤,可以反复使用。
参数 给输入起的名字,写在 def 的括号里。
实参 调用函数时交给它的实际的值。
调用 写出函数名和括号来运行一个函数。
返回值 函数用 return 交回的结果。
None 一个特殊的值,意思是“没有值”。 完整例子 Python 3 复制代码
def average ( numbers ):
total = 0
for number in numbers :
total = total + number
return total / len ( numbers )
def percent ( part , whole ):
return part / whole * 100
class_a = [ 70 , 85 , 90 , 60 ]
class_b = [ 50 , 100 ]
print ( "Class A:" , average ( class_a ))
print ( "Class B:" , average ( class_b ))
print ( "Passed:" , percent ( 3 , 4 ), "percent" )
先预测输出,再看结果 预期输出 Class A: 76.25
Class B: 75.0
Passed: 75.0 percent 逐步讲解 def average(numbers): 定义了一个叫 average 的函数,它有一个参数 numbers。此时什么都没有运行。
缩进的几行是函数体。它就是第 6 课里的那个循环,只是用 numbers 代替了 scores。
return total / len(numbers) 把平均数送回去,并结束函数。
def percent(part, whole): 有两个参数。它们按顺序接收值。
class_a 和 class_b 是两个列表,它们是普通的变量。
average(class_a) 调用函数。Python 把这个列表存进 numbers,运行函数体,得到 76.25。这次调用被换成这个返回值,print 把它显示出来。
average(class_b) 用同样的步骤处理另一组数据。重复使用步骤,正是函数的意义所在。结果是 75.0。
percent(3, 4) 把 3 存进 part,把 4 存进 whole。结果是 3 / 4 * 100 = 75.0。
动手试试:加上 class_c = [100, 90, 80] 和 print(average(class_c))。你应该看到 90.0。
常见错误 错误写法 def greet(name):
print("Hello, " + name) 什么也没有打印,也没有报错。def 只是定义了函数,没有人去调用它。请加一行调用它的代码,例如 greet("Mia")。
正确写法 def greet(name):
print("Hello, " + name)
greet("Mia") 错误写法 def square(x):
print(x * x)
y = square(4) + 1 print 只是把结果显示出来,并没有把它交回,所以 square(4) 是 None。程序先打印 16,然后以这个错误停下:TypeError: unsupported operand type(s) for +: 'NoneType' and 'int'。要用 return。
正确写法 def square(x):
return x * x
y = square(4) + 1 错误写法 def square(x):
return x * x
print(square(2, 3)) 函数有一个参数,调用时却给了两个实参。报错是:TypeError: square() takes 1 positional argument but 2 were given。实参的个数必须和参数的个数一致。
正确写法 def square(x):
return x * x
print(square(2)) 错误写法 def total_of(numbers):
total = 0
for n in numbers:
total = total + n
return total return 会立刻结束函数。这里它写在循环里面,所以循环处理完第一项就停了,total_of([1, 2, 3]) 得到 1,而不是 6。没有任何报错。要让 return 和 for 对齐,这样它才在循环结束之后执行。
正确写法 def total_of(numbers):
total = 0
for n in numbers:
total = total + n
return total 检查自己 写一个函数 double,它接收一个数 n,并返回 n 的两倍。然后打印 double(21)。
先自己做,再看答案 def double(n): return n * 2
print(double(21)) 输出 42。
预测输出:
def f(a, b):
return a - b
print(f(10, 4))
print(f(4, 10))
先自己做,再看答案 先输出 6,再输出 -6。实参按顺序进入参数,所以实参的先后顺序会改变答案。
预测输出:
def hello():
print("Hi")
x = hello()
print(x)
先自己做,再看答案 先输出 Hi,再输出 None。调用时打印了 Hi。函数没有 return,所以 x 得到的是 None。
08
读懂报错信息并修好程序 学完你能 找出错误的类型、位置和原因,并根据报错信息一条一条地修好程序。
每个程序员每天都会看到报错信息。它不代表你失败了。报错信息,是 Python 在告诉你它停在哪里、为什么停。要学的是冷静地、按正确的顺序去读它。
程序运行时发现的错误,会给出这样形状的信息: Traceback (most recent call last): File "hello.py", line 4, in <module> total = totl + price NameError: name 'totl' is not defined. Did you mean: 'total'?
请从最底下往上读。最后一行最有用。它写着错误的类型(这里是 NameError)、一个冒号,以及一句说明哪里出了问题的话。紧挨在它上面的,是 Python 停下时所在的那一行代码。再往上是文件名和行号。在本页上,文件名叫 main.py。Traceback 的意思是“回溯”,指 Python 走到这里经过的一串步骤;程序很短时,这串步骤只有一步。较新版本的 Python 还会在这一行的具体位置下面打印 ^ 标记,而且不同版本的措辞会略有不同。
一行代码的写法有错,叫作语法错误。Python 在运行任何东西之前就会发现它们,所以这种信息里没有 Traceback,程序也一个字都不会输出。Python 会显示那一行,并在出问题的地方附近打一个 ^ 标记。真正的错误就在那个位置,或者在它的前面一点。
每次都做同样的四件事。第一,把最后一行念出来。第二,去它指出的行号那里看。第三,只改一处。第四,重新运行。Python 在遇到第一个错误时就会停下,所以改好一个,常常会让你看到下一个。这就是进步。
新词
SyntaxError(语法错误) 某一行的写法 Python 看不懂,整个程序一行都不运行。
IndentationError(缩进错误) SyntaxError 的一种:行首的空格不对。
NameError(名字错误) 用到了不存在的名字,常见原因是拼写错误,或者变量还没有创建。
TypeError(类型错误) 对错误种类的值做了某个动作,例如文字加数字。
IndexError(索引错误) 用了列表里不存在的位置。
ZeroDivisionError(除以零错误) 除数为零的除法。
回溯(Traceback) 程序因错误停下时,Python 显示的那一串步骤。 完整例子 Python 3 复制代码
prices = [ 4 , 6 , 5 ]
total = 0
for price in prices :
total = total + price
average = total / len ( prices )
print ( "Total:" , total )
print ( "Average:" , average )
先预测输出,再看结果 预期输出 Total: 15
Average: 5.0 逐步讲解 这是修好之后的程序。Mia 的第一版有三处错误,Python 一次报告一个。你可以把每个错误重新放回去,自己读一读报错:点击“修改代码”,做出改动,点击“运行”,再看代码下面的框。每次都要把代码改回来,或者点“还原”。
错误 1:删掉第 3 行末尾的冒号,让它变成 for price in prices。运行。信息以 SyntaxError: expected ':' 结尾,并指出第 3 行。这是语法错误,所以什么都没有运行,也没有任何输出。
错误 2:把第 4 行的 total + price 改成 totl + price。运行。信息以 NameError: name 'totl' is not defined. Did you mean: 'total'? 结尾,并指出第 4 行。Python 从没见过名字 totl,它猜你想写的是 total。
错误 3:把第 6 行的 print("Total:", total) 改成 print("Total: " + total)。运行。信息以 TypeError: can only concatenate str (not "int") to str 结尾,并指出第 6 行。+ 号不能把文字和数字连在一起。这个错误要等第 1 到 5 行都运行完之后才会出现。
三处都改好后,就得到上面的输出:Total: 15 和 Average: 5.0。每条信息都告诉了你行号和原因。先读最后一行,是修得快的关键。
常见错误 错误写法 count = 0
print(10 / count) 除以零没有答案。报错是:ZeroDivisionError: division by zero。原因常常是某个你以为大于 0 的值,例如空列表的长度。除之前先检查。
正确写法 count = 0
if count > 0:
print(10 / count)
else:
print("Nothing to divide") 错误写法 print("Total:", (4 + 5)
print("Done") 有一个括号一直没有关上。报错是:SyntaxError: '(' was never closed,^ 标记指向那个仍然开着的括号。更老的 Python 版本会改为抱怨下一行,所以真正的错误有时就在 Python 所指位置的前面。
正确写法 print("Total:", (4 + 5))
print("Done") 错误写法 print("a")
print("b") 第二行开头有四个空格,而没有任何东西需要它们。报错是:IndentationError: unexpected indent。只有紧跟在冒号后面的行才应该缩进。把这些空格删掉。
正确写法 print("a")
print("b") 检查自己 一个程序停下了,报错的最后一行是:NameError: name 'nmae' is not defined. Did you mean: 'name'? 它上面的那一行是 print(nmae)。写出改正后的这一行。
先自己做,再看答案 print(name)。名字拼错了,而 Python 的猜测是对的。
print("Score: " + 90) 这一行出错了。说出错误的类型,并写出两种不同的改法。
先自己做,再看答案 这是 TypeError,因为 + 不能把文字和数字连在一起。改法有:print("Score:", 90),或者 print(f"Score: {90}"),或者 print("Score: " + str(90))。
一个文件的第 5 行漏了冒号,第 2 行有一个拼错的名字。第 1 行是 print("Start")。会出现哪个错误?Start 会被打印出来吗?
先自己做,再看答案 会出现关于冒号的 SyntaxError,而且不会打印 Start。Python 在运行任何一行之前,会先检查整个文件的写法。拼错的名字是 NameError,只有在程序运行时才可能出现。
独立整理的学习笔记,不是官方课程材料。