当前位置: 首页 > 编程日记 > 正文

Python 教程 01:Python 简介及发展历史

ℹ️说明:关于本教程的一些约定

① 教程后有(选读)的表示此教程为扩展内容,选读;

② 教程中涉及到的代码片段有时候并非代码块,而是图片,这是防止初学者直接复制代码粘贴的行为,想必各位来到这里是真的想学到一些东西,而不是只会复制粘贴吧?

③ 本教程无特殊情况,均在 Windows 操作系统下;

④ 本教程中所用 Python 版本均为 Python 3 系列,尽可能保持最新版本;

⑤ 无特殊情况,本教程一周更新一篇;

目录

一、Python 简介

1.1 什么是 Python

1.1.1 大小写敏感

1.1.2 动态类型

1.1.3 解释型

1.2 Python 为什么叫 “Python”

1.2.1 Python 名称的由来

1.2.2 Guido van Rossum

1.2.3 Python 的口号

1.3 为什么选择 Python

1.3.1 Python 简单易学

1.3.2 Python 资料众多

1.3.3 Python 流行广泛

二、Python 的发展历史

2.1 开发之前

2.2 开发早期(1989-1991)

2.3 Python 1 时期(1991-2000)

2.4 Python 2 时期(2000-2020)

2.5 Python 3 时期(2008- 现在)


一、Python 简介

Python Logo

1.1 什么是 Python

Python 是一门 大小写敏感 的、动态类型 的、解释型 的编程语言。

1.1.1 大小写敏感

将大写英文字母和对应的小写英文字母视为不同的标识符,反之则视为相同的。

例如,Python 和 python 就是两个不同的标识符。

1.1.2 动态类型

Python 变量与其存储的值是分开的,没有必然的联系,因此 Python 变量的类型也就是动态的,因为其关联的数据的类型就是动态的。在我看来,这是一个非常好的特性。

1.1.3 解释型

Python 程序的运行一般需要依靠 Python 解释器对其进行解释,而不像 C 和 C++ 那样的编译型语言,编译完成后可以直接在对应平台上运行。这个特性给予了 Python 一些优点和缺点,优点是 Python 程序可以非常方便的进行修改和编辑然后马上重新解释运行,大大地加快了开发的速度,但缺点是 Python 程序的运行必须依靠 Python 解释器的存在。若对应的机器上没有 Python 环境,那么 Python 程序大概率无法直接运行。

1.2 Python 为什么叫 “Python”

1.2.1 Python 名称的由来

Python 名称来源于 Python 创始人 Guido van Rossum 对 Monty Python 喜剧团体的喜爱。1989 年他开始编写 Python 解释器时,他需要一个简单,独特且有趣的名称,以便为其编写文档时引起人们的兴趣。因此,他选择了 Python 这个名称,并将其与 Monty Python 这个喜剧团体联系起来,以表达他的幽默感。

1.2.2 Guido van Rossum
Guido van Rossum

Guido van Rossum 是一名荷兰计算机科学家,被誉为是 Python 编程语言的创始人(实际创始人也是他),根据名字的发音,国内常简称他为“龟叔”。他于1982 年在荷兰莱顿大学获得了计算机科学学士学位,之后在荷兰国家数学与计算机科学研究所从事了 8 年的研究工作。在 1990 年代初,他开始开发 Python 编程语言,并于 1991 年公开发布了第一个 Python 版本。他在 Python 社区中担任着重要的领导角色,带领着该社区不断地发展壮大。他也曾在 Google 工作,担任技术研究员和软件工程师,并在 Google 期间继续对 Python 的开发和推广做出了重要贡献。

1.2.3 Python 的口号

在国内,Python 的口号是 “人生苦短,我用 Python”。Bruce Eckel 原话是 “Life is short, you need Python",但 “我用 Python” 是 Guido van Rossum 穿的 T 恤上印的话(见下图)。

