Python内部培训Python简介快速、高效的开发语言胶水语言生态链完善广泛用于科学计算、数据挖掘等领域本讲义约定使用Python2.x版本3.x版本由于库没有跟上,暂时不推荐使用语法特色动态语言特性—可在运行时改变对象本身(属性和方法等)基于C/C++和JAVA,但有很大区别缩进方式,建议使用空格,不要用TAB多个语句在一行使用;分隔注释符是#,多行使用docstring(’’’…’’’)变量无需类型定义可进行函数式编程FPPython3.x的变迁编程规范PEP8编码规范GooglePython编码规范GooglePythonPEP8编码规范开发环境PyCharm(支持PEP8语法规范、跨平台、远程调试、上传…)IPythonVIM–主要在linux下使用其它编辑器UE,notepad++,editplus…工欲善其,事必先利其器开发环境PyCharm调试Ctrl+Alt+S--属性配置Ctrl+Shift+Alt+L--格式化文件PPE8Ctrl+B--查看对象Ctrl+L--查找Ctrl+N--切换类Ctrl+Shift+N--切换文件Shift+F9/F10--Debug/Run单击行--设置断点工欲善其,事必先利其器PDB调试Python–mpdbxxx.pyb--设置断点(行,函数名)s--stepovern--nextc--continuer--runL--显示代码Exit()工欲善其,事必先利其器字符编码Python2.x默认的是OS的本地编码Python3.x是unicode内部编码.py文件第一行:#coding=utf-8,不指定编码时,文件中包含非ASCII字符会报错s1=中文1s2=u中文2printunicode(s1,'utf-8').encode('gbk')prints2.encode('gbk')printtype(unicode(s1,'utf-8')),type(s2),type(s2.encode('gbk'))Helloworld表达式2+33+(7*4)3**5‘Hello’+‘World’变量赋值a=43b=a*4.5c=(a+b)/2.5a=“HelloWorld”x,y=4+2,”python”pass语句–不做任何事时使用ifab:passelse:c=aNonePython特有的空值表示与C/C++中的NULL是不同的函数没有明确返回的话,默认返回是None不能与其它类型进行运算字符串stringstr[::],str[0],str[1:2],str[-1:]find/index()#没有找到子串,前者不会扔出异常replace(),split(),strip()“sub”in“str”#是否存在子串join()lst=[‘1’,’2’,’abc’,’4’,’5’]‘,’.join(lst)‘1,2,abc,4,5’列表list赋值a=[2,3,4]#Alistofintegerb=[2,7,3.5,“Hello”]c=[]d=[2,[a,b]]#嵌套列表e=a+b#Jointwolists操作x=a[1]#Get2ndelement(0isfirst)y=b[1:3]#Returnasub-listz=d[1][0][2]#Nestedlistsb[0]=42#Changeanelementprintsum(a)#=9x=a.pop(0)#pop第一个数据tuple赋值f=(2,3,4,5)#Atupleofintegersg=(,)#Anemptytupleh=(2,[3,4],(10,11,12))#Atuplecontainingmixedobjects操作x=f[1]#Elementaccess.x=3y=f[1:3]#Slices.y=(3,4)z=h[1][1]#Nesting.z=4特色与list类似,最大的不同tuple是一种只读且不可变更的数据结构不可取代tuple中的任意一个元素,因为它是只读不可变更的,也不能进行像list一样的加法操作字典dict赋值a={}#Anemptydictionaryb={’x’:3,’y’:4}#有点类似json格式c={’uid’:105,’login’:’beazley’,’name’:’DavidBeazley’}操作u=c[’uid’]#Getanelementc[’shell’]=/bin/sh#Setanelementdict2=dict2.update(dict1)#使用dict1中的数据去更新dict2ifc.has_key(directory):#Checkforpresenceofanmemberd=c[’directory’]else:d=Noned=c.get(“directory”,None)#带默认值的方式集合setset([“hello”,“world”,“of”,“words”,“of”,“world”])set(['world','hello','words','of'])如何删除重复数据Ls1=[1,3,5,3,7,4,5]Ls2=list(set(Ls1))可以使用&、|求两个set的交集、并集、补集、全集s1=set([1,2,3])s2=set([2,4])s1&s2#{2}s1|s2#{1,2,3,4}s1-s2#{1,3}s1^s2#{1,3,4}Helloworldif…elif…else语句:没有switch,有更高级的变通方式(dict字典方式)ifa==‘+’:b=‘+’elifa==‘-’:b=‘-’else:b=None布尔表达式–and,or,notifb=aandb=c:print‘boolisTrue’ifnot(baorcc):print‘notexpr,valueisTrue’循环While..else语句whileab:a=a+1else:print‘a=’,aFor语句(遍历序列的元素)foritemin[3,4,10,25]:printitemelse:print‘final’#PrintcharactersoneatatimeforcinHelloWorld:printc#Loopoverarangeofnumbersforiinxrange(0,100,2):printiforiinxrange(len(list1)):printlist1[i]死循环怎么办?桌面应用可以马上知道,并杀死对应进程服务器应用怎么去监控?计数器:在循环的最里面计数,超过指定数值就退出,缺点太多了让函数带有超时功能函数def语句deffunc1(a,b):#没有指针,函数内的数据只能通过返回‘’’funcspec’’’q=a/br=a-q*breturnr#调用方式a=func1(42,5)#a=2返回多个值deffunc2(a,b):q=a/br=a-q*breturnq,rx,y=func2(42,5)#x=8,y=2类classclass语句classAccount(object):#只在__init__中定义成员变量def__init__(self,initial):‘’’InitialClass‘’’self.balance=initial#析构def__del__(self)pass#字符串def__str__(self)desc=‘Account’returndesc使用定义好的classa=Account(1000.0)a.deposit(550.23)a.deposit(100)a.withdraw(50)printa.getBalance()模块程序可分成好几个模块:一个py文件就是一个模块;目录下面增加__init__.py也是#numbers.pydefdivide(a,b):q=a/br=a-q*breturnq,rdefgcd(x,y):g=ywhilex0:g=xx=y%xy=greturngimport语句importnumbersx,y=numbers.divide(42,5)n=numbers.gcd(7291823,5683)__import__()动态载入模块一个模块只载入一次实例会继承新加载的模块异常处理try语句try:f=open(“foo“,”r”)exceptIOError:printCouldn’topen’foo’.Sorry.“FinallyBaseException,e:logging.exception(e)raise语句deffactorial(n):ifn0:raiseValueError,Expectednon-negativenumberif(n=1):return1else:returnn*factorial(n-1)沒有处理的异常factorial(-1)Traceback(innermostlast):Filestdin,line1,in?Filestdin,line3,infactorialValueError:Expectednon-negativenumber文件操作open()函数f=open(foo,w)#Openafileforwritingg=open(bar,r)#Openafileforreading文件的读取/写入f.write(HelloWorld)buff=g.read()#Readalldataline=g.readline()#Readasinglelinelines=g.readlines()#Readdataasalistoflines异常处理try:f=open(“foo”,”w”)exception:XXX文件操作With语句Withopen(‘foo’)asfile:data=file.read()大文件—yield指针?引用?Python里面没有指针所有都是对象对象之间都是引用(引用计数方式)常用的对象都有cache默认是浅拷贝,深拷贝代码importcopyls1=[1,”test”,(3.4,7),{“key”:1,“comment”:”yourcomment”}]ls2=copy.deepcopy(ls1)正则表达式导入模块:importrep=re.compile(r'ab*',re.IGNORECASE)p=re.compile('[a-z]+')map/reduce云计算的核心算法Map是将一个大任务拆分为很多个小任务Reduce则将每个小任务的计算结果进行收集和汇总Filter过滤Python并行多线程Python并行多线程(map)Python并行多进程同步模式(apply_async)异步模式(apply)Python并行多进程(map)Map为异步模式单元测试unittest模块中的TestCase类代表测试用例性能优化Python的开发效率很高Python的执行效率很低,比C++和JAVA都慢循环/函数调用等很消耗资源数据结构的性能很高,目前可以认为是优化到极致优化方式:用timeit分析之后优化对应代码NUMPY与IO优化使用C模块来替换业务热点部分地方可以使用map来替代for…in…循环性能优化优化实例未优化版本:17.93秒CTYPE优化版本:0.29秒Numpy+IO优化版本:0.74秒Python程序基础框架Python程序基础框架主函数Python程序基础框架模块公共服务:PYTHONPATH__init__()做初使化测试全覆盖Python哲学优美胜过丑陋明确胜过含蓄简单胜过复杂复杂胜过难懂扁平胜过嵌套稀疏胜过密集