您当前的位置:首页 >> 综合 >> 
Python 中的运算符

时间:2023-06-02 13:40:45    来源:个人图书馆-汉无为

按位或的经典用法是按位执行,或者它在许多语言中都是这样做的,

例如Java,C,C++和JavaScript等等。


【资料图】

同样,当在数字之间执行时,它也在 Python 中用于此目的。

例如:|

a=4#inbinary0100=0*2^3+1*2^2+0*2^1+0*2^0=4b=8#inbinary1000=1*2^3+0*2^2+0*2^1+0*2^0=8#bitwiseor:#0100#1000#=>1100=12print(a|b)#=>12

同样用于按位和 &

合并词典

从 Python 3.9 开始,运算符可用于合并字典:|

a={"a":5,"b":6}b={"c":7}print(a|b)#=>{"a":5,"b":6,"c":7}

请注意,如果字典共享键,则将保留操作中最后一个字典中的值:

a={"a":5,"b":6}b={"a":7}print(a|b)#=>{"a":7,"b":6}

您还可以链接操作以合并多个词典:

a={"a":5,"b":6}b={"a":7}c={"a":8,"c":10}print(a|b|c)#=>{"a":8,"b":6,"c":10}

集合的联合

Python 中的 A 是一个没有重复项的无序元素集合。它提供了快速的成员资格检查和许多有用的操作,例如集合的联合。集合的并集是所有集合的组合元素(没有重复),这里可以使用运算符:set|

a=set([1,2,3])b=set([2,3,4])#union:print(a|b)#orequivalentlyprint(a.union(b))

它也可以链接:

a=set([1,2,3])b=set([2,3,4])c=set([3,4,5])print(a|b|c)#=>{1,2,3,4,5}

元素布尔值或 NumPy 和Pandas

在 NumPy 和 Pandas 中,具有执行逐元素布尔或的重要目的。我在这里强调重要,因为它可以实现相当大的加速,而不是在熊猫中使用。

让我们用一个例子来说明这一点

|.apply()

fromtimeimporttimeimportnumpyasnpimportpandasaspda=pd.Series(np.arange(1000000))#using.apply()start_time=time()b=a.apply(lambdax:x<300000orx>700000)print(time()-start_time)#=>0.1980600357055664start_time=time()b=(a<300000)|(a>700000)print(time()-start_time)#=>0.0020973682403564453

运行这个时,元素方面或快了 94 倍!同样,您可以使用 执行逐个元素和。当速度很重要时,这些操作员是必不可少的。

&类型提示中的联合

为允许具有多种类型的变量指定类型提示时,可以使用该类型:Union

fromtypingimportUniondefsome_method(#acanbeoftypestrorinta:Union[str,int]):...但你也可以从 Python 3.10使用,并编写:|defsome_method(#acanbeoftypestrorinta:str|int):...

您自己的操作 最后,您可以通过执行运算符重载来定义自己对自己的类的用法。

为此,您只需在类中定义一个名为 .让我们创建一个有趣的示例,其中方法被链接在一起:|__or__

classCallback:def__init__(self,func):self.func=func#implementingthismethodwillenable#the|operatorforthisclass:#a|b#whereawillbeself,andbwillbe#thefirstargumentin__or__def__or__(self,other):#chainthemethodsdefcombined_func(input):#self(...)canbeusedsince#__call__isdefinedbelowtmp=self(input)returnother(tmp)returnCallback(combined_func)def__call__(self,input):returnself.func(input)

通过重载 -运算符,现在可以链接回调以生成新的回调:__or__

method=(Callback(lambdax:x+1)|Callback(lambdax:x*2)|Callback(lambdax:x**2))print(method(3))#((3+1)*2)**2=64#=>64print(method(4))#((4+1)*2)**2=100#=>100

......省略号

省略号或省略号是Python中的一个常量,用于各种情况,通常表示与普通文本相同的含义,即“等等”或“某些东西应该在这里”。

请注意,键入 和 是等效的:......Ellipsis

assertEllipsis==...

让我们来看看它的一些用途。

在数字派中 在 NumPy 中使用多个维度时,省略号可用于表示“其余维度”,即:

importnumpyasnptensor=np.random.uniform(size=(10,10,10,10,10))print(tensor[0,...].shape)#correspondstotensor[0,:,:,:,:]#=>(10,10,10,10)print(tensor[0,0,...].shape)#correspondstotensor[0,0,:,:,:]#=>(10,10,10)print(tensor[0,0,...,0].shape)#correspondstotensor[0,0,:,:,0]#=>(10,10)print(tensor[0,0,...,0,0].shape)#correspondstotensor[0,0,:,0,0]#=>(10,)

有关更多NumPy技巧,请查看这篇文章。

解锁 NumPy | 推荐 高分Numpy 100 Github 10.3k Star!

作为占位符

使用 指示函数不执行任何操作或应稍后完成的替代方法是使用 :passEllipsis

defmy_method():...

你也可以把它用在类上:

classMyClass:...

如果你像我一样,在写文本时为你打算以后填写的内容写"...",这种方法应该很自然。

类型化

在不同的情况下,Ellipsis 可以在 Python 的类型提示中使用。

元组

当为一个元组添加类型提示时,你可以把它定义为固定长度或可变长度。在后一种情况下,Ellipsis进入了画面。让我们看一些例子:

fromtypingimportTupledefsome_method(#ex:(1,"hello",2)a:Tuple[int,str,int],#ex:()b:Tuple[()],#variablelength!#ex:(1,2,3,4)or(1,2)c:Tuple[int,...],):...

变量的类型提示说,元组可以包含任何数量的ints。那么你如何定义一个任何类型的变长元组呢?有两个选择:

fromtypingimportTuple,Anydefsome_other_method(#option1a:Tuple[Any,...],#option2(equivalenttooption1)b:Tuple):...Callable

类型的对象是可以调用的东西,例如方法。在理解此处省略号的作用之前,让我们先了解一下类型提示通常是如何定义的:CallableCallable

fromtypingimportCallableCallable[[TypeOfFirstArg,TypeOfSecondArg,andsoon...],ReturnType]

了解一下类型提示通常是如何定义的:

CallableCallable

fromtypingimportCallabledefsome_method(#takeszeroarguments,returnsnothing/None#ex:a()a:Callable[[],None],#takestwoarguments,anintandastring,returnsanint#ex:b(1,"hello")b:Callable[[int,str],int],):a()b(1,"hello")

但是,如果应该能够接受任何类型的任意数量的参数呢?这就是省略号的用武之地。只需按如下方式定义它:Callable

defsome_other_method(#takesanynumberofargumentsofanytype,returnsanint#ex:c(1,2,3,4)orc()c:Callable[...,int],):c()c(1,2,3)另请注意,只需指定:d: Callable意味着:d:Callable[...,Any]

即接受任意数量的参数并返回任何内容的方法。顺便说一下,从 Python 3.10 开始,省略号也有了自己的类型:.types.EllipsisType

您自己的函数和类

就像 一样,the 是一个单例,这意味着整个程序中只有一个对象的实例,任何对 的引用都将指向内存中的同一对象。

例如:Field

classModel(BaseModel):#alistofstringsthatisrequiredandneedstohaveatleast5itemsa_required_attr:List[str]=Field(...,min_items=5)

因此,每当省略号在语义上有意义和/或您想要另一个单例时,它就可以在您的类或方法中使用。

Pydantic是一个流行的数据验证库,省略号可以用作所谓的 -function 的第一个参数,以指定属性是必需的。

标签: