⑴ ubuntu怎么安装python-tox

1、打开终端(Ctrl+Alt+T)

2、输入:

sudoapt-getinstallpython-tox-y

再输入密码

⑵ Python 有什么奇技淫巧

看看下面这些算不算1.元类(metaclass)PyPy的源码里有个pair和extendabletype"""Twomagictricksforclasses:classX:__metaclass__=extendabletype#insomeotherfileclass__extend__(X):#hthesecondtrick,whichletsyoubuildmethodswhose'self':class__extend__(pairtype(X,Y)):attribute=42defmethod((x,y),other,arguments):pair(x,y).attributepair(x,y).method(other,arguments)atgointothepair(),withtheusualrulesofmethod/attributeoverridingin(pairsof)subclasses.Formoreinformation,seetest_pairtype."""classextendabletype(type):"""Atypewithasyntaxtrick:'class__extend__(t)''t'insteadofcreatinganewsubclass."""def__new__(cls,name,bases,dict):ifname=='__extend__':forclsinbases:forkey,valueindict.items():ifkey=='__mole__':continue#?setattr(cls,key,value)returnNoneelse:returnsuper(extendabletype,cls).__new__(cls,name,bases,dict)defpair(a,b):"""Returnapairobject."""tp=pairtype(a.__class__,b.__class__)returntp((a,b))#={}defpairtype(cls1,cls2):"""type(pair(a,b))ispairtype(a.__class__,b.__class__)."""try:pair=pairtypecache[cls1,cls2]exceptKeyError:name='pairtype(%s,%s)'%(cls1.__name__,cls2.__name__)bases1=[pairtype(base1,cls2)forbase1incls1.__bases__]bases2=[pairtype(cls1,base2)forbase2incls2.__bases__]bases=tuple(bases1+bases2)or(tuple,)#'tuple':ultimatebasepair=pairtypecache[cls1,cls2]=extendabletype(name,bases,{})returnpair先说extendabletype。嘛其实注释已经说得听明白了,就是一个C#里面的partialclass的Python实现。然后是pair和pairtype。pairtype就是根据两个类创建一个新的类,这个类继承自使用这两个类的基类构造的pairtype(有点绕……)或者tuple。有啥用呢?可以拿来实现multimethod。class__extend__(pairtype(int,int)):deffoo((x,y)):print'int-int:%s-%s'%(x,y)class__extend__(pairtype(bool,bool)):defbar((x,y)):print'bool-bool:%s-%s'%(x,y)pair(False,True).foo()#prints'int-int:False,True'pair(123,True).foo()#prints'int-int:123,True'pair(False,True).bar()#prints'bool-bool:False,True'pair(123,True).bar()#Oops,nosuchmethod好像这个例子里元类只是个打辅助的角色,好玩的都在那个pair里……再换一个。classGameObjectMeta(type):def__new__(mcls,clsname,bases,_dict):fork,vin_dict.items():ifisinstance(v,(list,set)):_dict[k]=tuple(v)#mutableobjnotallowedcls=type.__new__(mcls,clsname,bases,_dict)all_gameobjects.add(cls)forbinbases:game_objects_hierarchy.add((b,cls))returncls@staticmethoddef_mp_gameobject_hierarchy():withopen('/dev/shm/gomap.dot','w')asf:f.write('digraph{\nrankdir=LR;\n')f.write('\n'.join(['"%s"->"%s";'%(a.__name__,b.__name__)fora,bingame_objects_hierarchy]))f.write('}')def__setattr__(cls,field,v):type.__setattr__(cls,field,v)iffieldin('ui_meta',):returnlog.warning('SetAttr:%s.%s=%s'%(cls.__name__,field,repr(v)))这个是从我写的三国杀游戏中提取的一段代码(点我签名上的链接)。大意就是把class上所有可变的容器都换成不可变的,然后记录下继承关系。曾经被这个问题坑过,class上的值是全局共享的,逻辑代码一不小心修改了class上的值,单机测试的时候是测不出来的,然后放到线上……就悲剧了……当时绞尽脑汁没有想到是这个问题硬生生的回滚了……发现了问题之后就加上了这个东西,不允许修改class上的东西。记录下继承关系是为了画类图。还有就是常用的做数据注入metadata={}defgen_metafunc(_for):defmetafunc(clsname,bases,_dict):meta_for=getattr(_for,clsname)meta_for.ui_meta=UIMetaDescriptor()ifmeta_forinmetadata:raiseException('%sui_metaredefinition!'%meta_for)metadata[meta_for]=_.thbimportcharacters__metaclass__=gen_metafunc(characters.sakuya)classSakuya:#于是这个就不是类了,而是作为数据存到了metadata这个dict里char_name=u'十六夜咲夜'port_image='thb-portrait-sakuya'figure_image='thb-figure-sakuya'miss_sound_effect='thb-cv-sakuya_miss'description=(u'|DB完全潇洒的PAD长十六夜咲夜体力:4|r\n\n'u'|G月时计|r:|B锁定技|r,准备阶段开始时,你执行一个额外的出牌阶段。\n\n'u'|G飞刀|r:你可以将一张装备牌当【弹幕】使用或打出。按此法使用的【弹幕】无距离限制。\n\n'u'|DB(画师:小D@星の妄想乡,CV:VV)|r')Ruby党不要喷,我知道你们可以做的更优雅……2.Python沙盒逃逸刷新三观的Python代码3.PEP302NewImportHook最近在把刚才提到的纯Python游戏向Unity引擎上移植。玩过Unity的就会知道,Unity的游戏的资源都是打包在一起的,没有单独的文件,Python解释器就不高兴了……于是写了importhook,用Unity提供的API来读py文件。#-*-coding:utf-8-*-#--stdlib--importimpimportsys#--thirdparty--#--own--fromclrimportUnityEngine,WarpGateController#--code--classUnityResourceImporter(object):known_builtin=('sys','imp','cStringIO','gevent_core','gevent_ares','gevent_util','gevent_semaphore','msgpack_packer','msgpack_unpacker','UnityEngine',)def__init__(self,bases,unity_loader):self.bases=basesself.last_fullname=''self.last_text=''self.last_ispkg=Falseself.unity_load=unity_loaderdeffind_mole(self,fullname,path=None):iffullnameinsys.moles:returnselfhead=fullname.split('.')[0]ifheadinself.known_builtin:returnNonerst=self.do_load_mole(fullname)ifrst:self.last_text,self.last_ispkg=rstself.last_fullname=fullnamereturnselfelse:returnNonedefload_mole(self,fullname):iffullnameinsys.moles:returnsys.moles[fullname]iffullname!=self.last_fullname:self.find_mole(fullname)try:code=self.last_textispkg=self.last_ispkgmod=sys.moles.setdefault(fullname,imp.new_mole(fullname))mod.__file__=""%fullnamemod.__loader__=selfifispkg:mod.__path__=[]mod.__package__=fullnameelse:mod.__package__=fullname.rpartition('.')[0]co=compile(code,mod.__file__,'exec')exec(co,mod.__dict__)returnmodexceptExceptionase:UnityEngine.Debug.LogError('Errorimporting%s%s'%(fullname,e))raiseImportError(e)defdo_load_mole(self,fullname):fn=fullname.replace('.','/')asset=self.try_load(fn+'.py')ifassetisnotNone:returnasset,Falseasset=self.try_load(fn+'/__init__.py')ifassetisnotNone:returnasset,Truedeftry_load(self,filename):forbinself.bases:asset=self.unity_load(b+filename)ifassetisnotNone:returnassetreturnNonesys.meta_path.append(UnityResourceImporter(['Python/THBattle/','Python/Site/','Python/Stdlib/',],WarpGateController.GetTextAsset))需要的extensionmole都静态编译到解释器里了,所以没考虑。4.可以批量执行操作的listclassBatchList(list):def__getattribute__(self,name):try:list_attr=list.__getattribute__(self,name)returnlist_attrexceptAttributeError:passreturnlist.__getattribute__(self,'__class__')(getattr(i,name)foriinself)def__call__(self,*a,**k):returnlist.__getattribute__(self,'__class__')(f(*a,**k)forfinself)classFoo(object):def__init__(self,v):self.value=vdeffoo(self):print'Foo!',self.valuefoo=Foo(1)foo.foo()#Foo!1foos=BatchList(Foo(i)foriinxrange(10))foos.value#BatchList([0,1,2,3,,9])foos.foo()#你能猜到的

