当前位置: 首页 > 后端技术 > Python

Python实用技巧

时间:2023-03-26 16:41:09 Python

1.就地交换两个数字Python提供了一种直观的方法,可以在一行代码中分配和交换(变量值),请看下面的例子:In[1]:x,y=10,20In[2]:print(x,y)1020In[3]:x,y=y,xIn[4]:print(x,y)2010赋值右边形成新的元素组,左边立即解包(unpacks)将(未加引号的)元组放入变量中。分配完成后,新元组将变为未引用状态并标记为垃圾回收,最终完成变量交换。2.链式比较运算符比较运算符的聚合是另一个有时很方便的技巧:In[5]:n=10In[6]:result=1n<=9In[9]:结果Out[9]:False3。使用三元运算符进行条件赋值三元运算符是if-else语句,也是条件运算表达式的快捷方式:[表达式返回true]if[表达式]else[表达式返回false]下面举几个例子你可以用来让你的代码紧凑简洁。下面的语句表示“如果y为9,则将x赋值10,否则赋值20”。如有必要,我们还可以扩展此操作链。x=10if(y==9)else20同样,我们可以对类做这样的操作:x=(classAify==1elseclassB)(param1,param2)上面的例子中classA和classB是两个类,其中一个类的构造函数将被调用。4、多行字符串的基本方式是使用C语言派生的反斜杠:In[20]:multistr="select*frommulti_row\...:whererow_id<5"In[21]:multistrOut[21]:'select*frommulti_rowwhererow_id<5'另一个技巧是使用三重引号:In[23]:multistr="""select*frommulti_row...:whererow_id<5"""In[24]:multistrOut[24]:'select*frommulti_row\nwhererow_id<5'上述方法的常见问题是缺少适当的缩进,如果我们尝试缩进,则会在字符中插入空格到字符串中。所以最终的解决方案是将字符串拆分成多行并将整个字符串括在括号中:In[25]:multistr=("select*frommulti_row"...:"whererow_id<5"...:"orderbyage")In[26]:multistrOut[26]:'select*frommulti_rowwhererow_id<5orderbyage'5.将列表元素存储到新变量中我们可以使用列表来初始化多个变量,在解析列表时,变量个数不能超过列表的元素个数:【译者注:元素个数和列表长度要严格一致,否则会报错】在[27]中:testlist=[1,2,3]In[28]:x,y,z=testlistIn[29]:print(x,y,z)1236.打印导入模块的文件路径如果想知道绝对路径代码中引用的模块,您可以使用以下技巧:In[30]:importthreadingIn[31]:importsocketIn[32]:print(threading)在[33]中:print(socket)7.交互环境中的“_”运算符是我们大多数人不知道的有用特性,在Python控制台中,每当我们测试一个表达式或调用一个方法时,结果都会被赋值给一个临时变量:_(一个下划线)。In[34]:2+3Out[34]:5In[35]:_Out[35]:5In[36]:print(_)5“_”是最后执行的表达式的输出。8.dictionary/setcomprehension和我们使用的listcomprehension类似,我们也可以使用dictionary/setcomprehension,它们使用起来简单有效,下面是一个例子:In[37]:testDict={i:i*iforiinrange(5)}In[38]:testSet={i*2foriinrange(5)}In[39]:testDictOut[39]:{0:0,1:1,2:4,3:9,4:16}In[40]:testSetOut[40]:{0,2,4,6,8}注意:两个语句之间只有一个<:>区别9.我们可以调试模块中的脚本以在Python脚本中设置断点,这里是一个示例:importpdbpdb.set_trace()我们可以在脚本的任何位置指定并在那里设置断点,非常容易。命令说明breakorb设置断点continueorc继续执行程序到下一个断点列表orl查看当前行step的代码段ors进入函数returnorr执行代码直到返回从当前函数退出或q停止并退出next或n执行下一行clear或cl清除断点p或pp打印变量的值cl清除断点help10.启用文件共享运行一个HTTP服务器从根路径共享文件,下面是启动服务器的命令:(python3环境)上面的命令python3-mhttp.server会在默认端口8000上打开一个服务器,你可以通过自定义上述命令的端口号作为最后一个参数。11.在Python中检查对象我们可以通过调用dir()方法在Python中检查对象,这里有一个简单的例子:In[41]:test=[1,3,5,7]In[42]:print(dir(测试))['__add__','__class__','__contains__','__delattr__','__delitem__','__dir__','__doc__','__eq__','__format__','__ge__','__getattribute__','__getitem__','__gt__','__hash__','__iadd__','__imul__','__init__','__iter__','__le__','__len__','__lt__','__mul__','__ne__','__new__','__reduce__','__reduce_ex__','__repr__','__reversed__','__rmul__','__setattr__','__setitem__','__sizeof__','__str__','__subclasshook__','append','clear','copy','count','extend','index','insert','pop','remove','reverse','sort']将列出对象的属性方法。12.简化if语句我们可以用下面的方法来验证多个值:ifmin[1,3,5,7]:而不是ifm==1orm==3orm==5orm==7:或者,我们也可以使用'{1,3,5,7}'而不是'[1,3,5,7]'作为in运算符,因为从集合中获取元素的复杂度为O(1)手术。13、运行时检测Python版本当运行的Python版本低于支持的版本时,有时我们可能不想运行我们的程序。为此,您可以使用以下代码片段,它还以人类可读的方式输出当前Python版本:importsys#DetectthePythonversioncurrentlyinuse.ifnothasattr(sys,"hexversion")orsys.hexversion!=50660080:print("抱歉,您没有在Python3.5n上运行")print("请升级到3.5.n")sys.exit(1)#以可读格式打印Python版本。print("CurrentPythonversion:",sys.version)或者您可以将上面代码中的sys.hexversion!=50660080替换为sys.version_info>=(3,5),这是一位读者的建议。Python3运行结果:Python3.5.1(default,Dec2015,13:05:11)[GCC4.8.2]onlinux当前Python版本:3.5.2(default,Aug22,21:11:05)[GCC5.3.0]14.合并多个字符串如果你想连接列表中的所有标记,例如下面的例子:In[44]:test=['I','Like','Python','automation']In[45]:''.join(test)Out[45]:'ILikePythonautomation'15.翻转字符串/列表的四种方法翻转列表本身In[49]:testList=[1,3,5]In[50]:testList.reverse()In[51]:testListOut[51]:[5,3,1]在循环中翻转和迭代输出In[52]:forelementinreversed([1,3,5]):...:print(element)...:531一行代码翻转字符串In[53]:"TestPython"[::-1]Out[53]:'nohtyPtseT'usingasliceto翻转列表[1,3,5][::-1]17。在python中使用枚举,我们可以按以下方式定义枚举:In[56]:classShapes:...:Circle,Square,Triangle,Quadrangle=range(4)...:In[57]:Shapes.CircleOut[57]:0In[58]:形状。SquareOut[58]:1In[59]:形状。TriangleOut[59]:2In[60]:Shapes.QuadrangleOut[60]:318.许多编程语言不支持从一个方法返回多个值,但是Python中的方法确实(可以)返回多个值,参见下面的示例看看这是如何工作的:在[61]中:defx():...:return1,2,3,4...:在[62]中:a,b,c,d=x()在[63]中:print(a,b,c,d)123419。从两个相关序列构建字典In[92]:t1=(1,2,3)In[93]:t2=(10,20,30)In[94]:dict(zip(t1,t2))Out[94]:{1:10,2:20,3:30}20.将字典拆分为键和值列表c={'Bob':'male','Jack':'male','Mary':'female','Tom':'male'}keys1=list(c.keys())#['Bob','Jack','Tom','Mary']values1=list(c.values())#['男','男','男','女']21.一行代码计算任意数的阶乘python3环境:In[75]:importfunctoolsIn[76]:result=(lambdak:functools.reduce(int.__mul__,range(1,k+1),1))(3)In[77]:resultOut[77]:622.找到列表中出现频率最高的数In[82]:test=[1,2,3,4,2,2,3,1,4,4,4]In[83]:print(max(set(test),key=test.count))423.重置递归限制Python限制递归次数为1000次,我们可以重新设置这个值:importsysx=1001print(sys.getrecursionlimit())sys.setrecursionlimit(x)print(sys.getrecursionlimit())#1->1000#2->100仔细修改24.检查一个对象的内存使用情况在Python2.7中,一个32-位整数占用24个字节,在Python3.5中使用28个字节判断内存使用情况,我们可以调用getsizeof方法:python2.7:importsysx=1print(sys.getsizeof(x))#->24python3:In[86]:importsysIn[87]:x=1In[88]:sys.getsizeof(x)Out[88]:2825.使用槽来减少内存开销你有没有注意到你的Python应用程序消耗了大量的资源,尤其是内存?一个技巧是使用槽类变量来减少内存开销。importsysclassFileSystem(object):def__init__(self,files,folders,devices):self.files=filesself.folders=foldersself.devices=devicesprint(sys.getsizeof(FileSystem))类FileSystem1(object):__slots__=['文件','文件夹','设备']def__init__(self,files,folders,devices):self.files=filesself.folders=foldersself.devices=devicesprint(sys.getsizeof(FileSystem1))#在Python3.5#1->1016#2->888显然,从结果可以看出内存使用确实有节省,但是只有在类的内存开销过大时才应该使用槽。仅在分析您的应用程序后使用它,否则您只会使代码难以更改而没有真正的好处。26、使用lambda模拟输出方式In[89]:importsysIn[90]:lprint=lambda*args:sys.stdout.write("".join(map(str,args)))In[91]:lprint("python","tips",1000,1001)输出[91]:pythontips100010011827。使用字典来存储选择操作我们可以构造一个字典来存储表达式:In[70]:stdacl={...:'sum':lambdax,y:x+y,...:'subtract':lambdax,y:x-y...:}In[73]:stdacl['sum'](9,3)Out[73]:12In[74]:stdacl['subtract'](9,3)Out[74]:628一行代码搜索字符串In[95]的多个前缀和后缀:print("http://www.google.com".startswith(("http://","https://")))TrueIn[96]:print("http://www.google.co.uk".endswith((".com",".co.uk")))True29。构造一个没有循环的列表In[101]:test=[[-1,-2],[30,40],[25,35]]In[102]:importitertoolsIn[103]:print(list(itertools.chain.from_iterable(test)))[-1,-2,30,40,25,35]30.实现一个真正的switch-case语句下面的代码使用字典来模拟switch-case的构造。在[104]中:defxswitch(x):...:returnxswitch._system_dict.get(x,None)...:在[105]中:xswitch._system_dict={'files':10,'folders':5、'devices':2}In[106]:print(xswitch('default'))NoneIn[107]:print(xswitch('devices'))231.计数时使用Counter来计数对象这听起来很明显,但经常忘记。计数对于大多数程序员来说是一项非常常见的任务,并且在大多数情况下不是很有挑战性-这里有一些方法可以更轻松地完成这项任务。Python的collections库有一个内置的dict类的子类,它被设计用来做这样的事情:>>>fromcollectionsimportCounter>>>c=Counter(helloworld)>>>cCounter({l:3,o:2,:1,e:1,d:1,h:1,r:1,w:1})>>>c.most_common(2)[(l,3),(o,2)]32.漂亮地打印出JSONJSONJSON是一种非常好的数据序列化形式,如今被各种API和web服务广泛使用。使用python内置的json处理,可以让json字符串具有一定的可读性,但是遇到大数据时,就表现为一长条连续的线,人眼很难看清。为了让JSON数据更加友好,我们可以使用缩进参数来输出漂亮的JSON。这在交互式编程或登录控制台时特别有用:>>>importjson>>>print(json.dumps(data))#Noindention{"status":"OK","count":2,"results“:[{“年龄”:27,“姓名”:“奥兹”,“乳糖不耐受”:真},{“年龄”:29,“姓名”:“乔”,“乳糖不耐受”:假}]}>>>print(json.dumps(data,indent=2))#缩进{"status":"OK","count":2,"results":[{"age":27,"name":"Oz","lactose_intolerant":true},{"age":29,"name":"Joe","lactose_intolerant":false}]}

最新推荐
猜你喜欢