重拾 Python

穿越之重拾 Python

这是「重拾 Python」系列的第一篇。 之前那篇文章里,我从 C++ 出发,重新认识了 C、Python 以及不同编程语言背后的设计思想。 而这一篇,我想真正重新开始学习 Python。 那么现在 PIEMM 穿越了,这一世我一定要学好 Python!

本次任务目标,真正理解:

  • 为什么 Python 会这样设计?
  • 它适合解决什么问题?
  • 它和 C++ 的差异背后代表了什么?

接下来这个系列会从最基础的环境开始,逐渐认识 Python 的语法、函数、模块以及面向对象设计。

主要参考 Python 官方文档:

它是一门什么语言

先讨论一个问题: 为什么近年来,除了部分传统人文学科,越来越多专业都开始学习 Python? 一门编程语言,如果希望被不同领域的人使用,同时又让没有计算机基础的人能够快速入门,那么它通常需要具备几个特点: 足够强大的生态,以及较低的学习成本。(换句话也就是功能强大且简单易学) Python 恰好满足了这两个条件。

那么 Python 功能到底有多强大呢?

应用领域

1. Web 开发

也就是做网站。 比较经典的框架包括:

  • Django
  • Flask

Django 重型火炮,火力覆盖;Flask 瑞士军刀,快速灵活。

当然,如果只讨论现代 Web 前端开发,JavaScript 仍然占据非常重要的位置。

2. 数据分析与科学计算

这是我认为 Python 所有方向中对我而言很重要的一个方向,用 Python 可以对数据做的操作可比 Excel 要多多了。

常用的库有:

  • NumPy
  • Pandas
  • Matplotlib
  • SciPy
  • Seaborn

Python 可以方便地进行数据处理、数学计算以及科学实验。 相比 C++,Python 不一定执行更快,但它能够让研究人员更加快速地验证自己的想法。

3. 人工智能与机器学习

这无疑是近年来 Python 最热门的方向。无论是:

  • 深度学习
  • 大模型
  • 机器学习算法

都大量使用 Python。

这里需要注意的是:Python 本身并不是因为运行速度快才成为 AI 主流语言。 实际上,很多底层计算依然依靠 C/C++。 Python 更多承担的是一个中间调用的角色。

4. 游戏开发

Python 也可以用于游戏开发,但它并不是大型商业游戏的主要选择。 对于需要极致性能的游戏引擎,例如大型 3A 游戏,C++ 依然拥有不可替代的地位。

如果总结 Python 最核心的应用,我认为主要还是: 数据分析 + 人工智能。 这也是为什么很多非计算机专业,例如金融、数学、生物、经济等专业,也开始学习 Python。 它不一定是解决所有问题的最佳语言,但它成为了连接不同领域的一种通用工具。

功能强大说完了,下面就讲到简单易学了。 如果你问为什么它简单,好吧,下面给你看三个语言对比。

先看一张 C、C++ 和 Python 的常见语法对照表。

对比项目CC++Python
变量定义int x = 10;int x = 10;x = 10
输出printf("%d\n", x);cout << x << endl;print(x)
条件判断if (x > 0) {}if (x > 0) {}if x > 0:
循环for (int i = 0; i < 5; i++)for (int i = 0; i < 5; i++)for i in range(5):
函数定义int add(int a, int b)int add(int a, int b)def add(a, b):
语句结束通常使用分号 ;通常使用分号 ;通常不需要分号
代码块使用 {}使用 {}使用缩进表示

当然,这张表只是简单对比。C 和 C++ 的语法也不完全相同,C++ 还有很多更高级的语言特性,这里就不展开了。

如果你之前学过 C++,第一次看 Python 代码,可能会有一种感觉:

咦?怎么少写了这么多东西?

没错,这就是 Python 最直观的特点之一:它希望程序员用相对简洁的代码表达自己的想法。

下面我们就具体看看,Python 的简单究竟体现在哪里。

语言特点

  1. 语法简洁,代码更容易阅读

先从最简单的 for 循环开始。

如果用 C++:

#include <iostream>
using namespace std;

int main() {
    for (int i = 0; i < 5; i++) {
        cout << i << endl;
    }
    return 0;
}

而在 Python 中:

for i in range(5):
    print(i)

是不是一下子清爽了不少?

至于 for,它可不是 forever 啊!不然这不就成死循环了吗?哈哈。

Python 还有一个特点:使用缩进来划分代码块。