⑶ Python 有什么奇技淫巧

Python奇技淫巧当发布python第三方package时,并不希望代码中所有的函数或者class可以被外部import,在__init__.py中添加__all__属性,该list中填写可以import的类或者函数名,可以起到限制的import的作用,防止外部import其他函数或者类#!/usr/bin/envpython#-*-coding:utf-8-*-e,export,(LogFormatter,disable_logging_to_stderr,enable_logging_to_kids,info)__all__=['APIBase','Client','LogFormatter','Server','Storage','disable_logging_to_stderr','enable_logging_to_kids','export','info','interface','stream']with的魔力with语句需要支持上下文管理协议的对象,上下文管理协议包含__enter__和__exit__两个方法.with语句建立运行时上下文需要通过这两个方法执行进入和退出操作.其中上下文表达式是跟在with之后的表达式,该表示大返回一个上下文管理对象#常见with使用场景withopen("test.txt","r")asmy_file:#注意,是__enter__()方法的返回值赋值给了my_file,forlineinmy_file:printline详细原理可以查看这篇文章,浅谈Python的with语句知道具体原理,我们可以自定义支持上下文管理协议的类,类中实现__enter__和__exit__方法#!/usr/bin/envpython#-*-coding:utf-8-*-classMyWith(object):def__init__(self):print"__init__method"def__enter__(self):print"__enter__method"returnself#返回对象给as后的变量def__exit__(self,exc_type,exc_value,exc_traceback):print"__exit__method"ifexc_tracebackisNone:print"ExitedwithoutException"returnTrueelse:print"ExitedwithException"returnFalsedeftest_with():withMyWith()asmy_with:print"runningmy_with"print"------分割线-----"withMyWith()asmy_with:print"runningbeforeException"raiseExceptionprint"runningafterException"if__name__=='__main__':test_with()执行结果如下:__init__method__enter__methodrunningmy_with__exit__methodExitedwithoutException------分割线-----__init__method__enter__methodrunningbeforeException__exit__(mostrecentcalllast):File"bin/python",line34,inexec(compile(__file__f.read(),__file__,"exec"))File"test_with.py",line33,intest_with()File"test_with.py",line28,intest_withraiseExceptionException证明了会先执行__enter__方法,然后调用with内的逻辑,最后执行__exit__做退出处理,并且,即使出现异常也能正常退出filter的用法相对filter而言,map和rece使用的会更频繁一些,filter正如其名字,按照某种规则过滤掉一些元素#!/usr/bin/envpython#-*-coding:utf-8-*-lst=[1,2,3,4,5,6]#所有奇数都会返回True,偶数会返回False被过滤掉printfilter(lambdax:x%2!=0,lst)#输出结果[1,3,5]一行作判断当条件满足时,返回的为等号后面的变量,否则返回else后语句lst=[1,2,3]new_lst=lst[0]_lst#打印结果1装饰器之单例使用装饰器实现简单的单例模式#单例装饰器defsingleton(cls):instances=dict()#初始为空def_singleton(*args,**kwargs):ifclsnotininstances:#如果不存在,则创建并放入字典instances[cls]=cls(*args,**kwargs)returninstances[cls]return_singleton@singletonclassTest(object):passif__name__=='__main__':t1=Test()t2=Test()#两者具有相同的地址printt1,t2staticmethod装饰器类中两种常用的装饰,首先区分一下他们普通成员函数,其中第一个隐式参数为对象classmethod装饰器,类方法(给人感觉非常类似于OC中的类方法),其中第一个隐式参数为类staticmethod装饰器,没有任何隐式参数.python中的静态方法类似与C++中的静态方法#!/usr/bin/envpython#-*-coding:utf-8-*-classA(object):#普通成员函数deffoo(self,x):print"executingfoo(%s,%s)"%(self,x)@classmethod#使用classmethod进行装饰defclass_foo(cls,x):print"executingclass_foo(%s,%s)"%(cls,x)@staticmethod#使用staticmethod进行装饰defstatic_foo(x):print"executingstatic_foo(%s)"%xdeftest_three_method():obj=A()#直接调用噗通的成员方法obj.foo("para")#此处obj对象作为成员函数的隐式参数,就是selfobj.class_foo("para")#此处类作为隐式参数被传入,就是clsA.class_foo("para")#更直接的类方法调用obj.static_foo("para")#静态方法并没有任何隐式参数,但是要通过对象或者类进行调用A.static_foo("para")if__name__=='__main__':test_three_method()#函数输出executingfoo(,para)executingclass_foo(,para)executingclass_foo(,para)executingstatic_foo(para)executingstatic_foo(para)property装饰器定义私有类属性将property与装饰器结合实现属性私有化(更简单安全的实现get和set方法)#python内建函数property(fget=None,fset=None,fdel=None,doc=None)fget是获取属性的值的函数,fset是设置属性值的函数,fdel是删除属性的函数,doc是一个字符串(likeacomment).从实现来看,这些参数都是可选的property有三个方法getter(),setter()和delete()来指定fget,fset和fdel。这表示以下这行classStudent(object):@property#相当于property.getter(score)或者property(score)defscore(self):[email protected]#相当于score=property.setter(score)defscore(self,value):ifnotisinstance(value,int):raiseValueError('scoremustbeaninteger!')ifvalue100:raiseValueError('scoremustbetween0~100!')self._score=valueiter魔法通过yield和__iter__的结合,我们可以把一个对象变成可迭代的通过__str__的重写,可以直接通过想要的形式打印对象#!/usr/bin/envpython#-*-coding:utf-8-*-classTestIter(object):def__init__(self):self.lst=[1,2,3,4,5]defread(self):foreleinxrange(len(self.lst)):yieldeledef__iter__(self):returnself.read()def__str__(self):return','.join(map(str,self.lst))__repr__=__str__deftest_iter():obj=TestIter()fornuminobj:printnumprintobjif__name__=='__main__':test_iter()神奇partialpartial使用上很像C++中仿函数(函数对象).在stackoverflow给出了类似与partial的运行方式defpartial(func,*part_args):defwrapper(*extra_args):args=list(part_args)args.extend(extra_args)returnfunc(*args)returnwrapper利用用闭包的特性绑定预先绑定一些函数参数,返回一个可调用的变量,直到真正的调用执行#!/usr/bin/envpython#-*-coding:utf-8-*-(a,b):returna+bdeftest_partial():fun=partial(sum,2)#事先绑定一个参数,fun成为一个只需要一个参数的可调用变量printfun(3)#实现执行的即是sum(2,3)if__name__=='__main__':test_partial()#执行结果5神秘evaleval我理解为一种内嵌的python解释器(这种解释可能会有偏差),会解释字符串为对应的代码并执行,并且将执行结果返回看一下下面这个例子#!/usr/bin/envpython#-*-coding:utf-8-*-deftest_first():return3deftest_second(num):returnnumaction={#可以看做是一个sandbox"para":5,"test_first":test_first,"test_second":test_second}deftest_eavl():condition="para==5andtest_second(test_first)>5"res=eval(condition,action)#解释condition并根据action对应的动作执行printresif__name__=='_execexec在Python中会忽略返回值,总是返回None,eval会返回执行代码或语句的返回值exec和eval在执行代码时,除了返回值其他行为都相同在传入字符串时,会使用compile(source,'',mode)编译字节码.mode的取值为exec和eval#!/usr/bin/envpython#-*-coding:utf-8-*-deftest_first():print"hello"deftest_second():test_first()print"second"deftest_third():print"third"action={"test_second":test_second,"test_third":test_third}deftest_exec():exec"test_second"inactionif__name__=='__main__':test_exec()#无法看到执行结果getattrgetattr(object,name[,default]).namemustbeastring.’sattributes,.Forexample,getattr(x,‘foobar’)isequivalenttox.foobar.,defaultisreturnedifprovided,.通过string类型的name,返回对象的name属性(方法)对应的值,如果属性不存在,则返回默认值,相当于object.name#使用范例classTestGetAttr(object):test="testattribute"defsay(self):print"testmethod"deftest_getattr():my_test=TestGetAttr()try:printgetattr(my_test,"test")exceptAttributeError:print"AttributeError!"try:getattr(my_test,"say")()exceptAttributeError:#没有该属性,且没有指定返回值的情况下print"MethodError!"if__name__=='__main__':test_getattr()#输出结果testattributetestmethod命令行处理defprocess_command_line(argv):"""Returna2-tuple:(settingsobject,argslist).`argv`isalistofarguments,or`None`for``sys.argv[1:]``."""ifargvisNone:argv=sys.argv[1:]#initializetheparserobject:parser=optparse.OptionParser(formatter=optparse.TitledHelpFormatter(width=78),add_help_option=None)#defineoptionshere:parser.add_option(#customizeddescription;put--helplast'-h','--help',action='help',help='Showthishelpmessageandexit.')settings,args=parser.parse_args(argv)#checknumberofarguments,verifyvalues,etc.:ifargs:parser.error('programtakesnocommand-linearguments;''"%s"ignored.'%(args,))#furtherprocesssettings&argsifnecessaryreturnsettings,argsdefmain(argv=None):settings,args=process_command_line(argv)#applicationcodehere,like:#run(settings,args)return0#successif__name__=='__main__':status=main()sys.exit(status)读写csv文件#从csv中读取文件,基本和传统文件读取类似importcsvwithopen('data.csv','rb')asf:reader=csv.reader(f)forrowinreader:printrow#向csv文件写入importcsvwithopen('data.csv','wb')asf:writer=csv.writer(f)writer.writerow(['name','address','age'])#单行写入data=[('xiaoming','china','10'),('Lily','USA','12')]writer.writerows(data)#多行写入各种时间形式转换只发一张网上的图,然后差文档就好了,这个是记不住的字符串格式化一个非常好用,很多人又不知道的功能>>>name="andrew">>>"mynameis{name}".format(name=name)'mynameisandrew'

⑷ 我为什么说 Python 是大数据全栈式开发语言

就像只要会JavaScript就可以写出完整的Web应用,只要会Python,就可以实现一个完整的大数据处理平台。

云基础设施

这年头,不支持云平台,不支持海量数据,不支持动态伸缩,根本不敢说自己是做大数据的,顶多也就敢跟人说是做商业智能(BI)。

云平台分为私有云和公有云。私有云平台如日中天的 OpenStack

,就是Python写的。曾经的追赶者CloudStack,在刚推出时大肆强调自己是Java写的,比Python有优势。结果,搬石砸脚,2015年
初,CloudStack的发起人Citrix宣布加入OpenStack基金会,CloudStack眼看着就要寿终正寝。

如果嫌麻烦不想自己搭建私有云,用公有云,不论是AWS,GCE,Azure,还是阿里云,青云,在都提供了Python SDK,其中GCE只提供Python和JavaScript的SDK,而青云只提供Python SDK。可见各家云平台对Python的重视。

提到基础设施搭建,不得不提Hadoop,在今天,Hadoop因为其MapRece数据处理速度不够快,已经不再作为大数据处理的首选,但
是HDFS和Yarn——Hadoop的两个组件——倒是越来越受欢迎。Hadoop的开发语言是Java,没有官方提供Python支持,不过有很多第
三方库封装了Hadoop的API接口(pydoop,hadoopy等等)。

