厉害的不是 Python,是库

从我开始写关于开发的文章以来,我一直觉得,Python 被炒得太火了。

Python 在 2017 年初开始逐渐受到大家的关注。在 B 站搜索“Python”,有 50 页的视频结果(每页 20 条,2018 年 8 月 18 日 19 点 09 分)

后来我才发现,搜索最多能看 50 页。

B站搜索Python的结果,第一页的稿件总体上还算可以

这里面有一些是实打实的干货,但也有相当一部分是被大家所诟病的营销号的视频。通常来说,后者基本上都是录播直播课的部分内容,借以推广 QQ 群、推荐课程来牟利。这样的视频自然会取一些标题党性质的标题,我本来是不屑于看的,但是为了写这篇文章,我们暂且来看看都是什么吧:

Python 程序员本身就是 Vip,充 Vip 是不存在的!无限获取 Vip 特权! Python 爬虫爬取知乎数据,爬虫太强大了!还有什么不能爬?! WiFi 破解这个技术很普通!Python 几行代码就可以做到!进来就学会! 爬小电影网站,晚上做个好梦,python 大佬说的! Python 爬虫开发思维,学会 90% 的网站直接无视 Python 破解验证码教程,学会即可爬取大部分网站! 七夕就要到了,教你利用 Python 制作抖音超火表白神器 表弟使用 Python 的两种方法来爬取《我不是药神》高清电影和影评,VIP 都不需要了! Python 终极暴力破解 你知道 Python for 循环的真正强大之处吗?只用它就能爬取整个网站 Python 攻克 12306 最后一道防线,实现 12306 自动抢票并下单! Python 爬取今日头条街拍美女!爬虫的强大你才只看到一个角!

在今日头条上,由于我自身的关系,平台会经常推荐 Python 相关的文章。这种营销号标题党的文章也是屡见不鲜。由于今日头条的搜索功能无法搜索出来全部内容,通过无数次的刷新,我找到了一些这样的营销号标题党内容:

学会 Python 之后,感觉 PS 真的不行!Python 修图拉开 PS 几条街! 用 Python 做了个能识别图片清晰度的程序,马赛克?看不到了! 如何用 Python 来识别最简单的验证码?然后在识别 12306 的验证码? 国内顶尖白帽子用 Python 打造渗透工具集,当时花上万购买都被拒! 完美 Python 入门基础知识点总结,看完你的 Python 就完全入门了!

(顺便说一下,前两条的内容几乎完全一致)

当然,由于系统推荐的关系,我平常看到的类似内容更多。对于这种内容,我莫名想到了这一幕:

《小林家的龙女仆》第4话 09:58

看上面的内容,基本上都和爬虫、破解什么的有关。

这让我想起了很多人对于计算机专业的一个误解——“你会盗 QQ 吗?你会破解程序吗?你会……”有些人遇到我也是说关于爬虫的事情,仿佛我写了一个爬虫就能在一周之内写了一个应用于完全不同的平台的爬虫一样。

——当然,这都是题外话了。我在这篇文章里面想说的是,这些东西可能会让小白们以为 Python 本身有这些功能,进而把 Python 和爬虫等划上等号。然而,实际上,厉害的不是 Python,是库。

Python 能做的,其它语言也可以

计算机科学中有一个概念——图灵完备。

在可计算性理论里,如果一系列操作数据的规则(如指令集、编程语言、细胞自动机)可以用来模拟单带图灵机,那么它是图灵完备的。这个词源于引入图灵机概念的数学家艾伦·图灵。

虽然图灵机会受到储存能力的物理限制,图灵完全性通常指“具有无限存储能力的通用物理机器或编程语言”。

简单来说,一切可计算的问题都能计算,这样的虚拟机或者编程语言就叫图灵完备的。计算机所解决的问题都是可以计算的问题。因此,如果一个编程语言是图灵完备的,那么它能够解决计算机能够解决的所有问题。

现代的绝大多数高级编程语言都是图灵完备的,包括 C、Pascal、Java、C++、C#、Python、R、Lisp、Haskell。因此,Python 能做的,其它语言也可以。只不过,它们的区别在于性能、学习难易程度和支持等,但编程语言能做什么与编程语言本身没有什么关系。