在 C++ 中,我们习惯使用 {}:

if (x > 0) {
    cout << "positive";
}

而 Python 中:

if x > 0:
    print("positive")

虽然少了几个符号,但缩进在 Python 中不是单纯的排版习惯,而是语法的一部分。

这意味着代码的结构必须清晰。对于初学者来说,代码通常也会更容易阅读。

  1. 动态类型:不用提前声明变量类型

第二个特点,就是动态类型。

先看 C++:

int a = 10;
double b = 3.14;
string c = "hello";

我们需要明确告诉编译器,变量分别是什么类型。

而在 Python 中:

a = 10
b = 3.14
c = "hello"

不需要提前声明类型,Python 会在运行时根据赋给变量的对象确定其类型。

甚至还可以这样:

a = 10
a = "hello"

同一个名字 a,先后指向了整数对象和字符串对象。

当然,这并不意味着 Python 中没有类型。Python 是动态类型语言,但它仍然有严格的类型规则。

比如:

a = 10
b = "20"
print(a + b)

这段代码就会报错,因为整数和字符串不能直接相加。

所以,动态类型并不是让我们完全不用考虑类型,而是减少了声明变量时的负担。

对于我这种从 C++ 过来的人来说,这种写法确实会让人觉得入门友好。

不用每次都先想好变量类型,再写出一串声明,很多想法可以直接转化成代码。

  1. 面向对象:想找对象?先定义一个类!

第三个特点,是面向对象编程。

等等,面向对象?

想找对象的可以看这里!

如果要找对象,是不是得先定义一下理想对象的形态?

比如,我们先定义一个人:

class Person:
    def __init__(self, name, height, hobby):
        self.name = name
        self.height = height
        self.hobby = hobby

这里的 Person 就是一个类,我们可以用它来创建具体的人。

比如:

person = Person("小明", 180, "编程")

这样,我们就创建了一个 Person 对象,它包含姓名、身高和爱好等信息。

如果没有类,我们当然也可以直接使用变量、字典或者其他数据结构来记录这些信息。但当需要描述的属性越来越多,还需要为对象定义各种行为时,代码就可能变得越来越难以维护。

这时候,类就能帮助我们把相关的数据和行为组织起来。

当然,现实中的择偶标准可能远比这复杂。

你喜欢 180、八块腹肌的帅哥,还是 160、小巧玲珑的美女?总得先想好自己在意什么吧!

不然以我这种记忆力一般的人,写着写着可能就把择偶标准写串了。如果要求 180 女生还要小巧玲珑,那我可要单身一辈子了。

不过,玩笑归玩笑,面向对象真正解决的是如何组织复杂程序中的数据与行为。

这里还有一点需要注意:面向对象并不是 Python 独有的特性,C++ 同样支持面向对象编程。Python 的优势在于,它可以用相对简洁的语法完成这些操作。

  1. 跨平台:一份代码,多种操作系统

第四个特点,就是跨平台。

我们日常接触的操作系统有很多,比如 Windows、macOS、Linux。

例如:

print("Hello, World!")

这段代码在 Windows、macOS 和 Linux 上都可以运行。

不需要因为换了一台电脑,就把代码全部重新写一遍。

  1. 解释执行:写完代码,就可以直接运行

最后一个特点,是 Python 的执行方式。

在一些其他语言的开发流程中,我们通常需要经历:

源代码 → 编译 → 可执行程序 → 运行(编译这个词在前面提到过,什么语言的代码需要编译呢)

而 Python 的使用体验通常更加直接:

编写代码 → 运行程序

例如,我们创建一个 hello.py 文件:

print("Hello, World!")

然后在终端运行,就可以看到输出结果。

到这里,编译型和解释型应该就很好理解了,当然大家目前看到的其实还是表面, 至于其中更深入的原理,我还需要学习一下,之后会写一篇,从源代码出发,看看一段程序究竟是如何一步步执行起来的。

这一世,先从环境开始

回过头来看,有 C++ 的基础,再看 Python 的这些写法,确实容易上手不少。

但这一世,我不想只停在“这段语法我见过”。可以先把想法实现出来,再慢慢补上背后没弄明白的东西。

语法只是开始。

接下来,就从环境搭建和第一行代码开始,把 Python 重新学一遍。

装一个 Python 解释器