Hadoop MapRece的替代者,是号称快上100倍的 Spark ,其开发语言是Scala,但是提供了Scala,Java,Python的开发接口,想要讨好那么多用Python开发的数据科学家,不支持Python,真是说不过去。HDFS的替代品,比如GlusterFS, Ceph 等,都是直接提供Python支持。Yarn的替代者, Mesos 是C++实现,除C++外,提供了Java和Python的支持包。

DevOps

DevOps有个中文名字,叫做 开发自运维 。互联网时代,只有能够快速试验新想法,并在第一时间,安全、可靠的交付业务价值,才能保持竞争力。DevOps推崇的自动化构建/测试/部署,以及系统度量等技术实践,是互联网时代必不可少的。

自动化构建是因应用而易的,如果是Python应用,因为有setuptools, pip, virtualenv, tox,
flake8等工具的存在,自动化构建非常简单。而且,因为几乎所有Linux系统都内置Python解释器,所以用Python做自动化,不需要系统预
安装什么软件

自动化测试方面,基于Python的 Robot Framework 企业级应用最喜欢的自动化测试框架,而且和语言无关。Cucumber也有很多支持者,Python对应的Lettuce可以做到完全一样的事情。 Locust 在自动化性能测试方面也开始受到越来越多的关注。

自动化配置管理工具,老牌的如Chef和Puppet,是Ruby开发,目前仍保持着强劲的势头。不过,新生代 Ansible 和 SaltStack ——均为Python开发——因为较前两者设计更为轻量化,受到越来越多开发这的欢迎,已经开始给前辈们制造了不少的压力。

