当前位置: 首页 > 科技观察

收藏,Python开发有哪些高级技巧?

时间:2023-03-19 13:08:56 科技观察

Python开发有哪些进阶技巧?这是知乎上的最后一个问题。我在这里总结了一些常用的技巧。它可能不是很高级,但掌握这些至少可以让你的代码看起来像Pythonic。如果你还在用类C语言的风格来写,你很可能会在codereview中被吐槽。列表理解>>>chars=[cforcin'python']>>>chars['p','y','t','h','o','n']字典理解>>>dict1={'a':1,'b':2,'c':3,'d':4,'e':5}>>>double_dict1={k:v*2for(k,v)indict1。items()}>>double_dict1{'a':2,'b':4,'c':6,'d':8,'e':10}集合推导>>>set1={1,2,3,4}>>>double_set={i*2foriinset1}>>>double_set{8,2,4,6}组合字典>>>x={'a':1,'b':2}>>>y={'c':3,'d':4}>>>z={**x,**y}>>>z{'a':1,'b':2,'c':3,'d':4}复制列表>>>nums=[1,2,3]>>>nums[::][1,2,3]>>>copy_nums=nums[::]>>>copy_nums[1,2,3]反向列表>>>reverse_nums=nums[::-1]>>>reverse_nums[3,2,1]PACKING/UNPACKING变量交换>>>a,b=1,2>>>a,b=b,a>>>a2>>>b1高级解包>>>a,*b=1,2,3>>>a1>>>b[2,3]或>>>>a,*b,c=1,2,3,4,5>>>a1>>>b[2,3,4]>>>c5函数返回多个值(其实是自动打包成元组),然后将解包分配给4个变量>>>deff():...return1,2,3,4...>>>a,b,c,d=f()>>>a1>>>d4列表合并成字符串>>>"".join(["I","Love","Python"])'ILovePython'链比较>>>ifa>2anda<5:...pass...>>>if2>>001122in而不是or>>>ifx==1orx==2orx==3:...pass...>>>ifxin(1,2,3):...传递字典而不是多个ifelsedeffun(x):ifx=='a':return1elifx=='b':return2else:returnNonedeffun(x):return{"a":1,"b":2}.get(x)带下标索引的枚举>>>fori,einenumerate(["a","b","c"]):...print(i,e)...0a1b2c生成器注意区分列表推导,生成器效率更高>>>g=(i**2foriinrange(5))>>>gat0x10881e518>>>>foriing:...print(i)...014916defaultdictdefaultdict>>>d=dict()>>>d['nums']KeyError:'nums'>>>>>>fromcollectionssimportdefaultdict>>>d=defaultdict(list)>>>d["nums"][]stringformatting>>>lang='python'>>>f'{lang}ismostpopularlanguageintheworld''pythonismmostpopularlanguageintheworld'中出现的次数列出大多数元素>>>nums=[1,2,3,3]>>>max(set(nums),key=nums.count)3或fromcollectionsimportCounter>>>Counter(nums).most_common()[0][0]3读写文件>>>withopen("test.txt","w")asf:...f.writelines("hello")判断对象类型,可以指定多种类型>>>isinstance(a,(int,str))True类似于字符串startswith,endswith>>>"http://foofish.net".startswith(('http','https'))True>>>"https://foofish.net".startswith(('http','https'))True__str__和__repr__的区别>>>str(datetime.now())'2018-11-2000:31:54.839605'>>>repr(datetime.now())'datetime.datetime(2018,11,20,0,32,0,579521)'前者对人友好,可读性更强,后者对计算机友好,支持obj==eval(repr(obj))使用装饰器defmakebold(f):returnlambda:""+f()+"</b>"defmakeitalic(f):returnlambda:""+f()+""@makebold@makeitalicdefsay():return"Hello">>>say()Hello没有使用装饰器,可读性很差defsay():return"Hello">>>makebold(makeitalic(say))()Hello