右上三是 “龟叔”

这句口号简短地表明了 Python 最主要的特征,就是简单!人生并不是很长,如果你选择把时间花费在复杂冗长的语法上,而不是有用的逻辑上,岂不是十分的不值得?

这里我们可以与主流语言 Java 做对比,两者都是流行语言,但完成同样一件事情所需的代码量差异非常之大(毕竟 Java 语法的冗长比较明显)。下面是两段完成同一件事情所需的代码:

Java:

@FunctionalInterface
interface Formula {
    double calculate(double x);
}

public class Test {
    public static void main(String[] args) {
        Formula f = x -> 3 * x * x + 2 * x + 1;
        
        double result = f.calculate(2.5);
        System.out.println(result);
    }
}

Python:

f = lambda x: 3 * x**2 + 2 * x + 1

result = f(2.5)
print(result)

这里不是批评 Java 不好,这里只是做一个简单的对比,别无它意,仅此而已。

1.3 为什么选择 Python

1.3.1 Python 简单易学

Python 是一门对新手非常友好的编程语言,因为它语法简单,语义明确,能让我们用最接近自然语言的方式来编写程序,但你想学精也是有难度的(虽没有 C++ 那样难)。

1.3.2 Python 资料众多

Python 的学习资料非常多,包括此教程,也是 Python 学习资料之一。实际上,Python 官方也有教程和文档,甚至,官方还给出了中文版的(虽然不是 100% 完全翻译的)!

官方中文版文档链接(强烈建议多看几遍文档):Python Documentation

猜你想问: 既然有那么多教学资料,那为什么选择这个教程呢?

首先,这篇教程属于基于我个人理解编写而成的,我会从初学者的角度来进行讲述,但同时兼具深度和难度(保证和其他教程有很大不同);此外,我会及时对文章的评论做出回答,及时形成反馈。

1.3.3 Python 流行广泛

Python 主要方向有网络开发、网络爬虫、人工智能、大数据、科学计算等。但这些是 Python 比较流行的方向,并不代表 Python 在其他方面不够优秀。比如图形化编程,一直被认为不是 Python 合适的方向,但现在也在逐渐改变,尤其是两大 Qt 第三方库(PyQT 和 PySide)的引入,极大地提高了 Python 在 GUI 编程领域的水平。

Pythoon 的宗旨是简单明确且优雅,什么事情能够快速且准确地实现,速度或许会相对于其它编程语言要慢一些,但它开发速度快,出错的概率低,这不正是编写程序的一大目标吗?就算它比较慢,但 Python 官方近些年来一直尝试加快 Python 的运行速度(典型的就是 Python 3.11 版本更新极大地加快了运行速度,见下图)

Python 3.11 更新说明的宣传 Logo

在我看来,Python 若是运行速度能与主流编译型语言靠齐,那便是最好的编程语言,没有之一了。Python 社区也十分地活跃,每天都有很多的内容在产出。

Python 历年流行趋势图:TIOBE Index - TIOBE

1.3.4 Python 开源免费

这虽然不是一个重要的因素,但还是必须要提一下,免费开源的总是更加安全一些,更容易获得信任。

二、Python 的发展历史

2.1 开发之前

Python 编程语言实际有一个“前置”语言作为启发,那就是 ABC 语言。

ℹ️扩展知识:ABC 语言

ABC 语言是在 NWO(荷兰科学研究组织)旗下 CWI(荷兰国家数学与计算机科学研究中心)的 Leo Grurts,Lambert Meertens,Steven Pemberton 主导研发一种交互式,结构化高级语言,旨在替代 BASIC,Pascal 等语言,用于教学及原型软件设计。Python 创始人 Guido van Rossum 于20 世纪 80 年代曾在 ABC 系统开发中工作了数年。

—— ABC语言 百度百科

Python 有很多特点都是借鉴于 ABC 语言,或者说早期的 Python 就是 ABC 的改良版。 但 ABC 语言最后失败了,没有流行下去,就 Guido 本人看来,ABC 失败的原因是高级语言为时过早,并且平台迁移能力弱,难以添加新功能,仅仅专注于编程初学者,没有把有经验的编程人员纳入其中,其通过 Python 解决了其一些问题,让拓展模块的编写非常容易,并且可以在多平台进行运行。

2.2 开发早期(1989-1991)

在 1989 年圣诞节期间的阿姆斯特丹,龟叔为了打发圣诞节的无趣,决心开发一个新的脚本解释语言,作为 ABC 语言的一种继承,两年后的 1991 年,发布了第一个公开发行版。此时都是由龟叔进行开发和管理的。

2.3 Python 1 时期(1991-2000)

初始阶段,Python 1 时期主要实现了基本的语法结构、数据类型、异常处理、模块系统等特性。Python 1.0 于 1994 年发布,引入了 lambda 表达式、map、filter 和 reduce 等函数式编程工具。Python 1.6 于 2000 年发布,是 Python 1.x 系列的最后一个版本。

2.4 Python 2 时期(2000-2020)

发展阶段,主要增加了许多新功能和改进,如 Unicode 支持、列表推导、垃圾回收机制、生成器、装饰器、迭代器协议、新式类等。Python 2.0 于 2000 年发布,引入了循环引用检测垃圾回收机制和全局解释器锁(GIL)。Python 2.4 于 2004 年发布,同年 Django 框架诞生。Python 2.7 于 2010 年发布,是 Python 2.x 系列的最后一个版本。Python 2.7 原定于 2015 年结束支持,后延长至 2020 年,并确认不会有 2.8 版本发布。

2.5 Python 3 时期(2008- 现在)

成熟阶段,主要进行了一些重大的改变和优化,如移除旧式特性、统一文本和二进制数据模型、增加类型注解、异步编程支持等。Python 3.0 于 2008 年发布,不完全兼容 Python 2.x,并提供了2to3 工具来帮助迁移代码。Python 3.6 于 2016 年发布,引入了格式化字符串字面量(f-string)等新特性。Python 3.9 于 2020 年发布,移除了 distutils 包等已弃用的 API。截至 2024 年 1 月,Python 3.12 是最新稳定版本。

下面是截至 2024 年 1 月,Python 的发布周期

Python 发布周期

参考资料:

  1. Python的发展简史
  2. Python早期设计与开发:从ABC到Python

相关文章:

并发编程下的集合:数组寻址、LinkedList、HashMap、ConcurrentHashMap

如果发现hash取模后的数组索引位下无元素则直接新增,若不是空那就说明存在hash冲突,则判断数组索引位链表结构中的第一个元素的key以及hash值是否与新的key一致则直接覆盖,若不一致则判断当前的数组索引下的链表结构是否为红黑树,若为红黑树则走红黑树的新增方法,若不为红黑树则遍历当前链表结构,遍历中发现某个节点元素的next为null是则直接将新元素指针与next进行关联,若在遍历到next为空前判断到,某个节点的key以及key的hash值与新的key与新的keyhash值一致时则走覆盖。

【日常开发之Windows共享文件】Java实现Windows共享文件上传下载

下拉框选择你选择的用户点击添加,然后共享确定。创建一个文件夹然后点击属性界面,点击共享。maven版本存在于SMB协议的兼容问题。首先开启服务,打开控制面板点击程序。点击启用或关闭Windows功能。我这边是专门创建了一个用户。SMB1.0选中红框内的。

rust wasm入门

demo## 编译 Rust 为 WebAssembly在本教程中,我们将使用 Rust 的 npm 包构建工具 wasm-pack 来构建一个 npm 包。

iced 入门一