先从 Python 官网 安装 Python 3 稳定版。下面以 Windows 为例:如果使用传统安装包,勾选 Add python.exe to PATH,装好后,重新打开终端检查。

python --version

看到 Python 3.x.x 才算成功。

Anaconda?

入门暂时不用。 Anaconda 把 Python、conda 和许多数据科学工具打包在一起,做数据分析比较方便,但学基本语法用官方 Python 就够了。这个以后再写。

跑起第一行代码

以前习惯了 C++ 的编译运行,这次先把 Python 的两种常见跑法分清楚:交互式适合随手验证,文件式适合保存完整程序。

命令行交互式:随手试一行

在终端输入 python,Linux 上通常用 python3,就会进入带有 >>> 提示符的交互环境:

>>> print("Hello, World!")
Hello, World!

>>> 是解释器给的提示符,不需要自己输入。

输入代码块时,会出现 ...,表示还没输入完;最后输入一个空行,才会执行这段代码:

>>> for i in range(3):
...     print(i)
...
0
1
2

用 exit() 退出交互环境。这里用来试思路很方便,但需要保留的代码,还是写进文件吧。

文件式:保存后再运行

想保存代码,就新建 hello.py:

print("Hello, World!")

在文件所在目录运行:

python3 hello.py

这里使用 Linux 命令;Windows 上可以用 python hello.py。

什么是 Linux?这非常值得学习,以后单独拿出来写一写吧。

IDLE:先用自带的工具写起来

IDLE 是 Python 的集成开发与学习环境,提供交互式 Shell 和文件编辑器。(我有时会叫它清朝老编辑器哈哈哈哈)

打开 IDLE 后,Shell 窗口里的 >>> 和命令行交互环境用法相近。想写文件,就选 File → New File,输入代码并保存为 .py,再选 Run → Run Module,或按 F5,结果会出现在 Shell 中。

动手时顺便记住的几个习惯

缩进:每层四个空格

前面已经见过,Python 用缩进表示代码块。冒号后换行,同一层代码保持相同缩进,通常每层使用四个空格:

for i in range(3):
    if i > 0:
        print(i)

这里有个小妙招:按 Tab 可以直接完成 4 个空格的缩进。

续行:括号和反斜杠

一行太长,可以放在 () 内换行,解释器会知道表达式还没结束。这种写法更推荐:

total = (
    10 + 20
    + 30
)
print(total)

也可以在行末用反斜杠 \ 显式续行:

total = 10 + 20 + \
    30
print(total)

反斜杠对于码风优雅的我来说看着很奇怪,所以能用括号时,我会优先用括号,当然,这些拼接方式在我看来都不是很优雅,所以我尽可能避免写这么长的东西。

注释:用 # 留下说明

# 后面直到行末都是注释:

count = 3  # 重复次数
print(count)

一行写不下就每行都写一个 #,这是行注释。想写多行说明,也可以用一对三引号包起来 —— 我更喜欢三个双引号 """:

"""
先用一个简单的例子验证想法
"""
count = 3
print(count)

虚拟环境和 pip

不同项目可能需要同一个库的不同版本。下面以 Linux 为例,先给项目建一个虚拟环境,把依赖分开:

python3 -m venv .venv
source .venv/bin/activate

激活后,下面的 python 和 pip 都使用这个虚拟环境。如果系统提示缺少 venv,Ubuntu/Debian 通常需要先安装 python3-venv。

接下来用 pip 安装第三方包,以 requests 为例:

python -m pip install requests

写成 python -m pip,是为了用当前解释器对应的 pip,避免包装进另一个环境。想查看或卸载包,分别用 python -m pip list 和 python -m pip uninstall requests。

先把当前环境中已安装的包和版本导出到 requirements.txt 清单文件:

python -m pip freeze > requirements.txt

之后换电脑或新建虚拟环境时,激活新环境,再按这份清单安装依赖:

python -m pip install -r requirements.txt

.venv 不用提交到 Git,保留依赖清单就好。激活环境用完后,输入 deactivate 退出。

什么是 Git?好问题,这个也可以拿来写一写,开源大神做的东西很值得研究学习。

编辑器里也要选对环境

VS Code 安装 Python 扩展后,按 Ctrl+Shift+P,搜索 Python: Select Interpreter,选项目 .venv 里的解释器。

这次先做到:能运行脚本,也知道解释器和包在哪里。下一篇再从变量和基本语法开始。

参考:Python 官方教程 · 虚拟环境与包