在系统监控与度量方面,传统的Nagios逐渐没落,新贵如 Sensu 大受好评,云服务形式的New Relic已经成为创业公司的标配,这些都不是直接通过Python实现的,不过Python要接入这些工具,并不困难。

除了上述这些工具,基于Python,提供完整DevOps功能的PaaS平台,如 Cloudify 和 Deis ,虽未成气候,但已经得到大量关注。

网络爬虫

大数据的数据从哪里来?除了部分企业有能力自己产生大量的数据,大部分时候,是需要靠爬虫来抓取互联网数据来做分析。

网络爬虫是Python的传统强势领域,最流行的爬虫框架Scrapy,HTTP工具包urlib2,HTML解析工具beautifulsoup,XML解析器lxml,等等,都是能够独当一面的类库。

不过,网络爬虫并不仅仅是打开网页,解析HTML这么简单。高效的爬虫要能够支持大量灵活的并发操作,常常要能够同时几千甚至上万个网页同时抓取,传统的
线程池方式资源浪费比较大,线程数上千之后系统资源基本上就全浪费在线程调度上了。Python由于能够很好的支持协程( Coroutine )操作,基于此发展起来很多并发库,如Gevent,Eventlet,还有Celery之类的分布式任务框架。被认为是比AMQP更高效的ZeroMQ也是最早就提供了Python版本。有了对高并发的支持,网络爬虫才真正可以达到大数据规模。

