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

22个Python编程技巧,选对了吗?

时间:2023-03-23 01:19:01 科技观察

1。就地交换两个数字Python提供了一种在一行代码中分配和交换(变量值)的直观方法,请参见下面的示例:x,y=10,20print(x,y)x,y=y,xprint(x,y)#1(10,20)#2(20,10)赋值的右侧形成一个新的元组,左侧立即将(未引用的)元组解析(解包)为变量和。分配完成后,新元组将变为未引用状态并标记为垃圾回收,最终完成变量交换。2.链接比较运算符比较运算符的聚合是另一个有时很方便的技巧:n=10result=1n<=9print(result)#False3.使用三个元运算符对于条件赋值三元运算符是if-else语句的简写,即条件运算符:[表达式为真返回值]if[表达式]else[表达式为假返回值]下面是几个例子,大家可以使用使您的代码简洁明了。下面的语句表示“如果y为9,则将x赋值10,否则赋值20”。如有必要,我们还可以扩展此操作链。x=10if(y==9)else20同样,我们可以对类做这样的操作:x=(classAify==1elseclassB)(param1,param2)上面的例子中,classA和classB是两个类,其中一个将调用类构造函数。这是链接多个条件表达式以计算最小值的另一个示例:defsmall(a,b,c):returnaifa<=banda<=celse(bifb<=aandb<=celsec)print(small(1,0,1))print(small(1,2,2))print(small(2,2,3))print(small(5,4,3))#Output#0#1#2#3我们甚至可以在列表推导中使用三元运算符:[m**2ifm>10elsem**4forminrange(50)]#=>[0,1,16,81,256,625,1296,2401,4096,6561,10000,121,144,169,196,225,256,289,324,361,400,441,484,529,576,625,676,729,784,841,900,961,1024,1089,1156,1225,1296,1369,1444,1521,1600,1681,1764,1849,1936,2025,2116,2209,2304,2401]4.多行字符串的基本方式是使用C语言反斜杠:multiStr="select*frommulti_rowwhererow_id<5"print(multiStr)#select*frommulti_rowwhererow_id<5另一个技巧是使用三引号:multiStr="""select*frommulti_rowwhererow_id<5″""print(multiStr)#select*frommulti_row#whererow_id<5上述方法的共同问题是缺乏适当的缩进,如果我们试图缩进,它会在字符串中插入空格。所以最好的解决方案是将字符串拆分成多行并将整个字符串括在括号中:multiStr=("select*frommulti_row""whererow_id<5""orderbyage")print(multiStr)#select*frommulti_rowwhererow_id<5orderbyage5。将列表元素存入新变量我们可以用一个列表来初始化多个变量,在解析一个列表时,变量的个数不能超过列表中元素的个数:【译者注:元素个数和列表长度应该是严格相同,否则会报错]testList=[1,2,3]x,y,z=testListprint(x,y,z)#->1236。打印导入模块的文件路径如果想知道引用代码模块的绝对路径,可以使用如下技巧:importthreadingimportsocketprint(threading)print(socket)#1-#2-7。交互式环境中的“_”运算符这是一个我们大多数人都不知道的有用特性,在Python控制台中,每当我们测试一个表达式或调用一个方法时,结果被赋值给一个临时变量:_(一个下划线).>>>2+13>>>_3>>>print_3“_”是最后执行的表达式的输出。8.字典/集合推导类似于我们使用的列表推导,我们也可以使用字典/集合推导,它们使用起来简单有效,这里是一个例子:testDict={i:i*iforiinxrange(10)}testSet={i*2foriinxrange(10)}print(testSet)print(testDict)#set([0,2,4,6,8,10,12,14,16,18])#{0:0,1:1,2:4,3:9,4:16,5:25,6:36,7:49,8:64,9:81}注意:两个语句之间只有一个<:>区别,并且在Python3中运行上面的代码时,会变成.9.调试脚本我们可以借助该模块在Python脚本中设置断点,示例如下:importpdbpdb.set_trace()我们可以在脚本的任意位置指定并在那里设置断点,非常简单。10.启用文件共享Python允许运行一个HTTP服务器从根路径共享文件,下面是启动服务器的命令:#Python2python-mSimpleHTTPServer#Python3python3-mhttp.server上面的命令将在默认端口上启动一个服务器8000,你自定义的端口号可以作为最后一个参数传递给上面的命令。11.在Python中检查对象我们可以通过调用dir()方法在Python中检查对象,这里有一个简单的例子:test=[1,3,5,7]print(dir(test))['__add__','__class__','__contains__','__delattr__','__delitem__','__delslice__','__doc__','__eq__','__format__','__ge__','__getattribute__','__getitem__','__getslice__','__gt__','__hash__','__iadd__','__imul__','__init__','__iter__','__le__','__len__','__lt__','__mul__','__ne__','__new__','__reduce__','__reduce_ex__','__repr__','__reversed__','__rmul__','__setattr__','__setitem__','__setslice__','__sizeof__','__str__','__subclasshook__’,'append','count','extend','index','insert','pop','remove','reverse','sort']12.为了简化if语句,我们可以使用以下方法来验证多个值:ifmin[1,3,5,7]:而不是:ifm==1orm==3orm==5orm==7:或者,对于inoperator我们也可以使用'{1,3,5,7}'而不是'[1,3,5,7]',因为从集合中取一个元素是一个O(1)操作13.一行代码计算任意数字的阶乘Python2.x.result=(lambdak:reduce(int.__mul__,range(1,k+1),1))(3)print(result)#->6Python3.x。importfunctoolsresult=(lambdak:functools.reduce(int.__mul__,range(1,k+1),1))(3)print(result)#->614。找出列表中出现次数最多的数test=[1,2,3,4,2,2,3,1,4,4,4]print(max(set(test),key=test.count))#->415。重置递归限制Python限制递归次数为1000次,我们可以重新设置这个值:importsysx=1001print(sys.getrecursionlimit())sys.setrecursionlimit(x)print(sys.getrecursionlimit())#1->1000#2->1001请仅在必要时使用上述技术。16.检查对象的内存使用情况。在Python2.7中,一个32位整数占用24个字节,在Python3.5中占用28个字节。要确定内存使用情况,我们可以调用getsizeof方法:在Python2.7中调用importsysx=1print(sys.getsizeof(x))#->24,在Python3.5中调用importsysx=1print(sys.getsizeof(x))#->2817。使用__slots__减少内存开销您是否注意到您的Python应用程序正在使用大量资源,尤其是内存?一个技巧是使用__slots__类变量来减少内存开销。importsysclassFileSystem(object):def__init__(self,files,folders,devices):self.files=filesself.folders=foldersself.devices=devicesprint(sys.getsizeof(FileSystem))classFileSystem1(object):__slots__=['files','folders','devices']def__init__(self,files,folders,devices):self.files=filesself.folders=foldersself.devices=devicesprint(sys.getsizeof(FileSystem1))#InPython3.5#1->1016#2->888很明显,从结果可以看出,内存占用确实有节省,但是只有在类的内存开销大到不必要的时候才应该使用__slots__。仅在分析您的应用程序后使用它,否则您只会使代码难以更改而没有真正的好处。[译者注:以上结果在我的win10python2.7中是:#InPython2.7win10#1->896#2->1016所以,这种比较方式并没有那么令人信服,使用__slots__主要是用来限制属性信息的的对象。另外,当生成的对象很多时,成本可能会更低。详情请参考python官方文档:slots声明采用一系列实例变量,并在每个实例中保留足够的空间来保存每个变量的值。节省空间,因为不是为每个实例创建dict。]18.使用lambda模仿输出方法importsyslprint=lambda*args:sys.stdout.write("".join(map(str,args)))lprint("python","提示",1000,1001)#->pythontips1000100119。从两个相关序列构建字典t1=(1,2,3)t2=(10,20,30)print(dict(zip(t1,t2)))#->{1:10,2:20,3:30}20.一行代码搜索字符串的多个前缀和后缀print("http://www.google.com".startswith(("http://","https://")))print("http://www.google.co.uk".endswith((".com",".co.uk")))#1->True#2->True21。构造一个没有循环的列表importitertoolstest=[[-1,-2],[30,40],[25,35]]print(list(itertools.chain.from_iterable(test)))#->[-1,-2,30,40,25,35]22.用Python实现一个真正的switch-case语句下面的代码使用字典模拟构造一个switch-casedefxswitch(x):返回xswitch._system_dict.get(x,None)xswitch._system_dict={'files':10,'folders':5,'devices':2}print(xswitch('default'))print(xswitch('设备'))#1->无#2->2