5个您可能从未听说过的隐藏Python功能

2020-10-19 01:37:24

在本文中,我将向您展示在Python中可以找到的5个不同寻常的特性。有经验的Python开发人员可能会认出其中的一些。然而,其他人仍将是未知的。不管怎样,我觉得他们都很酷。

是的,你没看错,……。是Python中的有效构造。..。是一个名为Ellipsis的单例对象。如果您将其输入到Python解释器中,您实际上可以看到它:

根据官方文档,省略号是一个特殊的值,主要与用户定义的容器数据类型的扩展切片语法结合使用。它有两个主要的用例。一种是在空函数中充当占位符主体。另一个是在Numpy上,作为切片项,就像文档中描述的那样。

请注意,我并不是说pass==...,我只是说作为一个函数体,结果是一样的。事实上,您可以将任何内容用作占位符。

下面的代码基本上意味着创建一个矩阵数组。每个矩阵为3x3。然后得到所有最里面的矩阵的第二列(numpy数组从0开始)。

将numpy导入为np array=np.arange(27).rehape(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])array[...,1]array([[1,4,7],[10,13,16],[19,22,25]])#相当于array[:,:,1]array([[1,4,7],[10,13,16],[19,22,25]])。

可重复拆包是一个非常方便的功能,并且已经有一段时间了。大多数人使用它来解包包含多个项的迭代。作为示例,请考虑以下用例。

A,*b,c=范围(1,11)a 1 c 10 b[2,3,4,5,6,7,8,9]

但是有一个很多人没有利用的很好的用例是解包单个迭代。为什么这是有用的?这会让代码更优雅一些,IMHO。

我知道这可能看起来很傻,但至少在我看来,它看起来更优雅。

拼合列表可以通过几种方式完成。最简单的方法是使用列表理解。

L=[[1,2,3],[4,5,6],[7,8,9]]展平=[子列表中的元素为l中的元素]展平[1,2,3,4,5,6,7,8,9]。

从函数工具导入Reduce Reduce(lambda x,y:x+y,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]。

尽管这个把戏很精彩,但绝不是可读性的。而且,它的表现也很糟糕。

不,Python禁止对字符串执行同样的操作,即使您可以使用+运算符连接字符串。

S=[";abc";,";def";,";]sum(s,";";)----TypeError回溯(最近一次调用)<;ipython-Input-3-f60d89b81305>;在<;模块>;中->;1SUM(s,";";)TypeError:sum()可以t SUM字符串[改用';';.join(Seq)]。

静态PyObject*(PyObject*模块,PyObject*Iterable,PyObject*Start)/*[诊所端生成的代码:output=df758cec7d1d302f input=162b50765250d222]*/{PyObject*Result=start;PyObject*Temp,*Item,*ITER;ITER=PyObject_GetIter(Iterable);IF(ITER=NULL)返回NULL;IF(Result=NULL){Result=PyLong_FromLong(0);IF(Result=NULL){Py_DECREF(ITER);Return NULL}}Else{/*Reject字符串值';Start';参数*/IF(PyUnicode_Check(Result)){PyErr_SetString(PyExc_TypeError,";sum()can';t sum string[改用';';.join(Seq)]";);Py_DECREF(ITER);return null;}if(PyBytes_check(Result)){PyErr_SetString(PyExc_TypeError,";sum()can';t sum bytes[use b';';.join(Seq)改为]";);Py_DECREF(ITER);return null;}if(PyByteArray_Check(Result)){PyErr_SetString(PyExc_TypeError,";sum()can';t sum bytearray[改用b';';.join(Seq)]";);Py_DECREF(ITER);Return NULL;}Py_INCREF(Result);}。

当与REPL一起工作时,这个非常有趣并且非常方便。它不仅可以使用默认的Python解释器,还可以使用IPython。

无论何时在REPL中运行表达式,Python都会将输出绑定到_变量。

由于_和其他变量一样,您可以重新绑定它,或者使用它执行任何其他操作。

中的Else语句有多种用途。很少有人知道,但是你可以在经典的“如果其他人”区块之外使用它。Python允许在循环和异常块上使用它。

Python有两个不同的循环,For和While。这两个都可能是坏的。也就是说,如果满足了一定的条件,我们就可以跳出这个循环。例如:

在[7]中:While a<;10:...:If a==3:...:Print(";a==3.退出循环。";)...:Break...:A+=1...:A==3.退出循环。

现在,让我们假设我们正在寻找一种特殊的情况。如果满足该条件,我们将结果保存在一个名为Found的标志中。然后,如果我们找不到它,我们会打印一条消息。

Found=False=0 When a<;10:If a==12:Found=True a+=1 If Not Found:Print(";a从未找到";)。

Else可用于替换该标志。基本上,我们实际需要的是运行循环,如果没有找到,则打印一条消息。下面是使用Else时的外观:

A=0,而a<;10:如果a==12:中断a+=1,否则:打印(";a从未找到";)。

因为它可以与任何循环一起使用,所以可以使用for而不是while。

对于范围内(10):如果a==12:中断a+=1,否则:打印(";从未找到a";)。

Python中的Else功能非常多,您甚至可以试着使用它……。除了区块。这里的想法是捕获不发生异常的情况。

在[13]中:Try:...:{}[';Lala';]...:Expect KeyError:...:Print(";Key is Missing";)...:Else:...:Print(";Else Here";)...:缺少密钥。

在本例中,我们尝试在空词典中查找名为“lala”的键。因为没有“lala”,所以代码将引发KeyError异常。当我在IPython中运行这段代码时,我得到了预期的结果。

在[14]中:尝试:...:{';lala';:';bla';}[';lala';]...:除KeyError:...:Print(";键缺失";)...:Else:...:Print(";Else here";)...:Else Here。

现在我们可以看到它的实际效果了。{‘lala’:‘bla’}[‘lala’]块不会引发KeyError,因此使用其他方法。

请记住,很少有人知道这一点,因此我个人避免使用此功能来避免混淆使用相同代码库的其他开发人员。不过,能给朋友留下深刻印象是件好事!

这是我最喜欢的之一,老实说,也不是很隐蔽。与Java、C或C++等许多编程语言不同,Python允许您链接比较运算符。让我们假设你有一个变量x,它的值是10。现在,假设你想要断言x在一个范围内,比如5..20。您可以这样做:

In[16]:x=10in[17]:如果x>;=5且x<;=20:...:Print(";x在";范围内)...:Else:...:Print(";x在";范围外)...::在范围内。

事实证明,这可以通过链接操作符来简化。因此,我们可以将代码重构为:

在[18]中:如果5<;=x<;=20:...:Print(";在";范围内)...:Else:...:Print(";x在范围";之外)...:在范围内。

这段代码实现了完全相同的结果,但它要优雅得多。您可以使用任何类型的比较运算符来链接。

X=10 20==x>;1 False 25>;x<;=15 True x<;20<;x*10<;1000 True。

这篇帖子到此结束。Python是一种非常友好的语言,具有一些不错但不是很出名的特性。在这篇文章中,我向你展示了我最喜欢的,我希望你学到了一些新的东西。下次见!。

如果你喜欢这篇文章,可以考虑和你的朋友分享!另外,先生们,请随时跟我来。我。