30个基本的Python技巧和窍门程序员

1.就地交换两个数字。

Python提供了一种直观的方式来分配和交换一行。请参考下面的例子。

x,y = 10,20print(x,y)

x,y = y,xprint(x,y)

#1(10,20)#2(20,10)

右边的任务会产生一个新的元组。而左边的那个会立即将那个(未被引用的)元组解包到名称和。

分配完成后,新的元组将被重新引用并标记为垃圾收集。变量的交换也最终发生。

2.链接比较运算符。

比较运算符的聚合是另一个有时候可以派上用场的技巧。

10,结果= 1 n

3.使用三元运算符进行有条件分配。

三元运算符是if-else语句的捷径,也称为条件运算符。

[on_true] if [expression] else [on_false]

这里有几个例子可以用来使代码紧凑和简洁。

下面的语句是做同样的意思,即“ 如果y是9,则将10赋值给x,否则将20赋值给x ”。如果需要的话,我们可以扩展运营商的链接。

x = 10 if(y == 9)else 20

同样,我们也可以为类对象做同样的事情。

x =(classA if y == 1 else classB)(param1,param2)

在上面的例子中,classA和classB是两个类,其中一个类构造函数会被调用。

下面是一个没有的例子。的条件加入评估最小的数字。

def small(a,b,c):小(a ,b ,c ):

如果a

打印(小(1,0,1))打印(小(1 ,0 ,1 )) 打印(小(1,2,2))打印(小(1 ,2 ,2 )) 打印(小(2,2,3))打印(小(2 ,2 ,3 )) 打印(小(5,4,3))打印(小(5 ,4 ,3 )) #Output#Output#0#1#2#3#0#1#2#3

我们甚至可以使用一个三元运算符的列表理解。

[m ** 2如果m> 10 else m ** 4(m)在范围内(50)]m ** 2 如果m > 10 else m ** 4 (m)在范围内(50 )] 0,1,16,81,256,625,1296,2401,4096,6561,10000,121,144,169,196,225,256,289,324,361,400,441, 529,576,625,676,729,784,841,900,961,1024,1089,1156,1225,1296,1369,1444,1521,1600,1681,1764,1849,1936, 2304,2401]0,1,16,81,256,625,1296,2401,4096,6561,10000,121,144,169,196,225,256,289,324,361,400,441, 529,576,625,676,729,784,841,900,961,1024,1089,1156,1225,1296,1369,1444,1521,1600,1681,1764,1849,1936, 2304,2401]

4.使用多行字符串。

基本的方法是使用从C语言中派生出来的反斜杠。

multiStr =“select * from multi_row = “select * from multi_row row_id

还有一个窍门是使用三重引号。

multiStr =“”“select * from multi_row = “”“select * from multi_row where row_id

上述方法的共同问题是缺乏正确的缩进。如果我们尝试缩进,它会在字符串中插入空格。

所以最后的解决方案是将字符串拆分成多行,并将整个字符串括在括号中。

