从元类一路走回来,终点就一句
print("Hello, World!")。这一篇,我们把整本书的零件拼成一个真正能跑的小程序。
恭喜,你走到了最后一篇。回头看,你已经掌握了变量、运算符、控制流、函数、字符串和容器——这些就是写程序所需的全部砖块。现在,是时候盖一栋小房子了。
你将学到
print()的本质,sep与end参数- 注释怎么写、为什么重要
- 第一行 Python 程序:
print("Hello, World!") - 怎么安装 Python、怎么把代码跑起来
- 一个综合小项目:命令行待办清单(用到变量/条件/循环/函数/字典)
- 全书的收尾与下一站
前置知识
先读 上一篇:列表、元组、字典、集合。这是全程最后一篇,读完就出师了。
print() 的本质
print 是一个内置函数,作用是"把东西显示到屏幕上"。它接受任意多个参数,默认用空格隔开、末尾换行,这两个行为都可以改。
print("Hello, World!") # 输出: Hello, World!
print("a", "b", "c") # 输出: a b c(默认用空格分隔)
sep:分隔符
print("2026", "10", "07", sep="-") # 输出: 2026-10-07
print("a", "b", "c", sep="") # 输出: abc
print("a", "b", "c", sep=", ") # 输出: a, b, c
end:结尾字符
print("加载中", end="") # 默认 end="\n"(换行),改成别的就不换行
print("...", end="")
print("完成")
# 输出: 加载中...完成
for i in range(5): # end 常用来把内容排成一行
print(i, end=" ")
print() # 循环完换一次行
# 输出: 0 1 2 3 4
name, age = "小明", 18
print("姓名:", name, "年龄:", age) # 输出: 姓名: 小明 年龄: 18
print(f"姓名:{name},年龄:{age}") # 输出: 姓名:小明,年龄:18
注释
注释是写给人看的,Python 会忽略它。用 # 开头。
# 这是单行注释,解释下面这行在干嘛
price = 100 # 行尾注释
好的注释解释意图,坏的注释复述代码:
# ❌ 废话注释
x = x + 1 # x 加 1
# ✅ 说明意图
retries += 1 # 失败一次就重试,最多 3 次
price = base * 0.9 # 会员打九折
多行说明可以用三引号字符串,但它本质是字符串、不是专门的注释语法:
"""
通常放在文件开头,介绍这个脚本是做什么的。
"""
第一行 Python 程序
新建一个文件 hello.py,写下:
print("Hello, World!")
保存,然后在终端运行:
python hello.py
屏幕上出现:
Hello, World!
就这一行。所有语言的第一课都是它——它证明你的环境通了。
安装 Python 与运行代码
步骤一:安装 Python
- 打开 ,下载最新稳定版(3.11 或更高)。
- Windows 安装时,务必勾选 "Add Python to PATH",否则命令行找不到它。
- macOS 可用
brew install python,或直接下官方安装包。Linux 大多自带python3。
步骤二:验证安装并运行代码
python --version # 看到 Python 3.12.4 之类就成功了
python hello.py # 跑文件(最常用)
python -c "print('Hello, World!')" # 一行命令直接执行
python # 或进入交互式环境,exit() 退出
编辑器推荐 VS Code + Python 扩展,或 PyCharm;后续都跑在 Python 3.11+ 上。
综合项目:命令行待办清单
现在动手写点真东西。这个待办清单会综合用到前面学过的所有知识:变量、条件、循环、函数、字典、列表、f-string。
需求:能添加、列出、标记完成、删除待办,一直循环直到用户退出。
# todo.py —— 一个命令行待办清单
def show_menu():
"""打印菜单。"""
print("\n===== 待办清单 =====")
print("1. 添加事项 2. 查看全部")
print("3. 标记完成 4. 删除事项")
print("0. 退出 =============")
def add_todo(todos):
"""添加一条待办。"""
text = input("输入待办内容:").strip()
if not text: # 空内容不添加
print("内容不能为空")
return
todos.append({"text": text, "done": False})
print(f"已添加:{text}")
def list_todos(todos):
"""列出所有待办。"""
if not todos:
print("暂时没有待办,可以先去添加一条。")
return
print("\n你的待办:")
for i, todo in enumerate(todos, start=1):
mark = "✓" if todo["done"] else " "
print(f" [{mark}] {i}. {todo['text']}")
def read_index(todos):
"""读取一个合法的下标,非法则返回 None。"""
if not todos:
return None
raw = input("输入编号:").strip()
if not raw.isdigit():
print("请输入数字编号")
return None
index = int(raw) - 1 # 用户从 1 数,列表从 0 数
if 0 <= index < len(todos):
return index
print("编号超出范围")
return None
def complete_todo(todos):
"""把某条待办标记为完成。"""
list_todos(todos)
index = read_index(todos)
if index is not None:
todos[index]["done"] = True
print(f"已完成:{todos[index]['text']}")
def delete_todo(todos):
"""删除一条待办。"""
list_todos(todos)
index = read_index(todos)
if index is not None:
print(f"已删除:{todos.pop(index)['text']}")
def main():
"""主循环。"""
todos = [] # 用列表存一堆字典
while True:
show_menu()
choice = input("请选择:").strip()
if choice == "1":
add_todo(todos)
elif choice == "2":
list_todos(todos)
elif choice == "3":
complete_todo(todos)
elif choice == "4":
delete_todo(todos)
elif choice == "0":
print("再见!")
break
else:
print("无效选项,请重新输入")
if __name__ == "__main__":
main()
跑起来看看效果:
请选择:1
输入待办内容:写周报
已添加:写周报
请选择:3 → 输入编号:1 → 已完成:写周报
请选择:2 → 你的待办: [✓] 1. 写周报
请选择:0 → 再见!
这个小项目用到了什么
| 知识点 | 出现在哪 |
|---|---|
| 变量与类型 | todos、choice、text |
| 字典 | 每条待办是 {"text": ..., "done": ...} |
| 列表 | todos 收集所有待办 |
| 函数 | 每个功能一个函数,各司其职 |
| 条件判断 | if choice == "1" 等分支 |
| 循环 | while True 主循环、for 遍历 |
| f-string | f"已添加:{text}" |
常见坑
坑一:print 参数写错
print("a", "b") # 输出: a b(两个参数,默认加空格)
print("a" "b") # 输出: ab(这是字符串拼接,不是两个参数)
print("a", "b", sep="") # 输出: ab(想要无空格用 sep)
坑二:把 input() 的结果当数字
# ❌ choice 是字符串,"1" 和 1 不相等,永远为 False
# choice = input("选择:")
# if choice == 1: ...
# ✅ 和字符串比,或先转 int
choice = input("选择:")
if choice == "1":
print("选了第一项")
坑三:忘记 if __name__ == "__main__"
# ❌ 别的文件 import 这个模块时,main() 会立刻跑起来
# main()
# ✅ 加个判断,只有直接运行才执行
if __name__ == "__main__":
main()
坑四:退出前忘了 break
while True:
choice = input("选择:").strip()
if choice == "0":
print("再见")
break # ✅ 少了这句就是死循环
小结
print()是内置函数,sep改分隔符、end改结尾字符。- 注释解释"为什么",不是复述"写了什么"。
- 第一行 Python 程序永远值得保留:
print("Hello, World!")。 - 安装 Python 记得勾选 "Add Python to PATH";跑文件用
python hello.py。 - 综合项目把变量、条件、循环、函数、字典、列表、f-string 全部串了起来。
- 读到会写是第一步,动手敲一遍才是真的会。
写在最后:从精通到入门,你走完了
如果你是顺着这套教程从第一篇读到这里的,回头想想你翻过的山:
- 大师篇——元类怎么创建类、描述符怎么驱动属性、装饰器为什么能改写函数行为、
with背后是上下文管理器、生成器与协程如何让 Python 学会"暂停"。 - 高手篇——GIL 到底限制了谁、线程和进程该怎么选、
asyncio如何用单线程扛住成千上万的并发、性能瓶颈该从哪里找。 - 进阶篇——类型注解、虚拟环境、pytest、代码质量工具链,让代码从"能跑"变成"可维护"。
- 熟练篇——文件、正则、JSON/CSV、网络请求,你开始把 Python 用到真实世界。
- 上手篇——面向对象、模块、异常、推导式,你学会了组织代码。
- 入门篇——变量、运算符、控制流、函数、字符串、容器,你补齐了最基础的那一环。
这趟逆向旅程的妙处在于:当你写下 print("Hello, World!") 时,你不再是"照着教程敲一行代码的初学者"。你知道这行代码背后,字符串是一个不可变对象、print 是一个内置函数、__call__ 让调用成为可能、解释器在字节码里执行了一次 CALL。你从山顶往下看,风景和从山脚往上爬完全不同。
学到这里,你不是"入门了",你是"回头把入门的路重新走了一遍,而且这次带着地图"。
接下来去哪?随便挑一个方向往下钻:
- 写一个小工具解决你自己的真实问题。
- 读一个优秀开源项目的源码。
- 挑一门领域深入:Web(FastAPI / Django)、数据(pandas)、爬虫、自动化。
- 把前面大师篇里的概念,用在你自己的代码里。
编程最好的老师,永远是"想做一个东西"的冲动。去找那样一个东西吧。
从精通到入门,你走完了。现在是时候,从入门再往前走一步了。
上一篇:列表、元组、字典、集合
🎉 恭喜你,走完了从精通到入门的全程。
文章回复
0 条公开回复