1.1 环境搭建与第一个程序


1.1 环境搭建与第一个程序

本节摘要:搭好 Python 3.10+ 环境,理解"解释器、REPL、脚本、字节码"四者的关系,并跑起第一段带实证性质的小实验。学完这节,你拥有的不只是环境,而是一个可以做"解释器实验"的工作台。

从一个问题开始:Python 程序到底怎么跑?

很多入门书直接教你 print("Hello"),但从不回答一个更基本的问题:你敲下回车之后,机器里发生了什么?这个问题决定了你对"解释型语言"的全部直觉。

Python 不像 C 那样把源码编译成机器码再运行,也不是逐字符地"边看边执行"。它走一条中间路线:

  1. 解释器先把整个源文件读入,做词法与语法分析,得到一棵抽象语法树(AST);
  2. 把 AST 编译成字节码——一组面向"Python 虚拟机"的指令;
  3. 虚拟机(CPython 内部的 ceval 循环)逐条执行这些字节码,每条指令都在创建、查找或操作对象。

这个流水线可以从实验侧验证:任何 .py 文件的字节码都能用标准库的 dis 模块打印出来。后面我们会反复用这招。

解释器执行流水线

解释器执行流水线

安装与版本策略

到 Python 官网下载安装包即可,Windows 安装时务必勾选"Add Python to PATH"。装完在终端验证:

$ python --version Python 3.12.4

版本上我的建议很明确:新项目直接用 3.10 或更高。3.8 已停止官方维护,而 3.10 引入的结构模式匹配、3.11 的大幅提速、3.12 的更好报错信息,对学习体验影响很大。本教程代码基于 3.10+ 语法(如 list[int] 直接写法),在 3.8 上部分会报错。

多版本共存怎么办?Windows 上有启动器 pypy -3.11 指定版本;macOS 与 Linux 可用 pyenv 管理多个版本。验证当前解释器位置与搜索路径:

>>> import sys >>> sys.executable # 当前解释器的可执行文件 '/usr/bin/python3' >>> sys.path[:3] # 模块搜索路径的开头几项 ['', '/usr/lib/python312.zip', '/usr/lib/python3.12']

sys.path 先睹为快——第 5 章讲导入机制时,它就是主角。

编辑器选谁不是原则问题。VS Code 加官方 Python 插件足够轻快;PyCharm 对大项目重构更顺手;学习阶段我更推荐你常开一个 REPL 窗口,随手验证,比任何"保存-运行"循环都快。

REPL:最好的实验台

在终端输入 python(Windows 下 py)进入交互式环境,提示符变成三个箭头:

>>> 2 ** 100 1267650600228229401496703205376

注意这个结果:Python 的 int 没有溢出。C 语言里 long long 到 2 的 63 次方就翻车,Python 的整数是任意精度的对象——这是"数字也是对象"的第一个直接好处。

REPL 还有几个值得现在就记住的技巧:

  • 上一条结果存放在名字 _ 里,_ + 1 可以接着算;
  • help(len) 查某个内置函数的文档;
  • dir(str) 列出字符串类型的全部属性,配合 help 就是免费的 API 手册;
  • 退出用 exit() 或 Ctrl-D(Windows 下 Ctrl-Z 加回车)。

跑第一个脚本

把下面几行存成一个文件(文件名任意,比如叫 first.py,注意别叫 list.py 这类与内置模块撞名的名字):

import sys print("解释器版本:", sys.version.split()[0]) print("平台:", sys.platform) name = "Pythonista" print(f"你好, {name}") # 第一个“解释器实验”:看看 print 前后名字的踪迹 x = 1000 print("x 的身份:", id(x)) y = x # 这不是拷贝!下一节会解释 print("y 的身份:", id(y), "与 x 相同:", y is x)

python first.py 运行,你会看到类似输出:

解释器版本: 3.12.4 平台: win32 你好, Pythonista x 的身份: 140234849363248 y 的身份: 140234849363248 与 x 相同: True

身份那串数字每次运行都不同(它是内存地址的抽象),但"与 x 相同: True"稳定出现——y = x 之后两个名字指向同一个对象。如果你以前以为赋值是复制值,这个实验就是本教程给你的第一次世界观修正。完整的解释在 1.3 节。

亲眼看一次字节码

dis 看看一个极简函数被编译成了什么:

>>> import dis >>> def add(a, b): ... return a + b >>> dis.dis(add) 2 0 RESUME 0 3 2 LOAD_FAST 0 (a) 4 LOAD_FAST 1 (b) 6 BINARY_OP 0 (+) 10 RETURN_VALUE

不用看懂每条指令,只注意一件事:a + b 编译成了"取出 a、取出 b、做加法"三条指令,由虚拟机逐条执行。这就是"Python 是解释执行"的准确含义——性能问题的直觉也从此有据可依:解释器每条指令都要做类型检查、对象查找,比直接跑机器码慢是结构性的(3.11 之后有专门优化,但量级关系不变)。

⚠️ 常见坑:在 REPL 里写多行循环或函数定义时,空行会提前结束块;务必保持缩进连贯。另一个新手高频坑是文件名撞内置模块名——比如文件叫 random.py,然后 import random 导入的就是它自己,报出 AttributeError: partially initialized module。看到这个报错,先改名。

💡 关键直觉:把 REPL 当显微镜而不是计算器。每次学一个新概念,就在 REPL 里戳它一下——typeiddirdis 四件套,是贯穿本教程的实验工具。

本节要点回顾

  • 执行模型:源码 → AST → 字节码 → 虚拟机逐条执行;.pyc 只是字节码缓存,不是机器码。
  • 版本策略:新项目用 3.10+;sys.executablesys.path 是诊断环境问题的第一现场。
  • REPL 技巧_help()dir() 是免费文档系统;dis 让你看见解释器的真实动作。
  • int 无溢出:任意精度整数是"一切皆对象"的直接红利。
  • 赋值即绑定y = xid 相同、is 为 True——下一节把它讲透。
  • 别撞名:脚本文件名不要与标准库模块重名,否则导入系统会先找到你自己。

下一节我们正式拆开对象模型:身份、类型、值三要素,以及"type 的类型还是 type"这个自举怪圈。


作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U