按位或的经典用法是按位执行,或者它在许多语言中都是这样做的,
例如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 的第一个参数,以指定属性是必需的。