multiStr =(“select * from multi_row”= (“select * from multi_row” “row_id

5.将列表的元素存储到新变量中。

我们可以使用一个列表来初始化一个no。的变量。在打开列表的同时,变量的数量不应该超过no。列表中的元素。

testList = [1,2,3]= [ 1 ,2 ,3 ] x,y,z = testList,y ,z = testList打印(x,y,z)打印(x ,y ,z )# - > 1 2 3# - > 1 2 3

6.打印导入模块的文件路径。

如果你想知道你的代码中导入的模块的绝对位置,然后使用下面的技巧。

导入线程 穿线 导入套接字导入套接字打印(线程)打印(线程)打印(插座)打印(套接字)#1- #1- #2- #2-

7.使用交互式“_”运算符。

这是一个很有用的功能,我们并不知道。

在Python控制台中,每当我们测试一个表达式或调用一个函数时,结果都会调度到一个临时名称_(一个下划线)。

>>> 2 + 1 2 + 1 33>>> _>>> _33>>>打印_>>> 打印_ 33

“_”引用上次执行的表达式的输出。

小编推荐大家加一下这个群:666468218这个群里好多人了!大家遇到啥问题都会在里面交流!而且免费分享零基础入门料资料web开发 爬虫资料一整套!是个非常好的学习交流地方!也有程序员大神给大家热心解答各种问题!很快满员了。欲进从速哦!各种PDF等你来下载!全部都是免费的哦!只为帮助大家快速入门,所以小编在群里等你们过来一起交流学习呢!

8.字典/设置理解。

就像我们使用列表推导一样,我们也可以使用字典/集合理解。它们使用简单,效果也一样。这是一个例子。

testDict = = { 我:我* 我为我在x范围(10 )} testSet = = { i * 2 for x in xrange (10 )} 打印(测试集)打印(testSet )打印(testDict)打印(testDict )#set([0,2,4,6,8,10,12,14,16,18])#set([0,2,4,6,8,10,12,14,16,18])##

注 -两个语句中只有的区别。另外,要在Python3中运行上面的代码,用替换。

9.调试脚本。

我们可以在

模块的帮助下,在Python脚本中设置断点。请按照下面的例子。

导入pdb PDBpdb.set_trace()。set_trace ()

我们可以在脚本的任何地方指定

并在那里设置一个断点。这非常方便。

10.安装文件共享。

Python允许运行一个HTTP服务器,您可以使用它来共享服务器根目录中的文件。以下是启动服务器的命令。

#Python 2

python -m SimpleHTTPServer- 米SimpleHTTPServer

#Python 3

python3 -m http.server- m http 。服务器

上面的命令会在默认端口8000上启动一个服务器。你也可以使用一个自定义的端口作为上述命令的最后一个参数。

11.在Python中检查一个对象。

我们可以通过调用dir()方法来检查Python中的对象。这是一个简单的例子。

测试= [1,3,5,7]= [ 1 ,3 ,5 ,7 ] 打印(目录(测试))打印(目录(测试))

[ '__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__', '追加','计数“,”扩展“,”索引“,”插入“,”流行“,”删除“,”反向“,”排序“]'__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',“反向” ,“排序” ]

12.简化If语句。

要验证多个值,我们可以按照以下方式进行。

如果[1,3,5,7]中的m:米在[ 1 ,3 ,5 ,7 ]:

代替:

如果m == 1或者m == 3或者m == 5或者m == 7:m == 1 或者m == 3 或者m == 5 或者m == 7 :

或者,我们可以使用''而不是'[1,3,5,7]'作为'in'运算符,因为'set'可以通过O(1)来访问每个元素。

13.在运行时检测Python版本。

如果当前运行的Python引擎少于支持的版本,有时我们可能不想执行我们的程序。要做到这一点,你可以使用下面的代码片段。它还以可读格式打印当前使用的Python版本。

打印(“对不起,你没有在Python 3.5上运行 n”)打印(“对不起,你没有在Python 3.5上运行 n” )

打印(“请升级到3.5。 n”)打印(“请升级到3.5。 n” )

sys.exit(1)。退出(1 )

#以可读格式打印Python版本。#以可读格式打印Python版本。print(“当前Python版本:”,sys.version)打印(“当前Python版本:” ,SYS 。版本)

或者,您可以使用上面的代码替换。这是一位知情读者的建议。

sys.version_info >=(3,5)

在Python 2.7上运行时输出。

Python 2.7.10(默认,2015年7月14日,19:46:27) 2.7 。10 (默认,2015年7月14 日,19 :46 :27 ) 在Linux上[GCC 4.8.2][ GCC 4.8 。2 ] 在Linux上

对不起,你没有在Python 3.5上运行对不起,你没有在Python 3.5上运行请升级到3.5。

在Python 3.5上运行时输出。

Python 3.5.1(默认,2015年12月,13:05:11) 3.5 。1 (默认,12月的到2015年,13 :05 :11 ) 在Linux上[GCC 4.8.2][ GCC 4.8 。2 ] 在Linux上

当前Python版本:3.5.2(默认,2016年8月22日,21:11:05) 目前的Python 版本:3.5 。2 (默认,2016年8月22 日,21 :11 :05 ) [GCC 5.3.0][ GCC 5.3 。0 ]

14.组合多个字符串。

如果要连接列表中的所有可用标记,请参阅下面的示例。

>>> test = ['I','Like','Python','automation']test = [ 'I' ,'Like' ,'Python' ,'automation' ]

现在,让我们从上面给出的列表中的元素创建一个单一的字符串。

>>> print''.join(test) 打印“ 。加入(测试)

15.四种方法来反转字符串/列表。

#反转列表本身。

testList = [1,3,5]= [ 1 ,3 ,5 ] testList.reverse()。反向()打印(testList)打印(testList )# - > [5,3,1]# - > [5,3,1]

#在循环中迭代时反转。

对于反转的元素([1,3,5]):print(element)元件在扭转([ 1 ,3 ,5 ):打印(元件) #1-> 5#1-> 5#2-> 3#2-> 3#3-> 1#3-> 1

#反转一个字符串。

“测试Python”[:: - 1][:: - 1 ]

这将输出作为“nohtyP tseT”

#使用切片反转列表。

[1,3,5] [:: - 1]1 ,3 ,5 ] [:: - 1 ]

上述命令将输出为[5,3,1]。

16.玩枚举。

使用枚举器,在循环中很容易找到索引。

testlist = [10,20,30]= [ 10 ,20 ,30 ] 对于我来说,枚举值(testlist):对于我,值在枚举(testlist ):

print(i,':',value)print (i ,':' ,value ) #1-> 0:10#1-> 0:10#1:20#1:20#3-> 2:30#3-> 2:30

17.在Python中使用枚举。

我们可以使用下面的方法来创建枚举定义。

上课形状: 形状:

圆形,方形,三角形,四边形=范围(4)圆形,方形,三角形,四边形= 范围(4 ) 打印(Shapes.Circle)打印(形状,圆形)打印(Shapes.Square)打印(形状。方形)打印(Shapes.Triangle)打印(形状。三角形)打印(Shapes.Quadrangle)打印(形状。四边形)#1-> 0#1-> 0#2-> 1#2-> 1#3-> 2#3-> 2#4-> 3#4-> 3

18.从函数返回多个值。

没有太多的编程语言支持这个功能。但是,Python中的函数确实会返回多个值。

请参考下面的例子看看它的工作。

#函数返回多个值。def x():def x ():

返回1,2,3,4返回1 ,2 ,3 ,4 #调用上述功能。#调用上述功能。a,b,c,d = x(),b ,c ,d = x ()打印(a,b,c,d)打印(a ,b ,c ,d )# - > 1 2 3 4# - > 1 2 3 4

19.使用Splat运算符解压缩函数参数。

splat操作符提供了一个艺术化的方式来解压参数列表。为了清晰起见请参考下面的例子。

def test(x,y,z):测试(x ,y ,z ):

打印(x,y,z)打印(x ,y ,z )testDict = {'x':1,'y':2,'z':3} = { 'x' :1 ,'y' :2 ,'z' :3 } testList = [10,20,30]= [ 10 ,20 ,30 ] 测试(* testDict)(* testDict )测试(** testDict)(** testDict )测试(* testList)(* testList )#1-> xyz#1-> xyz#2> 1 2 3#2> 1 2 3#3-> 10 20 30#3-> 10 20 30

20.使用字典来存储交换机。

我们可以做一个字典存储表达式。

stdcalc = {= {

'sum':lambda x,y:x + y,'sum' :lambda x ,y :x + y ,

'减':lambda x,y:x - y'减' :lambda x ,y :x - y }}打印(stdcalc [ '总和'](9,3))打印(stdcalc [ '总和' ](9 ,3 ))打印(stdcalc [ '减法'](9,3))打印(stdcalc [ '减去' ](9 ,3 ))#1-> 12#1-> 12#6#6

21.在一行中计算任意数字的阶乘。

Python 2.X.

结果=(lambda k:reduce(int .__ mul__,range(1,k + 1),1))(3)= (拉姆达ķ :减少(INT 。__mul__ ,范围(1 ,ķ + 1 ),1 ))(3 ) 打印(结果)打印(结果)# - > 6# - > 6

Python 3.X.

导入functools functools结果=(lambda k:functools.reduce(int .__ mul__,range(1,k + 1),1))(3)= (拉姆达ķ :functools 。减少(INT 。__mul__ ,范围(1 ,ķ + 1 ),1 ))(3 ) 打印(结果)打印(结果)# - > 6# - > 6

22.找到列表中最常见的值。

测试= [1,2,3,4,2,2,3,1,4,4,4]= [ 1 ,2 ,3 ,4 ,2 ,2 ,3 ,1 ,4 ,4 ,4 ] print(max(set(test),key = test.count))打印(最大(组(试验),键= 测试。计数))# - > 4# - > 4

23.重置递归限制。

Python限制递归限制为1000.我们可以重置它的值。

导入系统 SYSX = 1001= 1001打印(sys.getrecursionlimit())打印(SYS 。getrecursionlimit ())sys.setrecursionlimit(x)的。setrecursionlimit (x )打印(sys.getrecursionlimit())打印(SYS 。getrecursionlimit ())#1-> 1000#1-> 1000#2-> 1001#2-> 1001

请仅在需要时应用上述技巧。

24.检查对象的内存使用情况。

在Python 2.7中,一个32位的整数占用24个字节,而在Python 3.5中占用28个字节。为了验证内存使用情况,我们可以调用方法。

在Python 2.7。

导入系统 SYSX = 1= 1打印(sys.getsizeof(X))打印(SYS 。getsizeof (X ))# - > 24# - > 24

在Python 3.5中。

导入系统 SYSX = 1= 1打印(sys.getsizeof(X))打印(SYS 。getsizeof (X ))# - > 28# - > 28

25.使用__slots__来减少内存开销。

你有没有看过你的Python应用程序消耗大量的资源,特别是内存?这是一个使用类变量在一定程度上减少内存开销的技巧。

导入系统 SYSclass FileSystem(object):class FileSystem (object ):

def __init __(self,files,folders,devices):def __init__ (self ,files ,folders ,devices ):

self.files =文件自我。文件= 文件

self.folders =文件夹自我。文件夹= 文件夹

self.devices =设备自我。设备= 设备print(sys.getsizeof(FileSystem))打印(SYS 。getsizeof (文件系统)) class FileSystem1(object):class FileSystem1 (object ):

__slots__ = ['文件','文件夹','设备']= [ '文件' ,'文件夹' ,'设备' ]

def __init __(self,files,folders,devices):def __init__ (self ,files ,folders ,devices ):

self.files =文件自我。文件= 文件

self.folders =文件夹自我。文件夹= 文件夹

self.devices =设备自我。设备= 设备打印(sys.getsizeof(FileSystem1))打印(SYS 。getsizeof (FileSystem1 )) #在Python 3.5中#在Python 3.5中#1-> 1016#1-> 1016#888#888

很明显,从结果中可以看出,内存使用量有所节省。但是当一个类的内存开销不必要的大时,你应该使用__slots__。只有在分析应用程序后才能做到这一点。否则,你会使代码难以改变,没有真正的好处。

26.Lambda模仿打印功能。

27.从两个相关的序列创建一个字典。

t1 =(1,2,3)= (1 ,2 ,3 ) t2 =(10,20,30)= (10 ,20 ,30 ) 打印(字典(zip(t1,t2)))打印(字典(zip (t1 ,t2 )))# - > # - >

28.在行中搜索字符串中的多个前缀。

print(“http://www.google.com”.startswith((“http://”,“https://”)))(“http://www.google.com” 。startswith ((“HTTP://” ,“https://开头” ))) print(“http://www.google.co.uk”.endswith((“.com”,“.co.uk”)))打印(“http://www.google.co.uk” 。的endsWith ((“.COM” ,“.co.uk” ))) #1->是的#1->是的#2-真#2-真

29.形成统一的列表,不使用任何循环。

如果你有一个嵌套列表或元组的元素的输入列表,然后使用下面的技巧。但是,这里的限制是它使用for循环。

def unifylist(l_input,l_target):unifylist (l_input ,l_target ):

为它在l_input:为它在l_input :

如果isinstance(它,列表):如果isinstance (它,列表):

unifylist(it,l_target)(it ,l_target )

elif isinstance(it,tuple):elif isinstance (it ,tuple ):

unifylist(list(it),l_target)(列表(it ),l_target )

其他:其他:

l_target.append(IT)。追加(it )

返回l_target返回l_targettest = [[-1,-2],[1,2,3,[4,(5,[6,7])]],(30,40),[25,35]]= [[ - 1 ,- 2 ],[ 1 ,2 ,3 ,[ 4 ,(5 ,[ 6 ,7 )]], (30 ,40 ),[ 25 ,35 ]] 打印(unifylist(测试,[]))打印(unifylist (test ,[]))#输出=> [ - 1,-2,1,2,3,4,5,6,7,30,40,25,35]#输出=> [ - 1,-2,1,2,3,4,5,6,7,30,40,25,35]

统一包含列表和元组的列表的另一个更简单的方法是使用Python的包。它不需要循环。只要做一个,如果还没有的话。

导入more_itertools more_itertools测试= [[-1,-2],[1,2,3,[4,(5,[6,7])]],(30,40),[25,35]]= [[ - 1 ,- 2 ],[ 1 ,2 ,3 ,[ 4 ,(5 ,[ 6 ,7 )]], (30 ,40 ),[ 25 ,35 ]] 打印(列表(more_itertools.collapse(测试)))打印(列表(more_itertools 。崩溃(测试)))#Output => [-1,-2,1,2,3,4,5,6,7,30,40,25,35]#Output => [-1,-2,1,2,3,4,5,6,7,30,40,25,35]

30.在Python中实现一个真正的Switch-Case语句。

以下是使用字典模拟开关案例结构的代码。

def xswitch(x): xswitch (x ):

return xswitch._system_dict.get(x,None) 返回xswitch 。_system_dict 。get (x ,None ) xswitch._system_dict = {'files':10,'folders':5,'devices':2}。_system_dict = { 'files' :10 ,'folders' :5 ,'devices' :2 } 打印(xswitch( '默认'))print (xswitch ('default' ))打印(xswitch( '设备'))打印(xswitch ('devices' ))#1->无#1->无#2-> 2#2-> 2

今天总结了Python的三十条小技巧,有什么觉的可以补充的

本文来自企鹅号 - 鲁滨逊媒体

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏chenssy

【死磕Java并发】-----Java内存模型之重排序

在执行程序时,为了提供性能,处理器和编译器常常会对指令进行重排序,但是不能随意重排序,不是你想怎么排序就怎么排序,它需要满足以下两个条件: 1. 在单线程环境...

1522
来自专栏程序员互动联盟

【专业技术第十三讲】指针和内存泄露

存在问题: 指针是大家最为头痛的问题,也是程序bug中较难解决的错误,什么情况下会导致内存泄露? 解决方案: 引言 对于任何使用C语言的人,如果问他们C语言...

3638
来自专栏你不就像风一样

深入理解Java虚拟机(类文件结构+类加载机制+字节码执行引擎)

周志明的《深入理解Java虚拟机》很好很强大,阅读起来颇有点费劲,尤其是当你跟随作者的思路一直探究下去,开始会让你弄不清方向,难免有些你说的啥子的感觉。但知识不...

1442
来自专栏林德熙的博客

dotnet core 编程规范

本文实际只是翻译 .NET Core foundational libraries 官方文档的编码风格。

972
来自专栏linux驱动个人学习

Linux 内存池【转】

1685
来自专栏章鱼的慢慢技术路

Go语言相关练习_选择题(2)

go语言中字符串是UTF-8编码并存储的,它语言不定长的字节,所以它不支持下标操作,因为没一个下标操作代表的是固定长度的字节,所以不能对字符串中某个字符单独赋值...

1102
来自专栏java一日一条

Java反射在JVM的实现

反射使程序代码能够接入装载到JVM中的类的内部信息,允许在编写与执行时,而不是源代码中选定的类协作的代码,是以开发效率换运行效率的一种手段。这使反射成为构建灵活...

2243
来自专栏测试开发架构之路

堆和栈的区别

一、预备知识—程序的内存分配          一个由C/C++编译的程序占用的内存分为以下几个部分     1、栈区(stack)— 由编译器自动分配释放,存...

2918
来自专栏chenssy

【死磕Java并发】—–Java内存模型之重排序

在执行程序时,为了提供性能,处理器和编译器常常会对指令进行重排序,但是不能随意重排序,不是你想怎么排序就怎么排序,它需要满足以下两个条件: 在单线程环境下不能改...

2586
来自专栏aCloudDeveloper

局部变量,静态局部变量,全局变量,静态全局变量在内存中的存放区别(转)

     我们先来看内存中的几大区:  内存到底分几个区? 下面有几种网上的理解,我整理一下: 一:  1、栈区(stack)— 由编译器自动分配释放 ,存放函...

3508

扫码关注云+社区

领取腾讯云代金券