这是我参与更文挑战的第22天,活动详情查看: 更文挑战
大家分享一下在工作使用到的一个Python比较冷门的内置运算符不一样的使用:”<<“和”>>”
何为“<<”和“>>”?
有其他语言基础的朋友就会知道:
“>>”就是右移位运算符;
“<<”就是自然就是左移位运算符,在Python中也是如此。
- 左移n位就是原来的数乘以2的n次方;
- 右移n位就是原来的数除以2的n次方:
>>> 2<<3
16
>>> 16>>3
2
复制代码
还有什么不一样的用法?
下面我们定义一个类,重写”<<“和”>>”方法,看看它们的变化:
class Pipe(object):
def __init__(self, name):
self.name = name
def __rshift__(self, other):
print("#%s.__rshift__(%s)" % (self, other))
return self
def __rrshift__(self, other):
print("#%s.__rrshift__(%s)" % (self, other))
return self
def __lshift__(self, other):
print("#%s.__lshift__(%s)" % (self, other))
return self
def __rlshift__(self, other):
print("#%s.__rlshift__(%s)" % (self, other))
return self
def __str__(self):
return self.name
class NoPipe(object):
def __init__(self, name):
self.name = name
def __str__(self):
return self.name
A = Pipe("A")
B = Pipe("B")
C = Pipe("C")
Z = NoPipe("Z")
复制代码
我们打印一下它们的运行输出结果,总结它们的规律:
print("*" * 20)
print("A>>B>>C")
print(A >> B >> C)
print("*" * 20)
print("A<<B<<C")
print(A << B << C)
print("*" * 20)
print("A>>(B>>C)")
print(A >> (B >> C))
print("&" * 20)
print("Z>>A>>B")
print(Z >> A >> B)
print("&" * 20)
print("A>>Z>>B")
print(A >> Z >> B)
复制代码
下面是运行结果:
********************
A>>B>>C
#A.__rshift__(B)
#A.__rshift__(C)
A
********************
A<<B<<C
#A.__lshift__(B)
#A.__lshift__(C)
A
********************
A>>(B>>C)
#B.__rshift__(C)
#A.__rshift__(B)
A
&&&&&&&&&&&&&&&&&&&&
Z>>A>>B
#A.__rrshift__(Z)
#A.__rshift__(B)
A
&&&&&&&&&&&&&&&&&&&&
A>>Z>>B
#A.__rshift__(Z)
#A.__rshift__(B)
A
复制代码
寻找规律
- 无论是左移还是右移,命令都从左到右开始;
- 第一个组合的输出将用作下一个操作的左操作符;
- 括号按照预期改变了操作顺序;
- __rshift__和__lshift__操作仅在实现它的类上调用;
- 如果其中一个类没有实现__rshift__和_lshift_,则调用__rrshift__或__rlshift__操作,自己作为self。
有什么Pythonic之处呢?
假设有以下一个业务场景,在调用一个业务处理函数之前需要等待前面n个业务处理函数处理完毕后才能执行, 比如坐地铁的流程:
乘坐地铁(列车进站(到站台候车(刷卡进站(通过安检(前往地铁站())))))
复制代码
如果是这样的话,一层嵌套一层,是不是很乱的感觉,有没有什么更形象的方法实现呢?
真有,Python就是这么简洁,下一篇就使用”>>”形象使用下面的形式的实现上面的业务流程,就很形象明了:
前往地铁站 >> 通过安检 >> 刷卡进站 >> 到站台候车 >> 列车进站 >> 乘坐地铁
复制代码
如何实现呢?且听下回分解
可以先提供个思路,”>>” Combine Recursion
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END