Python 编程语言详细介绍

发布时间:2026/10/8 16:02:30
Python 编程语言详细介绍 前言很多初学者对 Python 的第一印象来自两句互相矛盾的话一句是「Python 很简单三天就能上手」另一句是「Python 很慢只能写写脚本」。这两句都不完整。Python 的语法确实简洁但它的语言模型动态类型、一切皆对象、名字即绑定需要真正理解才能写出不出错的代码而「慢」说的是 CPython 这个参考实现的执行方式而不是语言本身的表达能力。另一个常见误解是把 Python 当成「没有编译步骤的脚本语言」。事实上 CPython 在执行前会先把源码编译成字节码bytecode再由虚拟机执行只是这一步对用户透明。理解了这一点后面很多现象比如.pyc文件、__pycache__目录、为什么第一次导入某个模块会变慢才有解释。本文从语言定位讲起说明它的设计哲学、执行模型、版本现状最后给出「这门语言能做什么、不能做什么」的判断依据。文中的版本事实均以 Python 官方文档与 PEP 为准。一、Python 是什么定位与设计哲学Python 由 Guido van Rossum 于 1989 年底开始设计1991 年首次发布。它是一门通用、高级、动态类型的编程语言官方定位是「可读性强、易于上手的语言」。它的设计哲学写在一份可执行文档里叫「Python 之禅」The Zen of Python可以用下面一行代码在解释器里打印出来# 适用于 Python 3 全版本import this它会输出若干条格言其中影响语法设计最重要的几条是优美胜于丑陋Beautiful is better than ugly显式胜于隐式Explicit is better than implicit简单胜于复杂Simple is better than complex可读性很重要Readability counts这些原则直接导致了 Python 用缩进表达代码块而不是花括号用import this直接调用的模块导入方式以及「只有一种明显做法」的库设计倾向。需要明确的是Python 是多范式语言。它同时支持面向对象一切皆对象连函数、类、模块都是对象、过程式、函数式map/filter/ 推导式 / 生成器三种风格而不是只能写脚本。二、执行模型解释器、字节码与 CPython「Python 是解释型语言」这句话要拆开看。真实的执行链路是这样的源代码 .py│ 编译compile▼字节码 bytecode│ 虚拟机执行▼机器指令关键点CPython是 Python 的参考实现用 C 写成命令行工具通常就叫python或python3。除此之外还有 PyPy带 JIT、Jython、IronPython 等实现它们执行同一门语言但机制不同。首次导入某个模块时CPython 会把编译结果缓存成.pyc文件放在__pycache__目录里。这就是为什么第二次运行会略快——但这是缓存效应不是「Python 运行得快」。只要模块源文件比.pyc新缓存就会失效并重新编译。可以用标准库直接验证「源码先被编译成代码对象」这一事实# 适用于 Python 3.8import disdef add(a, b):return a b# 查看函数被编译成的字节码指令dis.dis(add)运行后会看到LOAD_FAST、BINARY_OP这类指令名。它们正是 CPython 虚拟机的指令集。三、版本现状Python 2 已经死了这是初学者最容易被过时教程坑到的地方。Python 2.7 已于 2020 年 1 月 1 日停止维护官方 PEP 373 记录支持于 2020-01-01 正式停止2.7.18 为最后一个版本。此后不再修复任何 bug包括安全漏洞。新项目一律使用 Python 3。两者的差别不是「打印语句写法不同」这么小而是语言层面的项目Python 2已停止维护Python 3应使用打印print x语句print(x)函数字典遍历d.iteritems()d.items()返回视图输入raw_input()/input()后者会 evalinput()返回字符串数字类型int/long并存只有int无限精度除法3 / 2 13 / 2 1.5整除写//字符串默认 bytes 语义默认 Unicode 语义整数范围有xrange只有range本身惰性如果看到教程里出现print hello、except Exception, e:、xrange(10)那它讲的是 Python 2应当直接放弃该教程或自行改写。判断本机解释器版本最可靠的方式是在代码里读取sys.version_info# 适用于 Python 3 全版本import sysif sys.version_info (3, 8):raise SystemExit(需要 Python 3.8 及以上)print(sys.version_info.major, sys.version_info.minor)sys.version_info是一个具名元组可以直接和元组比较大小这是版本守卫的推荐写法。四、语言特性一览在动手之前先记住几个会反复影响代码正确性的语言事实名字只是绑定。x 3不是「把 3 放进名为 x 的盒子」而是「让名字 x 指向对象 3」。类型属于对象不属于名字所以同一个名字先后可以绑定到不同类型的对象。一切皆对象。整数、函数、类、模块都有id()、type()都能作为参数传递。缩进是语法不是风格。没有花括号if后面的代码块靠缩进确定。对象有可变与不可变之分。int、str、tuple不可变list、dict、set可变。这决定了赋值、传参、默认参数的行为。下面这段代码用一次运行展示上述全部要点# 适用于 Python 3 全版本# 1) 名字可以先后绑定不同类型的对象value 10value 十 # 合法绑定换了不是类型错误print(value, type(value).__name__)# 2) 函数是对象可以赋值给名字def greet(name):return f你好{name}say_hi greetprint(say_hi(Python))# 3) 可变与不可变a [1, 2, 3]b a # b 和 a 指向同一个列表b.append(4)print(a) # [1, 2, 3, 4]a 也变了t (1, 2, 3)# t.append(4) # AttributeError元组没有 append实战写一个「环境自检」脚本把前面几节的事实合成一个空转脚本用来确认你机器上的环境符合本文的假设# 适用于 Python 3 全版本import sysimport platformdef main():info sys.version_infoprint(f解释器{sys.executable})print(f版本{platform.python_version()})print(f主版本号{info.major})if info.major ! 3:print(警告这不是 Python 3。Python 2.7 已于 2020-01-01 停止维护。)return 1if info (3, 8):print(提示本批示例以 3.8 为基准建议升级。)# 动态类型的直观演示value 42print(type(value).__name__)value 变成了字符串print(type(value).__name__)return 0if __name__ __main__:raise SystemExit(main())它只调用标准库任何 Python 3 环境都能跑返回码为 0 表示环境符合预期非 0 表示需要处理版本问题。常见坑点把「解释型」理解成没有编译步骤❌ 认为 Python 源码被逐行直接执行所以.pyc文件没用 ✅ CPython 会先把源码编译为字节码再执行.pyc就是这一编译结果的缓存以为 Python 2 和 Python 3 只是print的差别❌ 照抄老代码只把print x改成print(x)就以为能跑 ✅ Python 2.7 已于 2020-01-01 停止维护iteritems、xrange、整数除法语义都变了须整体迁移以为命令python一定启动 Python 3❌ 直接敲python xxx.py就假定用的是 3 ✅ 显式检查sys.version_infoWindows 上可用py -3明确指定把缩进当成纯粹的代码风格❌ 觉得缩进多少无所谓只要对齐好看 ✅ 缩进是语法的一部分块内缩进不一致会直接抛IndentationError或TabError认为「动态类型」等于「变量有类型」❌ 说「这个变量是 int 类型」 ✅ 类型属于对象名字只是绑定可以随时指向别的类型出错时机从编译期推迟到运行期以为 Python 只能写小脚本❌ 断定 Python 不能做大型工程 ✅ 它有模块/包机制、面向对象、标准库与生态只是需要配合类型标注与测试来维持可维护性用中文博客或问答站的说法判断版本特性❌ 凭印象说「某个语法是 3.x 加的」 ✅ 到docs.python.org的语言参考、whatsnew或对应 PEP 去核实总结维度事实语言类型通用、高级、动态类型、多范式参考实现CPython纯 C 编写执行方式先编译为字节码再由虚拟机执行当前主线Python 32.7 已于 2020-01-01 停止维护代码块界定缩进不是花括号类型归属属于对象不属于名字学习入口python交互式解释器或直接运行.py文件把 Python 理解成「一门有编译步骤的解释型语言、一门以可读性为首要设计目标的动态语言」比记住任何一句口号都有用。接下来要做的是装上Python 3用sys.version_info确认版本然后从条件与循环开始写第一段能跑的程序。