就说大家经常遇到的爬虫吧。爬虫一般来说就是按照一定的规则取发送 HTTP 请求,传回数据,对数据进行解析,提取有效数据、存档,如此往复循环。这样一来,大家很容易发现,这就是语言无关的了。

实际上,除了 Python 外,我用过 JS 配合早已不更新的 PhantomJS 写过爬虫,还算可以。用 Java 的话应该也比较容易吧。C 语言可能有些麻烦,但是也是可行的。如果你愿意,你甚至能用机器语言来写爬虫(估计没有人会这么做吧)。

就算不知道图灵完备,高中学过算法的人应该知道,所有算法无非是顺序结构、条件结构和循环结构的组合。

所以,我十分不建议一个精通其他语言的人仅仅为了一项功能就去学其它语言,这样很容易浪费时间又学不好。

而且,不要听到 Python 就想到爬虫,不要听到爬虫就想到 Python。

厉害的不是 Python,是库

前面也说了,所有算法无非是顺序结构、条件结构和循环结构的组合。程序就是算法再加上数据结构了。但是,如果只有这些,写代码会非常麻烦。

我们举一个简单的例子:计算三个数(abc,已给定)的最大值(使用 Python 语言,使用 print 输出结果)。如果只使用基本的流程结构,代码如下:

1
2
3
4
5
6
7
if a > b:
max = a
else:
max = b
if c > max:
max = c
print(max)

实际上,Python 内置有函数 max(),可以直接返回最大值:

1
print(max(a, b, c))

max() 函数封装了球最大值的算法,并且支持更多的功能,使用起来也很方便,一下子节省 6 行。在 C 语言里面,默认是没有这样的函数的,要导入 Math 库才行。同样的情况还有很多。

我们经常要处理 JSON 数据,但是 Python 没有内置这样的功能。幸好 Python 内置有一个 json 库,导入它就能够使用其中的功能。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import json
a = '''{
"l1": {
"l1_1": [
"l1_1_1",
"l1_1_2"
],
"l1_2": {
"l1_2_1": 121
}
},
"l2": {
"l2_1": null,
"l2_2": true,
"l2_3": {}
}
}'''
b = json.loads(a)
print(b['l2'])
# 输出结果:{'l2_1': None, 'l2_2': True, 'l2_3': {}}

感兴趣的可以自己翻一下实现这个功能的代码,可以说是很复杂了。如果让你自己从头写,估计是写不好的。

Python 内置的 urllib 库用来操作 HTTP 请求,但是直接使用有一些麻烦,这时可以使用第三方库 requests 进行 HTTP 请求。requests 实际上就是对 urllib 等内置库的封装。这是目前大多数爬虫都会用到的库。

Requests

(我特意翻了一下英文文档,确实是按原文翻译的)

比较常用的还有 Pillowseleniumpymysql 等等的库,这些库封装了各种功能,使用它们可以以非常简单的方式实现复杂的功能。程序员对这种东西有一种称呼——轮子。

既然有人造了轮子,那么对于普通人来说,我们只需要知道怎么用它们就行了,至于其中的原理,不知道也暂时没太大关系。于是,很多声称使用 Python 用仅仅几行代码实现某个功能的视频或文章,实际上都是使用 Python 的某个第三方库。除了爬虫所需要的库之外,我觉得另一个在这些文章被提起得比较多的库就是 itchat,和微信相关的库,可以开发微信机器人(微商居家旅行必备)。至于 TensorFlow 什么的,本来对计算机科学的要求就很高,也就会曲高和寡。

pipPython 的第三方库的安装变得异常简单,这样就算是小白也能照着代码快速实现自己想要的功能。于是,很多人会觉得“Python 好厉害啊”,更别说那些没接触编程的人了。

实际上,厉害的不是 Python,是库。正是这些由世界各地人士开发支持的库,让我们能够轻松实现复杂的功能。

《后街女孩》第5话 14:32

除了 Python,JS 也是有着大量的第三方库,也有 npm 这样的包管理器,也和 Python 一样有着来自世界各地的社区支持。

本人才疏学浅,如有纰漏,万望见谅。

参考资料

除视频截图外,还有: