强基初中数学&学Python——第197课 Python内置函数详解数学篇之五:bin/oct/hex


  bin()函数 

  把一个整数转为为符合二进制字面值规范(“0b”开头的“0”和“1”的序列)的字符串。必选、按位参数一个。

  调用方式1:整数参数,bin(intNum)。

>>>bin(12345)

'0b11000000111001'

>>>bin(-12345)

'-0b11000000111001'

>>>bin(12.345)

Traceback (most recent call last):

  File "<stdin>", line 1, in <module>

TypeError: 'float' object cannot be interpreted as an integer

  调用方式2:定义了__index__()方法的对象参数,bin(obj)。

>>>class BTest:

...     def __index__(self):

...         return 123

...

>>>bin(BTest())

'0b1111011'

>>>class BNTest:

...     pass

...

>>>bin(BNTest())

Traceback (most recent call last):

  File "<stdin>", line 1, in <module>

TypeError: 'BNTest' object cannot be interpreted as an integer

  若要控制是否显示前缀“0b”,可以采用以下两种方案:

>>>format(123, '#b'), format(123, 'b')

('0b1111011', '1111011')

>>>f'{123:#b}', f'{123:b}'

('0b1111011', '1111011')

  更多有关格式化打印的信息,请看format()内置函数。

 

  oct()函数 

  把一个整数转为为符合八进制字面值规范(“0o”开头的“0”到“7”的系列)的字符串。必选、按位参数一个。

  调用方式1:整数参数,oct(intNum)。

>>>oct(12345)

'0o30071'

>>>oct(-12345)

'-0o30071'

>>>oct(12.345)

Traceback (most recent call last):

  File "<stdin>", line 1, in <module>

TypeError: 'float' object cannot be interpreted as an integer

  调用方式2:定义了__index__()方法的对象参数,oct(obj)。

>>>class OTest:

...     def __index__(self):

...         return 123

...

>>>oct(OTest())

'0o173'

>>>class ONTest:

...     pass

...

>>>oct(ONTest())

Traceback (most recent call last):

  File "<stdin>", line 1, in <module>

TypeError: 'ONTest' object cannot be interpreted as an integer

  若要控制是否显示前缀“0o”,可以采用以下面的方案:

>>>'%#o' % 12345, '%o' % 12345

('0o30071', '30071')

>>>format(12345, '#o'), format(12345, 'o')

('0o30071', '30071')

>>>f'{12345:#o}', f'{12345:o}'

('0o30071', '30071')

  更多有关格式化打印的信息,请看format()内置函数。

 

  hex()函数 

  把一个整数转为为符合十六进制字面值规范(“0x”开头的“0”到“9”和“a”到“f”的系列)的字符串。必选、按位参数一个。

  调用方式1:整数参数,hex(intNum)。

>>>hex(12345)

'0x3039'

>>>hex(-12345)

'-0x3039'

>>>hex(0o30071)

'0x3039'

>>>hex(0x3039)

'0x3039'

>>>hex(0b11000000111001)

'0x3039'

>>>hex(12.345)

Traceback (most recent call last):

  File "<stdin>", line 1, in <module>

TypeError: 'float' object cannot be interpreted as an integer

注:如果要转换浮点数为十六进制字符串形式,请使用 float.hex() 方法。

  调用方式2:定义了__index__()方法的对象参数,hex(obj)。

>>>class HTest:

...     def __index__(self):

...         return 123

...

>>>hex(HTest())

'0x7b'

>>>class HNTest:

...     pass

...

>>>hex(HNTest())

Traceback (most recent call last):

  File "<stdin>", line 1, in <module>

TypeError: 'HNTest' object cannot be interpreted as an integer

  若要控制是否显示前缀“0x”和大小写,可以采用以下面的方案:

>>>'%#x' % 255, '%x' % 255, '%X' % 255, '%#X' % 255

('0xff', 'ff', 'FF', '0XFF')

>>>format(255,'#x'),format(255,'x'),format(255,'X'),format(255,'#X')

('0xff', 'ff', 'FF', '0XFF')

>>> f'{255:#x}', f'{255:x}', f'{255:X}', f'{255:#X}'

('0xff', 'ff', 'FF', '0XFF')

  更多有关格式化打印的信息,请看format()内置函数。

 

  float.hex()方法

  把浮点数转换为浮点数十六进制字符串

>>>float.hex(3740.0)

'0x1.d380000000000p+11'

>>>f=3740.0

>>>f.hex()

'0x1.d380000000000p+11'

>>>f.hex(3740.0)

Traceback (most recent call last):

  File "<stdin>", line 1, in <module>

TypeError: float.hex() takes no arguments (1 given)

  注:float.hex()是对象方法。

  classmethod float.fromhex()方法  

  浮点数十六进制字符串转换为浮点数

>>>float.fromhex('0x1.d380000000000p+11')

3740.0

>>>f=0.0

>>>f.fromhex('0x1.d380000000000p+11')

3740.0

  注:float.fromhex()是类方法classmethod 

  为了区分类方法和对象方法在定义和使用上的不同,编写下面的程序(文本代码附录1):

 

  运行结果:

 

  浮点数十六进制字符串:

  尾数部分除了有一个小数点外,其它与整数的十六进制相同;如果有指数部分,前面使用的是“p”而不是“e”,是以2为底的十进制整数。例如,浮点数十六进制字符串 0x3.a7p10 表示浮点数 (3 + 10./16 + 7./16**2) * 2.0**10 3740.0

>>>float.fromhex('0x3.a7p10')

3740.0

 

  1 把5进制整数1043120101转为二进制、八进制、十进制、十六进制字符串。

  程序代码(文本代码附录2)

 

  运行结果:

 

  2  把十六进制浮点数0xa.F8BceFp5转为十进制数,打印出来,然后再转回十六进制打印出来。 

  程序代码(文本代码附录3)

 

  运行结果:

 

  练习题:

1、把7进制数5063140304转为二进制、八进制、十进制、十六进制字符串。

2、把十六进制浮点数0x8.aCB2f1Dp6转为十进制数,打印出来,然后再转回十六进制打印出来。

 

附录1:

#classmethod测试

class CMTest:

    #类方法

    @classmethod

    def ct(cls,s):

        '''@cls类本身@s其他参数'''

        print(cls)

        print(s)

    #对象方法

    def ot(self,s):

        '''@self对象本身@s其他参数'''

        print(self)

        print(s)

CMTest.ct("类直接调用类方法,自动传入类本身。")

t=CMTest()

t.ct("对象调用类方法,自动传入对象所属类。")

CMTest.ot(t, "类直接调用对象方法,需手动传入一个对象。")

t.ot("对象调用对象方法,自动传入对象本身。")

附录2:

#进位制字符串输出

_5Str="1043120101"

num = int(_5Str,5)

#二进制

print(bin(num))

#八进制

print(oct(num))

#十进制

print(num)

#十六进制

print(hex(num))

附录3:

#进位制字符串输出

_16Str="0xa.F8BceFp5"

#转为十进制

num = float.fromhex(_16Str)

#十进制

print(num)

#十六进制

print(num.hex())