基本语法1。简单控制语句 字符串推荐用单引号引用list:List〔int〕〔1,2,3〕foreleminlist:ifelem1:print(fdata{elem}1)这里是format语句,属于语法糖else:print(fdata{elem}1)data11data21data312。异常x1try:ifx0:raiseException(Sorry,nonumbersbelowzero)exceptExceptionaserr:print(finderr:serr)finderr:Sorry,nonumbersbelowzero3。推导式(比较晦涩难懂)参考:https:www。cnblogs。comdesireyangp12160332。html 推导式好处:效率更高,底层是c执行1。列表推导式 一共两种形式:(参考:https:zhuanlan。zhihu。comp139621170),它主要是输出是列表(list)〔xforxindataifcondition〕这里的含义是data只有满足if条件中的情况才保留(if)〔exp1ifconditionelseexp2forxindata〕,这里的含义是data满足if条件时执行exp1否则exp2(ifelse)importre获取所有的数字list〔1,2,3,4,5,a,b,c〕print(〔elemforeleminlistifre。match(d,elem)〕)〔1,2,3,4,5〕获取所有的字母print(〔elemforeleminlistifre。match(〔az〕,elem)〕)〔a,b,c〕如果元素是数字则存储,否则则upperprint(〔elemifre。match(d,elem)elseelem。upper()foreleminlist〕)〔1,2,3,4,5,A,B,C〕 最佳实践:参考(https:github。comhttpiehttpieblobmasterhttpiecore。pyL235)defdecoderawargs(args:List〔Union〔str,bytes〕〕,stdinencoding:str)List〔str〕:Convertallbytesargstostrbydecodingthemusingstdinencoding。return〔arg。decode(stdinencoding)iftype(arg)isbyteselseargforarginargs〕defdecoderawargsparse(args:List〔Union〔str,bytes〕〕,stdinencoding:str)List〔str〕:Convertallbytesargstostrbydecodingthemusingstdinencoding。不使用推导式result:List〔str〕〔〕forarginargs:iftype(arg)isbytes:result。append(arg。decode(stdinencoding))else:result。append(arg)returnresultarg。decode(stdinencoding)iftype(arg)isbyteselseargforarginargsprint(decoderawargs(args〔b111,b222〕,stdinencodingutf8))print(decoderawargs(args〔111,222〕,stdinencoding))〔111,222〕〔111,222〕print(decoderawargsparse(args〔b111,b222〕,stdinencodingutf8))print(decoderawargsparse(args〔111,222〕,stdinencoding))〔111,222〕〔111,222〕2。字典推导式 {keyexpr:valueexprforvalueincollectionifcondition},输出是dict{keyexpr:valueexprforvalueincollectionifcondition}反转keyvalue,且获取value为在set{a,b,c}中的元素dictold{a:A,b:B,c:C,d:D}print({dictold〔value〕:valueforvalueindictoldifvaluein{a,b,c}}){A:a,B:b,C:c}print({key:valueforvalue,keyindictold。items()ifvaluein{a,b,c}}){A:a,B:b,C:c}3。集合推导式 表达式:{exprforvalueincollectionifcondition}{exp1ifconditionelseexp2forxindata}输出是set 其实就是上面列表推导式〔〕换成{},输出由list变成了set4。for循环迭代器importosfromcollections。abcimportIterablewithopen(text。log,wt)asfile:file。truncate()file。writelines(line1os。linesep)file。writelines(line2os。linesep)file。writelines(line3os。linesep)passwithopen(text。log,rt)asfile:forlineinfile:print(type:{type},isinstance:{isinstance},line:{line}。format(typetype(file),isinstanceisinstance(file,Iterable),lineline))passtype:classio。TextIOWrapper,isinstance:True,line:line1type:classio。TextIOWrapper,isinstance:True,line:line2type:classio。TextIOWrapper,isinstance:True,line:line3 这里面io。TextIOWrapper实现了next()方法 比如我们自己实现一个可迭代的对象下面可以看到我使用了类型申明List〔str〕其实这个python运行时并不会检测,需要工具进行检测! 变量默认都是Any类型,具体可以看https:docs。python。orgzhcn3librarytyping。htmlfromtypingimportListclassItems(object):definit(self,list:List〔str〕):self。listlistself。index0defnext(self,args,kwargs):next,没有抛出StopIterationifself。indexlen(self。list):raiseStopIterationresultself。list〔self。index〕self。indexself。index1returnresultdefiter(self,args,kwargs):返回一个迭代器returnselfdataItems(〔1,2,3〕)forxindata:print(x)1235。包管理from。。aimportfoo上级目录from。aimportfooa当前目录importsys引用源码或者libfromcopyimportdeepcopy引用源码或者libfrompygments。formatters。terminalimportTerminalFormatter引用lib。lib。fileimportdemo。utils。adefcfoo():demo。utils。a。fooa()TerminalFormatter()deepcopy()print(sys。apiversion)defbfoo():foo()基本数据类型1。定义方式mylist:list〔str〕〔apple,banana,cherry〕mylist〔apple,banana,cherry〕 TextType: str NumericTypes: int,float,complex SequenceTypes: list,tuple,range MappingType: dict SetTypes: set,frozenset BooleanType: bool BinaryTypes: bytes,bytearray,memoryview2。数字基本类型x1inty1。1floatz1j复数(complex)acomplex(1,2)复数(complex)print(type(x))print(type(y))print(type(z))print(z。imag,z。real)print(type(a))print(a。imag,a。real)classintclassfloatclasscomplex1。00。0classcomplex2。01。03。字符串strhelloprint(str)print(str〔0:〕)print(str〔:5〕)print(str〔:1〕)print(str〔0:5〕)print(str〔0:5:1〕)print(str〔0:5:2〕)hellohellohellohellhellohellohloformatprint(Mynameis{}andageis{}。format(tom,18))Mynameistomandageis18quantity3itemno567price49。95myorderIwanttopay{2}dollarsfor{0}piecesofitem{1}。print(myorder。format(quantity,itemno,price))Iwanttopay49。95dollarsfor3piecesofitem567。funcstrhelloworld!print(str。upper())print(str。lower())print(str。strip())print(str。。。)HELLOWORLD!helloworld!helloworld!helloworld!。。。formatmyorderIhavea{carname},itisa{model}。print(myorder。format(carnameFord,modelMustang))IhaveaFord,itisaMustang。4。lambda 其实就是一个funcdefadd(num):returnlambdax:xnumprint(add(10)(10))20 lanbda例子2importjsonclassObj:definit(self):self。nametomself。age1print(json。dumps(Obj(),defaultlambdaobj:obj。dict)){name:tom,age:1}集合 list,tuple,range,dict,set,frozensetlist,例如:mylist〔apple,banana,cherry〕tuple是特殊的数组,就是不能改变,例如mytuple(apple,banana,cherry)range可以理解是个迭代器,例如:dict就是个map,例如:thisdict{brand:Ford,model:Mustang,year:1964}set就是个去重复的list,例如:myset{apple,banana,cherry}1。listmylist〔apple,banana,cherry〕切片print(mylist〔0〕)print(mylist〔2〕)print(mylist〔1〕)print(mylist〔0:3:2〕)applecherrycherry〔apple,cherry〕基本操作mylist。append(orange)print(mylist)〔apple,banana,cherry,orange〕mylist。insert(0,mango)print(mylist)〔mango,apple,banana,cherry,orange〕循环forxinmylist:print(x)applebananacherryorangeforindexinrange(len(mylist)):print(index:dindex)index:0index:1index:2index:3index:4ifappleinmylist:print(success!)success!〔执行表达式(也就是for循环中的,如果有if则是if中执行的),foriteminlist条件表达式〕newlist〔elem。upper()foreleminmylistifainelem〕containsacharelemstrprint(newlist)〔MANGO,APPLE,BANANA,ORANGE〕newList〔〕foreleminmylist:ifainelem:newList。append(elem。upper())print(newList)〔MANGO,APPLE,BANANA,ORANGE〕2。mapthisdict{brand:Ford,model:Mustang,year:1964}forkey,valueinthisdict。items():print(key:{},value:{}。format(key,value))key:brand,value:Fordkey:model,value:Mustangkey:year,value:1964forkeyinthisdict:print(key:{},value:{}。format(key,thisdict〔key〕))key:brand,value:Fordkey:model,value:Mustangkey:year,value:19643。rangerange会生成一个迭代器,(start,end,sep),左闭右开forxinrange(6):〔0,1,2,3,4,5〕print(xisdx)xis0xis1xis2xis3xis4xis5forxinrange(2,6):print(xisdx)xis2xis3xis4xis5forxinrange(1,6,2):print(xisdx)xis1xis3xis5方法1。定义一个空方法deffunc1():pass空方法必须申明passfunc1()2。参数name为必须添的参数,不然为空会报错age为默认参数agrs为可变参数kwargs为kv参数deffunc1(name,age1,args,kwargs):print(name:sname)print(age:dage)print(len(args):{},type:{}。format(len(args),type(args)))forvalueinargs:print(argsvalue:{}。format(value))print(len(kwargs):{},type:{}。format(len(kwargs),type(kwargs)))forkey,valueinkwargs。items():print(kwargskey:{},value:{}。format(key,value))func1(nametom,age10,args1,kwargs2)name:tomage:10len(args):0len(kwargs):0,type:classtuplelen(kwargs):2,type:classdictkwargskey:args,value:1kwargskey:kwargs,value:2这里注意由于dict所以不能申明kvfunc1(tom,10,1,2,args1,kwargs2)name:tomage:10len(args):2,type:classtupleargsvalue:1argsvalue:2len(kwargs):2,type:classdictkwargskey:args,value:1kwargskey:kwargs,value:23。类型 申明输入输出类型fromtypingimportList,Uniondefdecoderawargs(args:List〔Union〔str,bytes〕〕,stdinencoding:str)List〔str〕:Convertallbytesargstostrbydecodingthemusingstdinencoding。return〔arg。decode(stdinencoding)iftype(arg)isbyteselseargforarginargs〕类1。定义类和方法如果没有父类继承,这里选择object,比较规范classPerson(object):gendernone,maleorfemalegendernone构造器definit(self,name,age):self。namenameself。ageagedefmyname(self):returnself。namepPerson(nametome,age1)print(p。myname())2。类型的继承importjsonclassPerson(object):gendernone,maleorfemalegendernone构造器definit(self,name,age):self。namenameself。ageagedefmyname(self):returnself。namepPerson(nametome,age1)print(p。myname())classMail(Person):definit(self,name,age):super(Mail,self)。init(name,age)self。gendermaildefmyname(self):returnself。namemailpMail(nametome,age1)print(json。dumps(p,defaultlambdaobj:obj。dict))print(p。myname())3。类new函数 主要是init执行前会调用!usrbinpythonimportjsonclassPerson(object):defnew(cls,args,kwargs):instanceobject。new(cls)instance。jobitreturninstanceconstructdefinit(self,name,age):self。namenameself。ageagedeftojson(self):returnjson。dumps(self,defaultlambdaobj:obj。dict)pPerson(nametome,age1)print(p。tojson()){age:1,job:it,name:tome}其他用法技巧1。断言iftype(1)isint:print(argsisint)。。。等效passargsisint2。测试 可以参考文件:https:segmentfault。comq1010000010389542,属于doctestdefhumanizebytes(n,precision2):Author:DougLatornellLicence:MITURL:https:code。activestate。comrecipes577081Returnahumanizedstringrepresentationofanumberofbytes。humanizebytes(1)1Bhumanizebytes(1024,precision1)1。0kBhumanizebytes(1024123,precision1)123。0kBhumanizebytes(102412342,precision1)12。1MBhumanizebytes(102412342,precision2)12。05MBhumanizebytes(10241234,precision2)1。21MBhumanizebytes(102412341111,precision2)1。31GBhumanizebytes(102412341111,precision1)1。3GBabbrevs〔(150,PB),(140,TB),(130,GB),(120,MB),(110,kB),(1,B)〕ifn1:return1Bforfactor,suffixinabbrevs:ifnfactor:breaknoinspectionPyUnboundLocalVariablereturnf{nfactor:。{precision}f}{suffix}3。yield参考:https:zhuanlan。zhihu。comp268605982 其实类似于程序的断电,比如程序运行到那里其实是返回一个生成器,然后当你下一步是才会执行,比较节省内存fromtypingimportListdefnew(size:int10241024):yieldnewdata(size)defnewdata(size:int)List〔int〕:return〔0〕sizedatanew()print(type(data))print(len(next(data)))只能执行一次next不然报错classgenerator1048576脚本base64输出echoaGVsbG8gcHl0aG9uCgpythoncimportsys,base64;print(sys。stdin。read())echoaGVsbG8gcHl0aG9uCgpythoncimportsys,base64;print(base64。b64decode(sys。stdin。read()))stdout:bhellopython文件操作r,w,x,a四种类型(a:append,wtruncatecreate,xtruncatecreateifnotexit)b,t文件类型 第一列可以和第二列文件类型组合,第一列不允许并存importoswithopen(file。log,w)asfile:forxinrange(0,100):file。write(helloworldos。linesep)withopen(file。log,r)asfile:forlineinfile。readlines():print(line)jsonimportjsonprint(json。dumps({k1:v1,k2:〔1,2,3〕}))print(json。loads({k1:v1,k2:〔1,2,3〕})) 如果是class,需要继承JSONEncoder和JSONDecoder实现子类,或者importjson,datetimeclassDemo(object):definit(self,name:str,age:int,birthday:datetime。date):self。namenameself。agwageself。birthdaybirthdaydeftojson(self,):return{name:self。name,age:self。agw,birthday:self。birthday。strftime(Ymd)}dataDemo(tom,18,datetime。date(2001,1,1))print(json。dumps(data,defaultdata。tojson))typing(申明类型) 官方文档:https:docs。python。orgzhcn3librarytyping。html 可以参考这篇文章:https:sikasjc。github。io20180714typehintinpython 对于喜欢静态类型的语言,我觉得是非常nice的fromtypingimportDict,Listdeftest(data:Dict〔str,str〕)List〔str〕:return〔xforxindata〕print(test({k1:v1,k2:v2}))