这是「重拾 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 的常见语法对照表。
| 对比项目 | C | C++ | 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 的简单究竟体现在哪里。
语言特点
- 语法简洁,代码更容易阅读
先从最简单的 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 中不是单纯的排版习惯,而是语法的一部分。
这意味着代码的结构必须清晰。对于初学者来说,代码通常也会更容易阅读。
- 动态类型:不用提前声明变量类型
第二个特点,就是动态类型。
先看 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++ 过来的人来说,这种写法确实会让人觉得入门友好。
不用每次都先想好变量类型,再写出一串声明,很多想法可以直接转化成代码。
- 面向对象:想找对象?先定义一个类!
第三个特点,是面向对象编程。
等等,面向对象?
想找对象的可以看这里!
如果要找对象,是不是得先定义一下理想对象的形态?
比如,我们先定义一个人:
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 的优势在于,它可以用相对简洁的语法完成这些操作。
- 跨平台:一份代码,多种操作系统
第四个特点,就是跨平台。
我们日常接触的操作系统有很多,比如 Windows、macOS、Linux。
例如:
print("Hello, World!")这段代码在 Windows、macOS 和 Linux 上都可以运行。
不需要因为换了一台电脑,就把代码全部重新写一遍。
- 解释执行:写完代码,就可以直接运行
最后一个特点,是 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 官方教程 · 虚拟环境与包