《Python进阶系列》五:Python中的进制转换

今天闲下来刷刷题,偶然刷到了Python的进制转换,就浅浅的学一学,特地记录如下。

题目链接:NP9 十六进制数字的大小

十进制是我们常用的数字形式,但机器使用的却是二进制,八进制,十六进制之类的,所以进制转换是基础要求,很多编程语言提供的有进制转换的方法,下面来扒一扒利用Python如何进行进制转换~

这里先说一个知识点:进制前面一般会有一个符号,这个符号表明了到底是多少进制。比如:

  • 二进制前面的符号是0b
  • 八进制前面的符号是0o
  • 十六进制前面的符号是0x
  • 十进制前面一般没有符号。

int()bin()hex()进制转换

[n]进制转换为十进制

Python里面转换为十进制的函数是int,这个函数相信用Python的都应该用过,可以将浮点数转换成整数。这里提到了,多说一句,要注意int函数是强行舍掉小数部分~看下面的例子:

>>> int(3.9)
3
>>> int(-3.9)
-3

要注意和floor()函数区分,floor()函数是向下取整,其余的函数就不多说了。

>>> import numpy as np
>>> np.floor(3.9)
3.0
>>> np.floor(-3.9)
-4.0

回到今天的主题,int函数可以用于进制转换,其第一个参数是一个字符串,第二个参数是字符串的进制(默认是十进制)。

  1. 二进制转十进制
>>> num = "10010010"
>>> int(num)  # 默认是十进制
10010010
>>> int(num, 2)
146
  1. 八进制转十进制
>>> int("7", 8)
7
>>> int("17", 8)
15
>>> int("33", 8)
27
  1. 十六进制转十进制
>>> int("A", 16)
10
>>> int("AB", 16)
171

十进制转十六进制

hex()函数用于将10进制整数转换成16进制,返回16进制数以字符串形式表示。0x是十六进制的标志。

>>> hex(10)
'0xa'
>>> hex(13)
'0xd'
>>> hex(255)
'0xff'
>>> type(hex(255))
<class 'str'>

十进制转二进制

bin()函数返回一个整数 int 或者长整数 long int 的二进制表示。故用bin()就可实现该需求,其用法和hex()函数类似,0b是二进制的标志。

>>> bin(1023)    #十进制转换为二进制
'0b1111111111'
>>> bin(0o11)    #八进制转换为二进制
'0b1001
>>> bin(0xa1)    #十六进制转换为二进制
'0b10100001'

十进制转八进制

oct()函数可以将任何进制的数变成八进制0o是八进制的标志。

>>> oct(0b11)    #二进制转换为八进制
'0o3'
>>> oct(0o77)    #八进制转换为八进制
'0o77'
>>> oct(505)    #十进制转换为八进制
'0o62'
>>> oct(0xab)    #十六进制转换为八进制
'0o253'

如果是二进制转十六进制,可以先转十进制再转十六进制,其它的也是类似的。

format()进制转换

format()函数是可以实现进制转换的,主要用法如下:

format(x,'b')         #将x转换为二进制

format(x,'o')         #将x转换为八进制

format(x,'d')         #将x转换为十进制

format(x,'x')         #将x转换为十六进制

举一点例子:

>>> format(0o31, 'b')   # 转换为二进制
'11001'
>>> format(85, 'o')     # 转换为八进制
'125'
>>> format(88, 'x')     # 转换为十六进制
'58'
>>> format(0b101011, 'd')  # 转换为六进制
'43'

自定义进制转换

是不是觉得调用内置函数不够酷?亦或者忘了内置进制转换函数怎么办?下面来试试自定义的进制转换函数!

自定义:[n]进制转十进制

def n_to_ten(num, n):
    res = 0
    num = list(reversed(str(num)))
    for i in range(len(num)):
        res += int(num[i]) * (n ** i)
    return res

测试:

>>> n_to_ten(435)
1077

自定义:十进制转换成[n]进制

def ten_to_seven(num, k=2):
    s = ""  # 记录余数
    
    if num == 0:  # 先判断是否为0,如果为0,直接返回0
        return 0
    elif num > 0:  # 判断正负性,如果为正数,不记录
        a = ''
    else:  # 如果为负数,记录为负号
        a = '-'
        
    while abs(num):  # 当num为0时,循环结束
        # 倒叙记录余数,注意,是倒叙记录
        s, num = str(abs(num) % k) + s, abs(num) // k  # num整除除进制数
        
    return int(a + s)  # 先将符号位和余数进行合并,再转换为int类型

测试:

>>> ten_to_seven(10, 2)
1010
>>> ten_to_seven(10, 8)
12
>>> ten_to_seven(10, 16)
10

需要注意,还是应该了解一下进制之间是如何转换的,不能盲目的用轮子,还是得适当的学会造轮子~

\quad
\quad
\quad

THE END

你可能感兴趣的:(Python进阶,numpy,python,进制转换)