位置:珠海达内IT教育培训学校 > 学校动态 > Python的22个编程技巧
Python的22个编程技巧
来源:珠海达内IT教育培训学校时间:2021/6/11 11:20:40
1.原地交换两个数字
Python提供了一个直观的在一行代码中赋值与交换(变量值)的方法,请参见下面的示例:
x,y=10,20
print(x,y)
x,y=y,x
print(x,y)
#1(10,20)
#2(20,10)
赋值的右侧形成了一个新的元组,左侧立即解析(unpack)那个(未被引用的)元组到变量和<b>。
一旦赋值完成,新的元组变成了未被引用状态并且被标记为可被垃圾回收,较终也完成了变量的交换。
2.链状比较操作符
比较操作符的聚合是另一个有时很方便的技巧:
n=10
result=1<n<20
print(result)
#True
result=1>n<=9
print(result)
#False
3.使用三元操作符来进行条件赋值
三元操作符是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_row
whererow_id<5”
print(multiStr)
#select*frommulti_rowwhererow_id<5
另一个技巧是使用三引号:
multiStr=“””select*frommulti_row
whererow_id<5″””
print(multiStr)
#select*frommulti_row
#whererow_id<5
上面方法共有的问题是缺少合适的缩进,如果我们尝试缩进会在字符串中插入空格。所以较后的解决方案是将字符串分为多行并且将整个字符串包含在括号中:
multiStr=(“select*frommulti_row”
“whererow_id<5”
“orderbyage”)
print(multiStr)
#select*frommulti_rowwhererow_id<5orderbyage
5.存储列表元素到新的变量中
我们可以使用列表来初始化多个变量,在解析列表时,变量的数目不应该超过列表中的元素个数:【译者注:元素个数与列表长度应该严格相同,不然会报错】
testList=[1,2,3]
x,y,z=testList
print(x,y,z)
#->123
6.打印引入模块的文件路径
如果你想知道引用到代码中模块的路径,可以使用下面的技巧:
importthreading
importsocket
print(threading)
print(socket)
#1-<module‘threading’from‘/usr/lib/python2.7/threading.py’>
#2-<module‘socket’from‘/usr/lib/python2.7/socket.py’>
7.交互环境下的“_”操作符
这是一个我们大多数人不知道的有用特性,在Python控制台,不论何时我们测试一个表达式或者调用一个方法,结果都会分配给一个临时变量:_(一个下划线)。
>>>2+1
3
>>>_
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中运行上述代码时,将<xrange>改为<range>。
9.调试脚本
我们可以在<pdb>模块的帮助下在Python脚本中设置断点,下面是一个例子:
importpdb
pdb.set_trace()
我们可以在脚本中任何位置指定<pdb.set_trace()>并且在那里设置一个断点,相当简便。
10.开启文件分享
Python允许运行一个HTTP服务器来从根路径共享文件,下面是开启服务器的命令:
#Python2
python-mSimpleHTTPServer
#Python3
python3-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:
或者,对于in操作符我们也可以使用‘{1,3,5,7}’而不是‘[1,3,5,7]’,因为set中取元素是O(1)操作。
13.一行代码计算任何数的阶乘
Python2.x.
result=(lambdak:reduce(int.__mul__,range(1,k+1),1))(3)
print(result)
#->6
Python3.x.
importfunctools
result=(lambdak:functools.reduce(int.__mul__,range(1,k+1),1))(3)
print(result)
#->6
14.找到列表中出现较频繁的数
test=[1,2,3,4,2,2,3,1,4,4,4]
print(max(set(test),key=test.count))
#->4
15.重置递归限制
Python限制递归次数到1000,我们可以重置这个值:
importsys
x=1001
print(sys.getrecursionlimit())
sys.setrecursionlimit(x)
print(sys.getrecursionlimit())
#1->1000
#2->1001
请只在必要的时候采用上面的技巧。
16.检查一个对象的内存使用
在Python2.7中,一个32比特的整数占用24字节,在Python3.5中利用28字节。为确定内存使用,我们可以调用getsizeof方法:
在Python2.7中
importsys
x=1
print(sys.getsizeof(x))
#->24
在Python3.5中
importsys
x=1
print(sys.getsizeof(x))
#->28
17.使用__slots__来减少内存开支
你是否注意到你的Python应用占用许多资源特别是内存?有一个技巧是使用__slots__类变量来在一定程度上减少内存开支。
importsys
classFileSystem(object):
def__init__(self,files,folders,devices):
self.files=files
self.folders=folders
self.devices=devices
print(sys.getsizeof(FileSystem))
classFileSystem1(object):
__slots__=[‘files’,’folders’,’devices’]
def__init__(self,files,folders,devices):
self.files=files
self.folders=folders
self.devices=devices
print(sys.getsizeof(FileSystem1))
#InPython3.5
#1->1016
#2->888
很明显,你可以从结果中看到确实有内存使用上的节省,但是你只应该在一个类的内存开销不必要得大时才使用__slots__。只在对应用进行性能分析后才使用它,不然地话,你只是使得代码难以改变而没有真正的益处。
【译者注:在我的win10python2.7中上面的结果是:
#InPython2.7win10
#1->896
#2->1016
所以,这种比较方式是不那么让人信服的,使用__slots__主要是用以限定对象的属性信息,另外,当生成对象很多时花销可能会小一些,具体可以参见python文档:
Theslotsdeclarationtakesasequenceofinstancevariablesandreservesjustenoughspaceineachinstancetoholdavalueforeachvariable.Spaceissavedbecausedictisnotcreatedforeachinstance.】
18.使用lambda来模仿输出方法
importsys
lprint=lambda*args:sys.stdout.write(”“.join(map(str,args)))
lprint(“python”,”tips”,1000,1001)
#->pythontips10001001
19.从两个相关的序列构建一个字典
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->True
21.不使用循环构造一个列表
importitertools
test=[[-1,-2],[30,40],[25,35]]
print(list(itertools.chain.from_iterable(test)))
#->[-1,-2,30,40,25,35]
22.在Python中实现一个真正的switch-case语句
下面的代码使用一个字典来模拟构造一个switch-case。
defxswitch(x):
returnxswitch._system_dict.get(x,None)
xswitch._system_dict={‘files’:10,’folders’:5,’devices’:2}
print(xswitch(‘default’))
print(xswitch(‘devices’))
#1->None
#2->2
尊重原创文章,转载请注明出处与链接:http://www.peixun360.com/1780/news/368744/违者必究!
以上就是珠海达内IT教育培训学校 小编为您整理 Python的22个编程技巧的全部内容。