一、python中的Ellipsis对象

  Ellipsis对象: 在python代码中通常写作 … ,没错,就是三个点,他的中文解释为:省略,该对象的bool值为 True。

  很多人肯定特别关心的一个问题,那它有什么用途呢

  用途一:省略代码,作用类似于pass的一种替代方案,这是python的’TBD’(未确定内容)。 

def fun(): 
    …

  用途二:循环数据结构, 一个复合对象包含指向自身的引用。

示例:

L = [1,2,3]
L.append(L)
print(L)      # 输出为[1,2,3,[…]]

是不是瞬间感觉高大上。

  用途三:用来模拟一些情况,使结果看起来更友好,如等差数列,numpy。

高端大气上档次的等差数列生成器,演示结果如下:

简单粗暴地实现:

class ProgressionMaker(object):

    def __getitem__(self, key):
        if isinstance(key, tuple) and len(key) == 4 and key[2] is Ellipsis:
            return list(range(key[0], key[-1] + 1, key[1] - key[0]))


maker = ProgressionMaker()

pagm = maker[1, 2, ..., 9]
print(pagm)  # [1, 2, 3, 4, 5, 6, 7, 8, 9]

pagm2 = maker[6, 13, ..., 34]
print(pagm2)  # [6, 13, 20, 27, 34]

至于错误处理、支持更多参数(例如 maker[3, 7, 11, ..., 31, ..., 55, 59] 之类的),或是同时支持等比数列之类的我就不管了,有兴趣的可以自己实现。
虽然看上去很厉害的样子,但其实没什么技术含量……

先来介绍一下如何处理这种语法,其实只用到 object.__getitem__ 方法而已:
class Test(object):
    def __getitem__(self, key):
        print(key)


test = Test()
test[1]                   # 1
test[:]                   # slice(None, None, None)
test[1:9]                 # slice(1, 9, None)
test[1:3:5]               # slice(1, 3, 5)
test[1, 5]                # (1, 5)
test[1, 2:3, :4:, ::]     # (1, slice(2, 3, None), slice(None, 4, None), slice(None, None, None))
test[1, 2, ..., 9, 10]    # (1, 2, Ellipsis, 9, 10)

至于 python库numpy, 其中提供了函数linspace和logspace函数用于生产等差数列和等比数列。

 详情可以参考我之前写的一篇博客:最直白、最易懂的话带你认识和学会---数据分析基础包之numpy的使用

 

补充说明:...在python中居然是个常量

print(...)      # Ellipsis

 

二、位运算符

>> 和 <<都是位运算,对二进制数进行移位操作。

<< 是左移,末位补0,类比十进制数在末尾添0相当于原数乘以10,x<<1是将x的二进制表示左移一位,相当于原数x乘2。比如整数4在二进制下是100,4<<1左移1位变成1000(二进制),结果是8。

>>是右移,右移1位相当于除以2。

而>>=和<<=,就是对变量进行位运算移位之后的结果再赋值给原来的变量,可以类比赋值运算符+=和-=可以理解。

比如x>>=2, 就是把变量x右移2位,再保留x操作后的值。

print(2>>1)  #1
print(2<<1)  #4
print(2>>2)  #0
print(100>>2)  #25
print(100<<2)   #400
print(1>>1)    #0

 补充说明:

  2进制是以0b开头的: 例如: 0b11 则表示十进制的3

  8进制是以0o开头的: 例如: 0o11则表示十进制的9 

  16进制是以0x开头的: 例如: 0x11则表示十进制的17

print(0b11)  #3
print(0o12)  #10
print(0x23)  #35

按位运算符是把数字看作二进制来进行计算的。Python中的按位运算法则如下:

下表中变量 a 为 60,b 为 13,二进制格式如下:

a = 0011 1100

b = 0000 1101

a&b = 0000 1100

a|b = 0011 1101

a^b = 0011 0001

~a  = 1100 0011

 

运算符 描述 实例
& 按位与运算符:参与运算的两个值,如果两个相应位都为1,则该位的结果为1,否则为0 (a & b) 输出结果 12 ,二进制解释: 0000 1100
| 按位或运算符:只要对应的二个二进位有一个为1时,结果位就为1。 (a | b) 输出结果 61 ,二进制解释: 0011 1101
^ 按位异或运算符:当两对应的二进位相异时,结果为1 (a ^ b) 输出结果 49 ,二进制解释: 0011 0001
~ 按位取反运算符:对数据的每个二进制位取反,即把1变为0,把0变为1 。~x 类似于 -x-1 (~a ) 输出结果 -61 ,二进制解释: 1100 0011,在一个有符号二进制数的补码形式。
<< 左移动运算符:运算数的各二进位全部左移若干位,由 << 右边的数字指定了移动的位数,高位丢弃,低位补0。 a << 2 输出结果 240 ,二进制解释: 1111 0000
>> 右移动运算符:把">>"左边的运算数的各二进位全部右移若干位,>> 右边的数字指定了移动的位数 a >> 2 输出结果 15 ,二进制解释: 0000 1111

以下实例演示了Python所有位运算符的操作:

#!/usr/bin/python
# -*- coding: UTF-8 -*-
 
a = 60            # 60 = 0011 1100 
b = 13            # 13 = 0000 1101 
c = 0
 
c = a & b;        # 12 = 0000 1100
print "1 - c 的值为:", c
 
c = a | b;        # 61 = 0011 1101 
print "2 - c 的值为:", c
 
c = a ^ b;        # 49 = 0011 0001
print "3 - c 的值为:", c
 
c = ~a;           # -61 = 1100 0011
print "4 - c 的值为:", c
 
c = a << 2;       # 240 = 1111 0000
print "5 - c 的值为:", c
 
c = a >> 2;       # 15 = 0000 1111
print "6 - c 的值为:", c

以上实例输出结果:

1 - c 的值为: 12
2 - c 的值为: 61
3 - c 的值为: 49
4 - c 的值为: -61
5 - c 的值为: 240
6 - c 的值为: 15
View Code

相关文章: