入门科普:什么时候要用Python?用哪
导读:Python是一种高级、开源、通用的编程语言,广泛用于脚本编写并跨领域使用。Python源自于Guido Van Rossum的创意,20世纪80年代后期被认为是ABC语言的继承者,两者都是由荷兰国家数学和计算机科学研究所(Centrum Wiskunde & Informatica,CWI)开发。Python最初设计为脚本和解释语言,而且到目前为止,它仍然是最流行的脚本语言之一。
Python使用面向对象编程(object-oriented programming,OOP)和构造,你可以像任何其它面向对象的语言一样使用它,譬如Java。
由Guido为该语言起的Python名字不是指蛇,而是意指电视喜剧片“蒙提·派森的飞行马戏团” (Monty Python's Flying Circus),因为他是一个超级粉丝。
01 了解Python
Python是一种通用编程语言,支持多种编程范式,包括以下流行的编程范式:
面向对象编程
函数式编程
过程编程
面向方面的编程
Python中具备很多OOP概念,包括类、对象、数据和方法。诸如抽象、封装、继承和多态的原则也可以使用Python来实现和展现。Python中有几个高级功能,包括迭代器、生成器、列表解析器、lambda表达式和几个模块(如itertools和functools),它们提供了遵循函数编程范式编写代码的能力。
Python的设计思想:简单而美丽的程序代码应该遵循更加优雅和易于使用的风格,而不是过早优化和编写难以解释的代码。Python标准库功能强大,具有从低级硬件接口到处理文件和处理文本数据的各种功能和特性。易于扩展和集成使得在开发Python时,可以轻松地实现与现有应用程序集成——甚至可以创建应用程序接口(application programming interfaces,API),以提供与其它应用程序和工具的接口。
Python过去数年在各领域的迅速发展应用,使得Python广受欢迎。如果在编写代码时不遵循简单、优雅和极简主义的Python正确原则,则代码被称为不是“pythonic”。编写好的Python代码有一种众人熟知的风格和约定,许多文章和书籍教导了如何编写pythonic式的代码。
在Python社区中,活跃用户和开发人员称其为Pythonistas、Pythoneers以及其它更多有趣的名称。因为Python及其整个生态系统一直是在积极的改进和发展,繁荣的Python社区使得这门语言更加鼓舞人心。
02 应用:何时使用Python
Python作为通用的多用途编程语言,能为不同领域构建应用程序和系统,并解决各种现实世界中的问题。Python自带有一个标准库,它包括大量对于解决各种问题有用的库和模块。除了标准库,互联网上还有数以千计的第三方库随时可用,它们用于鼓励开源和积极开发。官方存储库是Python的程序包索引(Python Package Index,PyPI),用于托管第三方库以及Python增强开发的工具。你可以访问https://pypi.python.org并查看各种程序包。目前,可以安装和使用的程序包超过80,000个。
Python可以用来解决大量问题,下面列出一些最受欢迎的应用领域:
脚本(Scripting):Python被称为脚本语言。它可以用于执行许多任务,例如:与网络、硬件的接口,处理文件和数据库,执行操作系统操作,以及接收和发送电子邮件。Python也广泛用于服务器端脚本,甚至用于开发服务网页的整个Web服务器。许多Python脚本是以ad-hoc方式用于自动化操作,譬如:网络套接字通信,处理电子邮件,解析和提取网页,通过FTP进行文件共享和传输,通过不同协议进行通信,以及其它多种操作。
Web开发(Web development):有很多广泛用于Web开发的强大且稳定的Python框架,包括Django、Flask、Web2Py和Pyramid。你可以使用它们来开发完整的企业Web应用程序,Python支持各种架构风格,如RESTful API和MVC架构。Python还提供数据库交互的ORM支持,并在其上使用OOP。Python甚至还有像Kivy这样的框架,可以支持跨平台开发,用于在iOS、Android、Windows和OS X等多个平台上开发应用程序。Python也用于在IronPython中开发具有Silverlight框架支持的富互联网应用程序(rich internet applications,RIA),IronPython是一个受欢迎的Microsoft .NET框架和pyjs完美集成的Python版本,RIA开发架构支持Python到JavaScript的编译器和AJAX框架。
图形用户界面(Graphical user interfaces,GUIs):使用Python可以轻松构建大量具有GUI的桌面应用程序。Tkinter、PyQt、PyGTK和wxPython之类的库和API允许开发人员通过简单/复杂的接口开发基于GUI的应用程序。多样化的框架使得开发人员能够为不同的操作系统和平台开发基于GUI的应用程序。
系统编程(Systems programming):作为一门高级语言,Python具有与低级OS服务和协议的大量接口,并且这些服务之上的抽象使得开发人员能够编写强大而可移植的系统监视和管理工具。我们可以使用Python执行操作系统操作,包括创建、处理、搜索、删除和管理文件和目录。Python标准库(Python standard library,PSL)提供操作系统和POSIX绑定,可用于处理文件、多线程、多处理、环境变量、控制套接字、管道和进程。这也增强了Python脚本编写能力,以最少的工作和代码行来执行系统级的管理任务。
数据库编程(Database programming):Python用于连接和访问来自不同类型数据库的数据,无论是SQL还是NoSQL。MySQL、MSSQL、MongoDB、Oracle、PostgreSQL和SQLite之类的数据库都有API和连接器。事实上,SQLite是一个轻量级的关系数据库,现在它是作为Python标准发布版的一部分。SQLAlchemy和SQLObject这类的热门库提供了访问各种关系数据库的接口,并且还具备ORM组件来帮助在关系表之上实现OOP风格的类和对象。
科学计算(Scientific computing):Python在数值和科学计算等领域展示了多用途的禀赋。你可以使用Python执行简单和复杂的数学运算,包括代数和微积分。诸如SciPy和NumPy这样的库能够帮助研究人员、科学家和开发人员利用高度优化的函数和接口进行数值和科学编程。这些库也是在机器学习等各个领域开发复杂算法的基础。
机器学习(Machine learning):Python被视为当今最流行的机器学习语言之一。Python有一套广泛的库和框架,如scikit-learn、h2o、tensorflow、theano,甚至还有numpy和scipy这样的核心库,不仅能够实现机器学习算法,而且还使用它们来解决现实世界中的高级分析问题。
文本分析(Text analytics):如上所述,Python可以很好地处理文本数据,这方面产生了几个流行的库用来进行NLP、信息检索和文本分析,如nltk、gensim和pattern。你还可以应用标准机器学习算法来解决与文本分析相关的问题。Python生态系统中易于使用的程序包可以减少开发的时间和工作量。我们将在本书中探讨其中的几个库。
尽管上述列表看起来显得非常强大了,但这些只不过是用Python可能解决的问题领域中的冰山一角。它还广泛应用于人工智能(AI)、游戏开发、机器人、物联网(IoT)、计算机视觉、多媒体处理以及网络和系统监控等几个领域,上面仅列举几例。
想要阅读Python在诸如艺术、科学、计算机科学、教育等不同领域所取得的一些广泛成功案例,可以访问www.python.org/about/success/。要了解使用Python开发的各种流行应用程序,请参阅www.python.org/about/apps/和https://wiki.python.org/moin/Applications,你一定会找到你已经使用的一些应用程序——其中一些是不可或缺的。
03 缺点:何时不用Python
你或许想知道它有什么缺点呢?确实如此,像任何工具或语言一样,Python有一些缺点,在这里我们将强调其中的一些缺点,以便你在Python中开发和编写代码时了解它们:
执行速度性能:性能是一个非常关键的方面,可以表示几件事情,所以我们会精确地确定我们要谈论的准确范围就是指执行速度。因为Python并不是一个完全编译的语言,因此它总是比完全编译的低级编程语言(如C和C ++)慢些。你有几种方法可以优化代码,包括多线程和多处理。你也可以使用静态类型和Python的C语言扩展(称为Cython)。你还可以考虑使用PyPy,它比普通Python快得多,因为它使用即时(just-in-time,JIT)编译器(参见http://pypy.org),但是如果你编写优化的代码,你通常可以在Python中很好地开发应用程序,而不需要依赖其它语言。请记住问题通常不在于工具,而是你编写的代码——所有开发人员和工程师都会随着时间和经验而意识到这一点。
全局解释器锁(Global Interpreter Lock ,GIL):GIL是一个互斥锁,用于多个编程语言解释器,如Python和Ruby。解释器使用GIL只允许单个线程一次有效执行,即使它在多核处理器上运行时,从而有效限制了多线程实现的并行性,这取决于进程是I / O绑定还是CPU绑定,以及在解释器之外有多少个调用。
版本不兼容:如果你一直在跟踪Python的新闻,你知道Python在2.7.x之上发布了3.x版本,由于它在许多方面都是向后不兼容的,这确实会带来一大堆亟待解决的复杂问题。在Python 2.7中构建的几个主要库和程序包会在用户不经意更新Python版本时开始中断。因此,由于遗留代码问题,一大批企业和开发者社区仍然使用Python 2.7.x,因为这些程序包和库的新版本从未建成。代码弃用和版本更改是系统崩溃中的一些最重要的因素。
上述这些问题,其中许多并不是Python特有的,也适用于其它语言,所以不要仅仅因为前面说的几点就不再鼓励你使用Python了——但是,你在编写代码和构建系统时一定要记住它们。
04 Python实现和版本
Python有几种不同版本的实现方式,因为它们正在积极开发中,版本会定期发布。目前,有四种产品完备的、强大和稳定的主流Python实现:
CPython是常规的老版本Python,也是我们通常所称的Python。它既是编译器也是解释器,有自己的一套全部用标准C语言编写的标准程序包和模块。该版本可以直接用于所有流行的当前平台。大多数的Python第三方程序包和库与此版本兼容。
PyPy是Python实现的一个更快实现,它使用JIT编译器来使代码运行速度比CPython实现的速度更快——有时提供达10x-100x的加速。PyPy还有更高的内存效率,支持greenlet和stackless从而具有高并行性和并发性。
Jython是Java平台的Python实现,它支持Java虚拟机(Java Virtual Machine,JVM),适用于任何版本的Java(版本最好是7以上)。通过使用Jython,你可以用所有类型的Java库、包和框架来编写代码。当你更多地了解Java语法和Java中广泛使用的OOP原则(如类、对象和接口)时,它的效果最好。
IronPython是流行的Microsoft .NET框架的Python实现,也称为通用语言运行时(Common Language Runtime,CLR)。你可以使用IronPython中的所有Microsoft CLR库和框架,即使你实质上并不需要在C#中编写代码,它也有助于你更多地了解C#的语法和构造,以有效地使用IronPython。
我们首先建议你使用默认的Python版本,即CPython实现,只有当你真的有兴趣与其它语言(如C#和Java)进行接口并需要在代码库中使用它们时,才可以去尝试其它版本。
关于使用何种版本的Python尚有许多争论。最好的方法是你要考虑解决的问题以及需要使用的完整软件生态系统,从库、依赖关系和架构开始到实现和部署——同时也要考虑重用现有的旧代码库。
如前所述,两个主要的Python版本是2.x系列和3.x系列。它们是非常相似的,但是在3.x版本中出现了几个向后不兼容的变化,这导致在使用2.x的人和使用3.x的人之间产生了巨大迁移。PyPI上的大多数遗留代码和大部分的Python包都是在Python 2.7.x中开发的,因为所需的工作量不会很小,许多程序包的所有者没有时间或意愿将其将所有代码库移植到Python 3.x。下面是3.x系列中的一些变化:
默认情况下,所有文本字符串均为Unicode。
print和exec现在是函数,不再是语句。
range()返回一个内存高效的iterable,而不再是一个列表。
修改了类的风格。
基于惯例和类型冲突进行了库和名称变更。
要了解更多Python 3.0所引入的变更情况,请查看https://docs.python.org/3/whatsnew/3.0.html,上面的官方文档列出了变更。如果你将代码从Python 2移植到Python 3,关于什么变化会破坏你的代码,这个链接应该给你一个很好的解读。
对于选择哪个版本的问题,对此并没有绝对的答案。它纯粹取决于你正在试图解决的问题,现有代码和具有的基础设施,将来如何维护代码以及所有必要的依赖关系。
如果你正在开始一个全新项目,也非常清楚你并不需要任何仅依赖于Python 2.x的外部程序包和库,那么你可以继续使用Python 3.x并启动系统开发。但是,如果你有很多依赖于外部的程序包,并且可能会破坏Python 3.x或仅仅适用于Python 2.x,那么你就别无选择,只能坚持使用Python 2.x了。
05 Python句法和结构
在编写代码时你应该记住,Python代码有一个清晰的分层语法。任何大型Python应用程序或系统都由多个模块构建,这些模块本身由Python语句组成。每条语句就像系统的命令或指令,指挥它应该执行什么操作,这些语句由表达式和对象组成。Python中的所有东西都是对象——包括函数、数据结构、类型、类,等等。下图显示了这种层次结构。
▲Python程序层次结构
基本语句由对象、表达式组成,表达式通常使用对象并对其进行处理和执行操作。
对象可以是从简单数据类型和结构到复杂对象的任何东西,包括函数和具有自己特定作用的保留字。Python有大约37个关键字或保留字,它们有自己设定的作用和功能。下表详细列出了每一个关键字,包括你在代码中使用它们时应该会感到有用和方便的示例。
SI序号 | 关键字 | 说明 | 示例 |
1 | and | 逻辑AND运算符 | (5==5 and 1==2) == False |
2 | as | 用作某些对象/引用的同义词 | with open('file.txt') as f |
3 | assert | 断言/检查表达式是否为True | assert 1==2, "Not Equal" |
4 | async | 函数声明为异步(协同:co-routine) | async def get_data(): |
5 | await | 用于调用协同程序 | return await get_data() |
6 | break | 跳出执行循环 | while True: |
break | |||
7 | class | 创建一个类(OOP) | class ClassifyText(object): |
8 | continue | 继续循环的下一个迭代 | while True: |
if a==1: continue | |||
9 | def | 定义一个函数 | def add(a,b): |
return a+b | |||
10 | del | 删除引用 | del arr |
11 | elif | Else-if条件语句 | if num==1: print '1' |
elif num==2: print '2' | |||
12 | else | Else条件语句 | if num==1: print '1' |
else: print 'not 1' | |||
13 | except | 捕捉异常 | except ValueError, e: print e |
14 | exec | 动态执行代码 | exec 'print "Hello Python"' |
15 | FALSE | 布尔值假 | False == 0 |
16 | finally | 在try-except之后的最后执行语句 | finally: print 'end of |
exception' | |||
17 | for | for循环 | for num in arr: print num |
18 | from | 从模块导入特定组件 | from nltk.corpus import |
brown | |||
19 | global | 声明变量为全局变量 | global var |
20 | if | if条件 | if num==1: print '1' |
21 | import | 导入现有模块 | import numpy |
22 | in | 对现有对象检查或循环 | for num in arr \ if x in y |
23 | is | 用于检查是否相等 | type('a') is str |
24 | lambda | 创建一个匿名函数 | lambda a: a**a |
25 | None | 表示无值或空值 | num = None |
26 | nonlocal | 在函数中修改外部的但非全局范围的变量值 | nonlocal var |
27 | not | 逻辑NOT运算符 | not 1 == 2 |
28 | or | 逻辑OR运算符 | 1 or 2 == 1 |
29 | pass | 用作指示空块的占位符 | if a == 1: pass |
30 | 打印字符串或其它对象 | print 'Hello World!' | |
31 | raise | 引发异常 | raise Exception('overflow') |
32 | return | 从函数退出后返回对象 | return a, b |
33 | try | 执行try语句的代码块,如果发生异常,执行except语句 | try: read_file() |
except Exception, e: print e | |||
34 | while | while循环 | while True: print value |
35 | with | 对表达式中的对象执行操作 | with open('file.txt') as f: |
data = f.read() | |||
36 | yield | 生成器功能,暂停并返回给调用者 | def generate_func(arr): |
for num in arr: yield num+1 |
▲Python保留字
有几点事项需要记住。关键字async和await仅在Python 3.5.x之后的版本中才可用。关键字exec和print是仅用在Python 2.x系列中的语句——从Python 3.x开始,它们是函数。关键字列表中的False、True和nonlocal是从Python 3.x系列开始引入。
Python语句通常指示解释器在执行语句时应该做什么。一串语句通常形成一个逻辑的代码块。包括函数和循环以及条件的各种构造有助于分隔和执行基于用户决策逻辑和设计的代码块。
Python也非常关注代码的可读性——因此缩进是Python代码的重要组成部分。默认情况下,Python不使用像分号的标点符号来表示语句结束。它还使用制表符或空格来显示和分隔特定的代码块,而不是像C、C ++、Java等语言中使用传统的括号或关键字。
Python接受空格和制表符作为缩进,通常的规范是一个制表符或四个空格来表示每个特定的代码块。未缩进的代码总是会引起语法错误,所以任何人在编写Python代码时都必须格外小心,要注意代码的格式和缩进。
Python程序通常围绕前面提到的层次结构。每个模块通常都是一个带有_init__.py文件的目录,该文件使目录成为一个包,它还可能有多个模块,每个模块都是一个单独的Python(.py)文件。每个模块通常都有类和对象,例如其它模块和代码调用的函数。所有互连的模块最终构成了一个完整的Python程序、应用或系统。通常,你可以通过在Python(.py)文件中编写必要的代码来启动任意的项目,并在项目因为添加更多组件而增大时要使其变得更模块化。
06 Python之禅
你或许想知道Python之禅究竟是什么,在你对Python很熟悉时,这是你应首先了解的事情之一。Python之美在于其简洁和优雅的风格。在程序设计中,Python有20条有影响力的指导原则或格言。资深的Python开拓者(Pythoneer)Tim Peters在1999年记录了其中19个,可以通过https://hg.python.org/peps/file/tip/pep-0020.txt访问它们,它们已作为Python增强建议(Python Enhancement Proposals,PEP)第20号(PEP 20)的一部分。如果你已经安装了Python,这些最好的原则部分内容可以随时通过在Python或IPython shell中运行以下代码来访问Python的Zen:
In [5]: import this
The Zen of Python, by Tim Peters
Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let's do more of those!
上述输出的显示形成Python之禅的19条原则,其作为复活节彩蛋被包括在Python语言本身中。这些原则是用简单的英语编写,即使你以前没有写过代码,很多都是很一目了然的,其中很多蕴含着笑话!Python专注于编写可读的、简单干净的代码。Python还旨在确保你能专注于错误处理和实现易于解释和理解的代码。
请你记住的一个原则是“简单胜过复杂”(Simple is better than complex),它不仅适用于Python,而且适用于在解决问题世界时所遇到的很多事情。只要你知道在做什么,有时一个简单的方法比一个更复杂的会更好。
关于作者:迪潘简·撒卡尔,Intel公司的数据科学家,研究领域涉及数据科学与软件工程,有着丰富的文本分析研究和工程方面的经验,出版过多本R语言和机器学习方面的书籍。
本文摘编自《Python文本分析》,经出版方授权发布。
Python文本分析
作者:[印度] 迪潘简·撒卡尔 著
延伸阅读《Python文本分析》
转载请联系微信:togo-maruko
点击文末右下角“写留言”发表你的观点
长按下方二维码
发现更多经典好书+近期新书!
在下方推荐阅读中查看更多书单&书摘
不要错过!
更多精彩
在公众号后台对话框输入以下关键词
查看更多优质内容!
PPT | 报告 | 读书 | 书单 | 干货
Python | 机器学习 | 深度学习 | 神经网络
区块链 | 揭秘 | 高考 | 福利
推荐阅读
从技术小白到老司机,这20本书帮你“快进”20年
送书!1991-2018,区块链的那点事,都在这里了!
能救命!你不是药神,但你就是你自己的数据之神!
2018上半年这10本新书,技术大牛们都在追着看
Q: Python之禅你get到了吗?
欢迎留言与大家分享
觉得不错,请把这篇文章分享给你的朋友
转载 / 投稿请联系:baiyu@hzbook.com
更多精彩,请在后台点击“历史文章”查看
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341