⑴ 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能夠讓人學到編程最重要的東西——
如何解決問題。