本教程的目标是创建一个简单的购物清单应用程序。我们希望允许添加和删除购物清单中的项目。在编写代码之前,我们必须首先了解 Iced 构建的结构:Elm 架构。它是 GUI 库使用的架构,最初用于 Elm 编程语言。它的核心原则很简单。它围绕三个概念构建:模型、视图和更新。

注解annotation

Kubernetes的系统组件(例如,kube-scheduler、kube-controller-manager、kube-apiserver、kubectl 或其他第三方组件)向用户的Kubernetes对象添加注解时,必须指定一个前缀。注解(annotation)可以用来向 Kubernetes 对象的 metadata.annotations 字段添加任意的信息。除了使用注解,您也可以将这类信息存放在一个外部的数据库,然而,在使用、分享这些信息的时候,可能会变得难以管理。

Rust XTask 模式介绍与应用

XTask(扩展任务)是一种在Rust项目中定义和执行自定义构建任务的方式。它通过创建一个独立的Rust库或二进制项目来封装这些任务,利用Rust语言的强类型、安全性和跨平台能力,使得构建流程更加健壮、可读和可维护。

ModuleNotFoundError: No module named ‘qcloud_cos‘

是腾讯云提供的一个Python SDK,用于与腾讯云对象存储(COS)服务进行交互。使用pip安装qcloud_cos报以下错误。这个错误表示Python无法找到名为。

需要在method方法被调用之后,仅打印出a=100,b=200,请写出method方法的代码

通常,此流对应于显示器输出或者由主机环境或用户指定的另一个输出目标。通常,此流对应于键盘输入或者由主机环境或用户指定的另一个输入源。public static final PrintStream err“标准”错误输出流。PrintStream 是打印输出流,它继承于FilterOutputStream。第二个用的是用的是char类型,根本不是方法,当要输出方法体的时候,会给你遍历数组。通常,此流对应于显示器输出或者由主机环境或用户指定的另一个输出目标。诡异的是,如果错了,面试官对你说了一句:你回去看看,

一个合格的Java选手必须要掌握的并发锁知识

Java内置锁:基于Java语法层面(关键词)实现的锁,主要是根据Java语义来实现,最典型的应用就是synchronized。Java显式锁:基于JDK层面实现的锁,主要是根据基于Lock接口和ReadWriteLock接口,以及统一的AQS基础同步器等来实现,最典型的有ReentrantLock。使用方式:synchronized关键字互斥锁主要有作用于对象方法上面,作用于类静态方法上面,作用于对象方法里面,作用于类静态方法里面等4种方式。

Integer.toHexString(b & 0xff)理解以及& 0xff什么意思

首先toHexString传的参数应该是int类型32位,此处传的是byte类型8位,所以前面需要补24个0。然后& 0xff 就是把前面24个0去掉只要后8位。toHexString(b & 0xff)相当于做了一次位的与运算,将前24位字符省略,将后8位保留。是两个十六进制的数,每个f用二进制表示是1111,所以占四位(bit),两个f()占八位(bit),八位(bit)也就是一个字节(byte).这个方法是把字节(转换成了int)以16进制的方式显示。我的理解是这样,如有不对欢迎指正!

python安装成功的图标_ubuntu下:安装anaconda、环境配置、软件图标的创建、成功启动anaconda图形界面...

Ubuntu安装anaconda常见的四大问题:目录1、介绍2、安装anaconda3、环境配置4、软件图标的创建5、成功启动anaconda图形界面1、介绍先介绍一下anaconda和python的关系:初学者所安装的python2/3只是python的环境,没有python的工具包&a…

使用JavaScript实现复杂功能:一个完整的电商网站搜索功能

随着互联网的发展,电子商务网站已经成为人们购物的重要平台。而在这些网站中,搜索功能无疑是核心功能之一。用户可以通过搜索快速找到他们需要的商品,从而提高购物体验。本文将详细介绍如何使用JavaScript实现一个完整的电商网站搜索功能。

C++并发编程:互斥锁std::mutex和lock_guard的使用

