Skip to content

Python 语法基础

更新: 2025/2/24 字数: 0 字 时长: 0 分钟

介绍

Python(英式发音:/ˈpaɪθən/;美式发音:/ˈpaɪθɑːn/)是由荷兰人吉多·范罗苏姆(Guido Van Rossum)发明的一种编程语言。

image-20240424110157352

提醒

在中国,人们亲切地称呼吉多·范罗苏姆为“龟叔”,原因是他的名字前面(Gui)正好是“龟”字的拼音。

发展历史

1989 年 12 月,在荷兰阿姆斯特丹的吉多为了打发无聊的圣诞节,决定设计一门简洁、易读且功能强大的编程语言。在设计新语言时,他所熟悉的一门简单易学的、面向非专业程序员设计的 ABC 语言给了他设计灵感,但吉多认为 ABC 语言平台迁移能力弱、难扩展,仅仅面向编程初学者,没有把有经验的编程人员纳入其中。于是他又借鉴了 C 语言(如底层操作能力等)、Modula - 3(如模块系统等)、Perl(如文本处理等)等多种语言的特点,设计出了 Python 语言。

Python 语言克服了 ABC 语言的许多局限性,它具有良好的平台移植性、可扩展性,并且适用于不同编程经验层次的人群,在功能和应用范围上都要广泛得多。

在设计新语言时,从 ABC 语言那里获取了灵感。ABC 语言的一些设计理念和特性对 Python 的初始构思有一定的启发作用,但是说 “在工作中常用” 是没有依据的表述。

ABC 语言,是一个面向非专业程序员设计的语言,其简单易学的特点,常用于教学及原型软件设计。,也是一个面向非专业程序员设计的语言,其简单易学的特点,常用于教学及原型软件设计。

这种语言将作为 ABC 语言的继承者,其设计目标更多是为了提高编程效率和可读性。ABC 是吉多在工作中常用的语言,也是一个面向非专业程序员设计的语言,其简单易学的特点,常用于教学及原型软件设计。

Python 虽然是“蟒蛇”的意思,但是和蟒蛇没有任何关系,仅仅是因为吉多本人是 BBC 电视剧《蒙提·派森的飞行马戏团》(Monty Python’s Flying Circus)的忠实粉丝,所以他将主角的姓氏 Python 这个词作为了新语言的名字。

image-20241007000505088

  1. 1991 年 02 月,吉多在 alt.sources 新闻组上发布了 Python 解释器的最初代码,标记为版本 0.9.0 。
  2. 1994 年 01 月,Python 1.0 发布,梦开始的地方。
  3. 2000 年 10 月,Python 2.0 发布,增加了对 Unicode 的完全支持,使得 Python 能够处理更多种类的字符编码。此外,还增加了垃圾回收机制,改进了 Python 的内存管理,以及改进了语法,例如列表推导式、生成器和迭代器等。
  4. 2008 年 12 月,Python 3.0 发布,引入了诸多现代编程语言的新特性,增加了对高级编程特性的支持,例如注解(Annotations)、高级解包操作,还增加了 asyncio 库,支持异步 IO 操作等。此外,着重考虑了 Python 长期的可维护性,对 Python 2 进行了一些重大的修改,这些导致了 Python 并不完全向后兼容。
  5. 2011 年 04 月,pip 首次发布,Python 语言有了自己的包管理工具。
  6. 2018 年 07 月,吉多宣布从“终身仁慈独裁者”(开源项目社区出现争议时拥有最终决定权的人)的职位上“永久休假”。
  7. 2020 年 01 月,在 Python 2 和 Python 3 共存了 11 年之后,官方停止了对 Python 2 的更新和维护,同时也建议用户切换到 Python 3 。

重要

