Python魔法方法之rrshift

这是我参与更文挑战的第22天,活动详情查看: 更文挑战

大家分享一下在工作使用到的一个Python比较冷门的内置运算符不一样的使用:”<<“和”>>”

何为“<<”和“>>”?

有其他语言基础的朋友就会知道:
“>>”就是右移位运算符;
“<<”就是自然就是左移位运算符,在Python中也是如此。

  1. 左移n位就是原来的数乘以2的n次方;
  2. 右移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
复制代码

寻找规律

  1. 无论是左移还是右移,命令都从左到右开始;
  2. 第一个组合的输出将用作下一个操作的左操作符;
  3. 括号按照预期改变了操作顺序;
  4. __rshift__和__lshift__操作仅在实现它的类上调用;
  5. 如果其中一个类没有实现__rshift__和_lshift_,则调用__rrshift__或__rlshift__操作,自己作为self。

有什么Pythonic之处呢?

假设有以下一个业务场景,在调用一个业务处理函数之前需要等待前面n个业务处理函数处理完毕后才能执行, 比如坐地铁的流程:

乘坐地铁(列车进站(到站台候车(刷卡进站(通过安检(前往地铁站())))))
复制代码

如果是这样的话,一层嵌套一层,是不是很乱的感觉,有没有什么更形象的方法实现呢?
真有,Python就是这么简洁,下一篇就使用”>>”形象使用下面的形式的实现上面的业务流程,就很形象明了:

前往地铁站 >> 通过安检 >> 刷卡进站 >> 到站台候车 >> 列车进站 >> 乘坐地铁
复制代码

如何实现呢?且听下回分解
可以先提供个思路,”>>” Combine Recursion

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享