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

你可能从未听说过的Python的五个隐藏特性

时间:2023-03-13 07:45:23 科技观察

前言在本文中,我将向您展示Python中非常常见的5个特性。有经验的Python开发人员可能会认出其中的一些。但是,这将不为其他人所知。1...是的,您没有看错,在Python中...是一个有效的结构。...是一个称为省略号的单例对象。如果你在Python解释器中输入它,你会看到它:>>>...Ellipsis根据官方文档,省略号是“一个特殊的值,主要与用户定义的容器数据类型的扩展切片语法结合使用“。它有两个主要用例。一种是在空函数中充当占位符体。另一个是Numpy,作为切片项,如文档中所述。函数的占位符defmy_awesome_function():...这相当于:defmy_awesome_function():Ellipsis而这个:defmy_awesome_function():pass注意,我没有说pass=...我只是说作为函数体,结果是一样的。事实上,您可以使用任何东西作为占位符。下面的Numpy代码基本上意味着创建一个矩阵数组。每个矩阵都是3x3。然后获取所有最内层矩阵的第二列(numpy数组从0开始)。importnumpyasnp>>>array=np.arange(27).reshape(3,3,3)>>>arrayarray([[[0,1,2],[3,4,5],[6,7,8]]],[[9,10,11],[12,13,14],[15,16,17]],[[18,19,20],[21,22,23],[24,25,26]]])>>>数组[...,1]数组([[1,4,7],[10,13,16],[19,22,25]])>>>#这相当于>>>array[:,:,1]array([[1,4,7],[10,13,16],[19,22,25]])2一个优雅的拆包iterable拆包是一个非常方便的已经存在了一段时间的功能。大多数人使用它来解压包含多个项目的可迭代对象。例如,请考虑以下用例。>>>a,*b,c=range(1,11)>>>a1>>>c10>>>b[2,3,4,5,6,7,8,9]或:>>>a,b,c=range(3)>>>a0>>>b1>>>c2但是有一个很多人没有利用的好用例,那就是展开单个迭代器。为什么这有用?恕我直言,它使代码更加优雅。而不是做:>>>lst=[1]>>>a=lst[0]>>>a1>>>(a,)=lst>>>a1你可以做:>>>lst=[1]>>>[a]=lst>>>a1我知道这可能看起来很傻,但至少对我来说它看起来更优雅。3你能把这张单子放平吗?有几种方法可以展平列表。最简单的是使用列表理解。>>>l=[[1,2,3],[4,5,6],[7,8,9]]>>>扁平化=[elemforsublistinlforeleminsublist]>>>扁平化[1,2,3,4,5,6,7,8,9]如果你更倾向于函数式编程,你可以使用reducer。>>>fromfunctoolsimportreduce>>>reduce(lambdax,y:x+y,l)[1,2,3,4,5,6,7,8,9]然而,还有另一种方法。您可以使用sum函数!>>>sum(l,[])[1,2,3,4,5,6,7,8,9]这是因为sum函数迭代列表中的每个元素并且它们与作为第二个参数传递的默认值连接。因为Python中的列表可以用+运算符连接,所以你会得到这样的结果:>>>sum(l,[])==>[]+[1,2,3]+[4,5,6]+[7,8,9][1,2,3,4,5,6,7,8,9]尽管这个技巧很简洁,但它绝对不可读。此外,它的性能也很糟糕。4elseelse语句可用于多种用途。很少有人知道,但您可以在经典的“ifelse”块之外使用它。Python允许它用于循环和异常块。循环Python有两种不同的循环,for和while。两者都可能是“坏的”。也就是说,如果满足某个条件,就可以跳出循环。例如:In[7]:whilea<10:...:ifa==3:...:print("a==3.exitingloop.")...:break...:a+=1。..:a==3.退出循环。现在,假设我们正在寻找一个特定的条件。如果满足条件,则将结果保存在名为found的标志中。然后,如果我们没有找到它,我们会打印一条消息。found=Falsea=0whilea<10:ifa==12:found=Truea+=1ifnotfound:print("awasneverfound")因为a永远不会变成12,所以程序输出a永远找不到。好的,但是我们如何在这里使用else呢?else可用于替换标志。基本上,我们真正需要的是一个运行循环,如果找不到则打印一条消息。a=0whilea<10:ifa==12:break+=1else:print("awasneverfound")由于它适用于任何循环,因此您可以使用for而不是while。forainrange(10):ifa==12:break+=1else:print("awasneverfound")exceptionPython中的else非常通用,您甚至可以使用try...except。这里的想法是捕捉没有发生异常的情况。在[13]:try:...:{}['lala']...:exceptKeyError:...:print("Keyismissing")...:else:...:print("Elsehere")...:Keyismissing在此示例中,我们尝试在空字典中查找名为“lala”的键。由于“lala”不存在,代码引发KeyError异常。当我在IPython中运行这段代码时,我得到了预期的结果。如果程序没有抛出异常怎么办?在[14]:try:...:{'lala':'bla'}['lala']...:exceptKeyError:...:print("Keyismissing")...:else:...:print("Elsehere")...:Elsehere现在我们可以看到它的实际效果。{'lala':'bla'}['lala']块不会引发KeyError,因此else有效。5比较这是我的最爱之一,老实说,不是那么隐秘。与许多编程语言(如Java、C或C++)不同,Python允许比较运算符的链接。假设您有一个值为10的变量x。现在,假设您想断言x在一个范围内,比如5..20。你可以这样做:In[16]:x=10In[17]:ifx>=5andx<=20:...:print("xiswithinrange")...:else:...:print("xisoutsiderange")...:iswithinrange事实证明,这可以通过链接运算符来简化。因此,我们可以将代码重构为:In[18]:if5<=x<=20:...:print("iswithinrange")...:else:...:print("xisoutsiderange")...:iswithinrange这段代码实现了完全相同的结果,但更优雅。您可以使用任何类型的比较运算符进行链接。>>>x=10>>>20==x>1假>>>25>x<=15真>>>x<20