对象离开其作用域时,会自动调用析构函数,该析构函数会释放锁。这确保了在任何情况下(包括由于异常等原因导致的提前退出),锁都会被正确释放,从而避免了忘记手动释放锁而导致的死锁问题。mutex 用于控制多个线程访问共享资源,确保在任意时刻只有一个线程可以访问该资源,避免数据竞争。这确保了同一时刻只有一个线程可以访问被保护的资源,从而防止多线程并发访问导致的数据不一致性。是 C++ 标准库中提供的一个模板类,用于在其构造时自动获取锁,在析构时自动释放锁。是 C++ 标准库中提供的一种用于多线程同步的互斥锁实现。

上位机图像处理和嵌入式模块部署(qt插件的使用)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 一个软件一般有很多的功能,但是主流程只有一个。但在软件开发的过程当中,一般来说功能是需要不断添加的,但是主流程最好不要轻易修改。这里的插件就相当于各种各样的功能,而主流程就是如何怎么去调用这些插件的功能。所以,今天正好来学一下怎么添加qt插件,个人觉得这部分还是非常重要的。

C程序的内存空间布局(栈、堆、数据区、常量区、代码区)

较详细的介绍了栈、堆、数据区、常量区、代码区

Java中的四种访问权限(private,public,protected,无修饰)

/实体类属性和数据库字段名称不一致//实体类属性和数据库字段名称不一致return id;return age;emp.test();//直接调用public修饰的变量//private修饰的变量进行赋值//调用private修饰的变量1、public修饰符定义的属性和方法通过对象实例化进行调用,2、private修饰的属性通过set、get方法进行调用。

Java中的方法重载和方法重写有什么区别?

Java中的方法重载(Overloading)和方法重写(Overriding)都是面向对象编程中的重要概念,但它们之间有一些区别。方法重载是指在同一个类中,可以定义多个具有相同名称但参数列表不同的方法。这些方法具有不同的参数类型、参数个数或参数顺序。在调用重载方法时,Java编译器会根据传递给方法的参数类型和数量来选择要调用的正确方法。方法重载主要用于解决方法的命名冲突和提高代码的可读性和可维护性。

python基础使用之变量,表达式,语句

PYTHON基础知识系列之变量、表达式、语句

C语言常见面试题:什么是宏,宏的作用是什么?

宏在计算机科学中是一种批量处理程序命令,它是一种抽象的规则或模式,用于说明某一特定输入(通常是字符串)如何根据预定义的规则转换成对应的输出(通常也是字符串)。在编译时,预处理器会对宏进行展开,即将宏的内容替换到宏所在的位置。以上是宏的一些主要作用,但并不是全部。在实际编程中,根据需要选择是否使用宏以及如何使用宏,以实现更好的代码组织和可读性。,这样就可以计算出a和b的和。这个例子展示了宏的基本用法和作用。在这个例子中,我们定义了一个宏。,用于计算两个数的和。时,预处理器会将其展开为。

python基础小知识:引用和赋值的区别

通过引用,就可以在程序范围内任何地方传递大型对象而不必在途中进行开销巨大的赋值操作。不过需要注意的是,这种赋值仅能做到顶层赋值,如果出现嵌套的情况下仍不能进行深层赋值。赋值与引用不同,复制后会产生一个新的对象,原对象修改后不会影响到新的对象。如果在原位置修改这个可变对象时,可能会影响程序其他位置对这个对象的引用

Golang 搭建 WebSocket 应用(八) - 完整代码

本文应该是本系列文章最后一篇了,前面留下的一些坑可能后面会再补充一下,但不在本系列文章中了。

Python自动化实战之接口请求的实现

作为一位过来人也是希望大家少走一些弯路,如果你不想再体验一次学习时找不到资料,没人解答问题,坚持几天便放弃的感受的话,在这里我给大家分享一些自动化测试的学习资源,希望能给你前进的路上带来帮助。

