厉害的不是Python,是库


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

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

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输出结果)。如果只使用基本的流程结构,代码如下:

if a > b:
    max = a
else:
    max = b
if c > max:
    max = c
print(max)

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

print(max(a, b, c))

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

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

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

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

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

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

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

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

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

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

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

参考资料

除视频截图外,还有:


文章作者: 丁俊尧
版权声明: 本博客所有文章除特別声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 丁俊尧 !
  目录