大多数软件(包括 Python)的版本号一般分为三段,形如 A.B.C 格式,其中 A 表示大版本号,一般当软件整体重写或出现不向后兼容的改变时增加 AB 表示功能更新,出现新功能时增加 BC 表示小的改动(例如:修复了某个 Bug),只要有修改就增加 C 。截至目前,Python 只有三个大版本,相比其他语言尤其是 Web 前端技术,这大大降低了 Python 开发者的知识负担,从反复造轮子的泥潭中脱离出来,专注于解决问题本身。

语言排行榜

Python 语言强调代码的可读性和语法的简洁性,相较于 C 或 Java,Python 让使用者能够用更少的代码表达自己的意图,因此 Python 成为了目前世界上最受欢迎和拥有最多用户群体的编程语言。下面的是几个权威的编程语言排行榜给出的 Python 语言的排名:

  • 下图由 TIOBE Index 提供,展示了 Python 在 2022 年、2023 年的排行榜中排名第一。

    <1>

  • 下图则展示了编程语言在全球最大代码托管平台 GitHub 上受欢迎的程度,最近四年 Python 语言都处于第一名的位置。

    <2>

优点和缺点

Python 语言的优点很多,简单为大家列出以下几点:

  1. 学习难度低,跟其它的很多编程语言相比,Python 的学习难度更低、更容易上手。
  2. 代码简洁易读,Python 的语言风格就是简洁易读,它强制要求开发者使用一致的缩进风格来表示代码块,这种风格也成为 Python 语言的一个标志性特征,同时也使得 Python 代码的规范程度更高、可读性更强,非常适合有代码洁癖和强迫症的人群。
  3. 开发效率高,相较于 C 或 Java,Python 能用更少的代码做更多的事情。
  4. 可扩展性强,Python 可以通过扩展模块与其它编程语言(如 C、C++)实现无缝集成,因此 Python 也被称之为“胶水语言”。这个特点也让 Python 在后来的发展过程中积累了丰富且强大的扩展生态,尤其是在数据分析和人工智能领域。
  5. 可移植性好,Python 是解释型语言,天生具有平台可移植性,只要在不同的操作系统上安装好 Python 解释器,同样的代码就可以在各个系统上运转起来。

Python 最主要的缺点是执行效率低(解释型语言通病),如果更看重代码的执行效率,C、C++ 或 Go 可能是更好的选择。

image-20241008112041191

解释器类型

Python 属于解释型语言,在执行 Python 代码过程中必须依赖于 Python 解释器解释执行。目前主流的 Python 解释器分为以下几种:

  • CPython:官方版本的解释器,也是标准解释器。由于是用 C 语言开发的,所以叫 CPython,也是使用最广的 Python 解释器。

  • IPython:基于 CPython 开发的一个交互式 Python 解释器。在执行 Python 代码方面和 CPython 完全一样,但它提供了许多额外的功能和工具,包括更加友好的交互式体验。

  • Jython:由 Java 语言编写,运行在 Java 平台上的 Python 解释器。Jython 将 Python 源码编译成 JVM 字节码,由 JVM 执行对应的字节码。Jython 能很好的与 JVM 集成,比如利用 JVM 的垃圾回收和 JIT,直接导入并调用 JVM 上其他语言编写的库和函数。

  • IronPython:由 C# 语言编写,运行在微软 .NET 平台上的 Python 解释器。IronPython 和 Jython 类似,可以直接把 Python 代码编译成 .NET 的字节码。IronPython 将源码编译成 .NET 的 Common Language Runtime (CLR),同样能很好的与 .NET 平台集成。即与 Jython 相同,可以利用 .NET 框架的 JIT、垃圾回收等功能,能导入并调用 .NET 上其他语言编写的库和函数。

  • PyPy:基于 RPython(Restricted Python) 实现的 Python 解释器。它里面包含一个 JIT 编译器(Just-In-Time compilation),可以将经常执行的字节码动态地编译成机器代码,来显著提高 Python 代码的执行速度。绝大部分 Python 代码都可以在 PyPy 下运行,但对第三方模块的支持不够,也无法很好的支持使用 CPython 的 C API 编写的扩展,这就可能会导致在两种解释器下执行相同的 Python 代码会有不同的结果。

建议

CPython 解释器用 >>> 作为提示符,它表示用户可以在交互式环境中输入 Python 代码,并立即执行。而 IPython 用 In [序号]: 作为提示符,它表示每次输入的代码块都会分配一个序号,并在执行时显示该序号。这有助于用户追踪和理解交互式会话中的代码执行顺序。

代码执行过程

以标准解释器 CPython 执行 Python 代码的过程为例,主要分为以下两个阶段:

  1. 编译阶段:Python 解释器中的字节码编译器将 .py 文件里面的 Python 代码编译为字节码(bytecode)保存在扩展名为 .pyc 文件中。这个字节码是一种与平台无关的中间表示形式,它包含了源代码的结构和逻辑,虽然它比源代码更接近机器代码,但仍不是机器可以直接执行的代码。另外,如果设置了字节码缓存,整个编译字节码的过程就只在程序第一次运行时发生,当下次运行相同的源代码时,解释器就不需要再次编译源代码,而是复用之前已经编译好的字节码文件,以提高效率。
  2. 执行阶段:Python 解释器中的虚拟机逐行或逐块地解释执行字节码,直到程序结束或者遇到错误。相对于直接执行机器码的语言(如 C 或 C++),Python 的执行速度会比较慢。Python 解释器中的虚拟机(Python Virtual Machine,简称 PVM)是 Python 解释器的核心引擎,它的功能包括字节码的加载、解释执行、内存管理等,其作用就是模拟出一个虚拟的计算机环境,由于本身实现了字节码的解释执行逻辑,所以字节码可以直接在虚拟环境中运行,而不需要将其转换为机器码,也不需要考虑底层硬件的细节,这使得 Python 具有很好的跨平台性。

解释型

提醒

Python 解释器中除了包含字节码编译器、虚拟机,还包括标准库、内存管理、异常处理、模块加载等其他功能模块,它们与代码的执行过程紧密相关。

内存管理机制

Python 的内存管理由 Python 解释器中的 PVM 虚拟机负责,主要有以下三大机制:

  1. 对象引用计数

    • 在 Python 中,所有对象都有一个引用计数器(reference count),用于记录当前有多少个地方引用了这个对象。当创建一个新的引用时,引用计数会增加;当引用被删除或覆盖时,引用计数减少。
    • 一旦对象的引用计数降为零,Python 解释器就会认为该对象不再被使用,并可以立即销毁它,回收其占用的内存空间。
    • 虽然引用计数的方式非常直观且快速,但它有一个显著的缺点——无法处理循环引用的情况。两个对象相互引用,哪怕它们实际上都不再被需要,它们的引用计数也不会归零,从而不会被回收。
  2. 垃圾回收(Garbage Collection, GC)

    • 为了解决引用计数机制的局限性,Python 引入了垃圾回收器来处理循环引用问题。
    • Python 的垃圾回收机制基于分代回收算法(generational garbage collection)。它将对象分为不同的代(generations),对象越“年轻”,就越频繁地被回收。垃圾回收器会周期性地扫描对象,查找引用计数为 0 或形成循环引用的对象,并释放它们占用的内存。
    • Python 使用 gc 模块来实现垃圾回收,默认情况下是自动触发的,但程序员也可以手动调用 gc.collect() 来立即执行垃圾回收。
  3. 内存池机制

    • 为了优化内存分配和释放,尤其是小块内存的管理,Python 使用了内存池机制。内存池的主要目的是减少频繁的系统调用,因为频繁地向操作系统申请和释放内存是一个比较昂贵的操作。

    • Python 使用内存池来管理小对象(通常小于 512 字节)的内存分配。常见的内存池管理器是 pymalloc,它优化了小对象的内存申请与释放的效率。

    • 内存池工作方式

      1. 当对象被销毁后,其内存并不直接归还给操作系统,而是被放入内存池中。
      2. 当需要分配新内存时,Python 首先会查看内存池中是否有合适的可用空间。如果有,就直接从内存池中分配,而不是重新向操作系统申请。
      3. 大对象(通常大于 512 字节)的内存则会直接向操作系统申请和释放。

这里我们梳理一下 Python 内存管理的工作机制,具体流程如下:

  1. 对象创建:当创建一个新对象时,Python 分配内存空间,并初始化引用计数为 1。
  2. 引用计数增加:当有新的引用指向这个对象时,引用计数增加。
  3. 引用计数减少:当某个引用被删除或改变指向时,引用计数减少。
  4. 垃圾回收:当引用计数为 0 时,Python 会立即销毁该对象,并释放内存;对于循环引用的对象,垃圾回收器会检测并清理。
  5. 内存池管理:销毁对象时,小块内存会被回收到内存池中,待后续使用,大块内存则直接交还给操1作系统。

建议

Python 解释器的自动内存管理,让 Python 在性能和资源使用上得到了优化,同时也避免了程序员手动管理内存的复杂性,让程序员能够专注于实现算法和逻辑。所以在 Python 编程中,Python 程序员不需要(也不应该)关心对象的内存地址,更好的做法是利用 Python 语言提供的高级特性和抽象来解决问题。

语言生态定位

Python 语言不仅语法简单,而且还拥有强大丰富的扩展库,这些扩展并不是为了编程开发服务的,而是为办公自动化、数据分析、科研等服务的。例如:

  • 1999 年 OpenCV 发布,并为 Python 提供了 opencv-python 扩展。OpenCV 是一个开源的计算机视觉和机器学习软件库,提供了大量的算法,用于图像处理、特征检测、对象识别等,被广泛应用于各种领域。包括机器人技术、视频监控、医疗图像处理、增强现实和机器学习等。

image-20241007011957903

  • 2003 年 Matplotlib 发布,Matplotlib 是一个用于绘制二维图表和图形的 Python 绘图库,可以创建各种类型的图表,包括折线图、散点图、直方图等。Matplotlib 的发布为 Python 在数据可视化和科学绘图领域提供了重要的支持,使得 Python 成为了一种优秀的数据可视化工具。

image-20241007013225625

  • 2006 年 NumPy 库发布,NumPy 最早称为 Numeric(1995年),在 Python 语言中原生的数据结构(如列表、元组)并不适合进行大规模的科学计算和数据处理。因此,NumPy 应运而生,为 Python 提供了高效的数组操作和数学函数,使得 Python 成为一种强大的科学计算工具。

image-20241007014454037

Python 就像一个秘书为企业服务,二者是相辅相成的,企业脱离了秘书,效率会下将,反之秘书脱离了企业,也无法发挥他的优势。另外,不少人诟病 Python 的性能,认为 Python 性能远不如其他语言,但是正如前面所说,Python 就是一个秘书,要求 Python 性能高就好比要求秘书有一打十的能力一样,这未免过于苛刻,也不符合它的定位。Python 是不能简单地跟其他编程语言相比较的,它是一个胶水语言、工具语言,不像其它语言一样仅凭编程技术就可以独立生存,Python 需要依附于它所服务的行业,所以学习 Python 一定不要像其他编程语言一样只关注语言本身,更多的是要了解语言背后服务的配套知识

image-20241007020751396

提醒

目前,Python 在 Web 应用开发、云基础设施、数据采集、数据分析等领域都有着广泛的应用,特别是在机器学习、人工智能领域(如 TensorFlow、PyTorch 等框架)更是占据主导地位。

市场岗位行情

从招聘市场也可以了解到,普遍企业对 Python 人才的要求更多的是各相关领域解决问题的能力,因此也产生了 Web 后端开发、爬虫开发、数据接口开发、自动化运维、自动化测试、科学计算和可视化、数据分析、量化交易、机器人开发、自然语言处理、图像识别等一系列相关的职位。

image-20241007021020259

提醒

行业有兴衰,而 Python 总能找到上升的行业为它服务,也正因如此 Python 能够在编程排行榜上常年霸榜第一。