C#winform上位机开发学习笔记3-串口助手的信息保存功能添加

上位机开发的系列学习笔记,避免遗忘多记录多补充多优化

Python中如何简化if...else...语句

我们通常在Python中采用if...else..语句对结果进行判断,根据条件来返回不同的结果,如下面的例子。这段代码是一个简单的Python代码片段,让用户输入姓名并将其赋值给变量user_input。我们能不能把这几行代码进行简化,优化代码的执行效率呢?以下是对各行代码的解读。这里使用了or这个逻辑运算符,当user_input不为空时,user_input为真,name就被赋于user_input的值。采用这种方法可以轻松实现if...else语句的简化。我们可以使用一行简短的代码来实现上面的任务。

前端JS代码中Object类型数据的相关知识

遍历JavaScript中的对象有几种方法,包括使用for…in循环、Object.keys()方法、Object.values()方法和Object.entries()方法。因此前端传入了日期类型数据之后,如果和后台数据库中的数据类型不一致,比如数据库中的日期数据类型格式是。前端传入的Object对象中其中某个字段值是日期类型的数据,则在前端的类型就是一个。,则数据传往后端之前需要做格式类型转换。,它的值是一个中国标准时间,比如。

Rust之旅 - Rust概念、Windows安装、环境配置

本章节介绍Rust概念、Windows安装、环境配置以及最初级的语法。至此,我们就成功的构建了一个Rust程序,并成功在Visual Studio Code里运行了这个程序,万事俱备,我们就可以开始Rust之旅了。资料获取,更多粉丝福利,关注下方公众号获取。

C语言中常用的字符串处理函数和内存操作函数

`memmove(void *destination, const void *source, size_t num)`:将`source`指向的内存块的前`num`个字节移动到`destination`所指向的内存块,即使内存块有重叠部分。返回指向`destination`的指针。- `memcpy(void *destination, const void *source, size_t num)`:将`source`指向的内存块的前`num`个字节复制到`destination`所指向的内存块。

一键式Excel分词统计工具:如何轻松打包Python脚本为EXE

最近,表姐遇到了一个挑战:需要从Excel文件中统计出经过分词处理的重复字段,但由于数据隐私问题,这些Excel文件不能外传。这种情况下,直接使用Excel内置功能好像是行不通的,需要借助Python脚本来实现。为了解决这个问题,我写了一个简单的数据分析和自动化办公脚本,以方便使用。想象一下,即使电脑上没有安装Python,也能通过一个简单的EXE文件轻松完成工作,这是多么方便!因此,我决定不仅要写出这个脚本,还要学会如何将其打包成一个独立的EXE文件。这样,无需Python环境的电脑也能直接运行它

深入解析JavaScript的原生原型

在JavaScript中,除了自定义对象,还存在很多由JavaScript语言本身提供的原生对象。这些原生对象同样基于原型继承机制,拥有自己的原型。理解原生对象的原型非常重要,可以让我们正确使用这些内置对象,也有助于进一步理解JavaScript的原型继承系统。本文将详细解析原生对象的原型结构,揭开一些常见原生对象原型的神秘面纱。​学习原生对象的原型关系,有助于我们在日常开发中正确理解和使用这些JavaScript内置对象,避免一些常见陷阱。

深入三目运算符:JavaScript、C++ 和 Python 比较

三目运算符是编程中常用的条件表达式,它允许我们根据条件选择不同的值。我们将通过具体的例子分别介绍 JavaScript、C++ 和 Python 中的三目运算符,以便更好地理解它们的用法和特性。JavaScript 示例// 例子: 根据条件选择不同的值var x = 10;var y = 20;"x 大于 y" : "x 不大于 y";在这个例子中,如果x大于y,则result的值为 “x 大于 y”,否则为 “x 不大于 y”。C++ 示例// 例子: 根据条件选择不同的值。