抓取下来的数据,需要做分词处理,Python在这方面也不逊色,著名的自然语言处理程序包NLTK,还有专门做中文分词的Jieba,都是做分词的利器。

数据处理

万事俱备,只欠东风。这东风,就是数据处理算法。从统计理论,到数据挖掘,机器学习,再到最近几年提出来的深度学习理论,数据科学正处于百花齐放的时代。数据科学家们都用什么编程?

如果是在理论研究领域,R语言也许是最受数据科学家欢迎的,但是R语言的问题也很明显,因为是统计学家们创建了R语言,所以其语法略显怪异。而且
R语言要想实现大规模分布式系统,还需要很长一段时间的工程之路要走。所以很多公司使用R语言做原型试验,算法确定之后,再翻译成工程语言。

Python也是数据科学家最喜欢的语言之一。和R语言不同,Python本身就是一门工程性语言,数据科学家用Python实现的算法,可以直
接用在产品中,这对于大数据初创公司节省成本是非常有帮助的。正式因为数据科学家对Python和R的热爱,Spark为了讨好数据科学家,对这两种语言
提供了非常好的支持。

Python的数据处理相关类库非常多。高性能的科学计算类库NumPy和SciPy,给其他高级算法打了非常好的基础,matploglib让
Python画图变得像Matlab一样简单。Scikit-learn和Milk实现了很多机器学习算法,基于这两个库实现的 Pylearn2 ,是深度学习领域的重要成员。 Theano 利用GPU加速,实现了高性能数学符号计算和多维矩阵计算。当然,还有 Pandas ,一个在工程领域已经广泛使用的大数据处理类库,其DataFrame的设计借鉴自R语言,后来又启发了Spark项目实现了类似机制。

对了,还有 iPython ,这个工具如此有用,以至于我差点把他当成标准库而忘了介绍。iPython是一个交互式Python运行环境,能够实时看到每一段Python代码的结果。默认情况下,iPython运行在命令行,可以执行 ipython notebook 在网页中运行。用matplotlib绘制的图可以直接嵌入式的显示在iPython Notebook中。

iPython Notebook的笔记本文件可以共享给其他人,这样其他人就可以在自己的环境中重现你的工作成果;如果对方没有运行环境,还可以直接转换成HTML或者PDF。

为什么是Python

正是因为应用开发工程师、运维工程师、数据科学家都喜欢Python,才使得Python成为大数据系统的全栈式开发语言。

对于开发工程师而言,Python的优雅和简洁无疑是最大的吸引力,在Python交互式环境中,执行 import this

,读一读Python之禅,你就明白Python为什么如此吸引人。Python社区一直非常有活力,和NodeJS社区软件包爆炸式增长不
同,Python的软件包增长速度一直比较稳定,同时软件包的质量也相对较高。有很多人诟病Python对于空格的要求过于苛刻,但正是因为这个要求,才
使得Python在做大型项目时比其他语言有优势。OpenStack项目总共超过200万行代码,证明了这一点。

对于运维工程师而言,Python的最大优势在于,几乎所有Linux发行版都内置了Python解释器。Shell虽然功能强大,但毕竟语法不够优雅,写比较复杂的任务会很痛苦。用Python替代Shell,做一些复杂的任务,对运维人员来说,是一次解放。

对于数据科学家而言,Python简单又不失强大。和C/C++相比,不用做很多的底层工作,可以快速进行模型验证;和Java相比,Python语法简
洁,表达能力强,同样的工作只需要1/3代码;和Matlab,Octave相比,Python的工程成熟度更高。不止一个编程大牛表达过,Python
是最适合作为大学计算机科学编程课程使用的语言——MIT的计算机入门课程就是使用的Python——因为Python能够让人学到编程最重要的东西——
如何解决问题。