#可以输入十进制
s = 898
num = to_decimalism(s)
print(f"\n\n{color(' 进制转换 ', 'green', 'black', 'light'):_^52}\
\n\n\n{color(s, 'green'):>24},\
转换十进制:{color(num, 'green')}")
if num is not None:
input(f"\n {'int(s) 验算:':>20}\
{color(int(s), 'green')}\n\
\n\n{color(' The end ', 'green', 'black', 'lobright'):_^56}\
\n")
#二进制试炼
s = '0B01011'
num = to_decimalism(s)
print(f"\n\n{color(' 进制转换 ', 'green', 'black', 'light'):_^52}\
\n\n\n{color(s, 'green'):>24},\
转换十进制:{color(num, 'green')}")
if num is not None:
input(f"\n {'int(s) 验算:':>20}\
{color(int(s, 2), 'green')}\n\
\n\n{color(' The end ', 'green', 'black', 'lobright'):_^56}\
\n")
#八进制试炼
s = '0O07011'
num = to_decimalism(s)
print(f"\n\n{color(' 进制转换 ', 'green', 'black', 'light'):_^52}\
\n\n\n{color(s, 'green'):>24},\
转换十进制:{color(num, 'green')}")
if num is not None:
input(f"\n {'int(s) 验算:':>20}\
{color(int(s, 8), 'green')}\n\
\n\n{color(' The end ', 'green', 'black', 'lobright'):_^56}\
\n")
#十六进制试炼
s = '0x0F11'
num = to_decimalism(s)
print(f"\n\n{color(' 进制转换 ', 'green', 'black', 'light'):_^52}\
\n\n\n{color(s, 'green'):>24},\
转换十进制:{color(num, 'green')}")
if num is not None:
input(f"\n {'int(s) 验算:':>20}\
{color(int(s, 16), 'green')}\n\
\n\n{color(' The end ', 'green', 'black', 'lobright'):_^56}\
\n")
for i in range(999, 1000):
print(f"\n整数{color(str(i), 'cyan', 'black', 'light'):16}:\
\n0b{color(bin(i)[2:].zfill(8), 'green')},\
to_decimalism转换{color(str(to_decimalism(bin(i))), 'green'):16},\
\n0o{color(oct(i)[2:].zfill(8),'green')},\
to_decimalism转换{color(str(to_decimalism(oct(i))), 'green'):16},\
\n0x{color(hex(i)[2:].zfill(8),'green')},\
to_decimalism转换{color(str(to_decimalism(hex(i))), 'green'):16}。\
")
print('\n'*3)
nums_0b = '0b111111111111111111111111111111', \
'0b05011', \
'0c01011', \
'0b011111111111111111111111111111011', \
'0b01011', \
'0b110011'
for k, num_0b in enumerate(nums_0b):
print(f'{k + 1}. {color(num_0b, "green")} 转十进制:\
{color(to_decimalism(num_0b), "cyan")}')
print(f"\n\n{color(1, 'gray', 'black', 'lobright')}\
{' Cut-off rule ':.^42}{color(0)}\n")
print(f"\n用 {color('int 函数', 'green', 'black', 'light')}检验:\n")
for k, num in enumerate(nums_0b):
try:
print(f'{k + 1}. 二进制数 {color(num_0b, "green")} 转十进制:\
{color(int(num, 2), "cyan")}')
except:
error(f'二进制数 {color(num_0b, "red")}错误')
for i in ('B', 'O', 'X', 'A', 'B', 'C', 'D', 'E', 'F'):
s = s.replace(i, i.lower())
def isinput(s, lis):
'''输入判定:
判定s的字符元素都在lis'''
for i in lis: #遍历进制构成列表。
s = s.replace(i, '') #依次清除构成列表的字符。
return s #返回判定后的列表
def del_zero(s):
'''去除前导零'''
if s[0] != '0': #没有前导零,
return s #返回传入字符串。
for k, i in enumerate(s): #遍历枚举字符串,方便使用下标。
if i != '0': #前导不为0,
return s[k:] #返回当前往后的字符串。
if b == 'b': #二进制字符串处理分支。
if isinput(s[2:], ['1', '0']) != '': #判定二进制字符串结构是否合规。
error(f'二进制数结构{color(s, "red")}') #异常报错。
return #返回空。
if len(del_zero(s[2:])) > 32: #大于32位报错。
error(f'二进制数 {color(s, "red")} 大于32位') #异常报错。
return #返回空。
return to_decimal((s[2:]), 2) #返回转换十进制数。
elif b == 'o': #八进制字符串处理分支。
rule = [
'0', '1', '2', '3',
'4', '5', '6', '7'
] #十六进制码表
if isinput(s[2:], rule) != '': #判定八进制字符串结构是否合规。
error(f'八进制数 {color(s, "red")} :') #判定二进制字符串结构是否合规。
return #返回空。
return to_decimal(del_zero(s[2:]), 8) #返回转换十进制数。
elif b == 'x': #十六进制字符串处理分支。
rule = [
'0', '1', '2', '3',
'4', '5', '6', '7',
'8', '9', 'a', 'b',
'c', 'd', 'e', 'f',
] #十六进制码表
if isinput(s[2:], rule) != '': #判定十六进制字符串结构是否合规。
error(f'十六进制数 {color(s, "red")} :') #报错打印。
return #返回空。
return to_decimal(del_zero(s[2:]), 16) #返回转换十进制数。
def to_decimal(s, n):
'''进制转换'''
if s == '': #传入字符为空,
return 0 #返回 0 。
nums_dict = {
'0': 0, '1': 1, '2': 2,
'3': 3, '4': 4, '5': 5,
'6': 6, '7': 7, '8': 8,
'9': 9, 'a': 10, 'b': 11,
'c': 12, 'd': 13, 'e': 14,
'f': 15,
} #转换所需字符字典。
tmp = [nums_dict.get(i)
for i in list(s)] #列表解析字符对应值。
num, k = tmp.pop(), 1 #初始返回转换值为字符最后一位对应值,进制转换幂为 1 。
while tmp != []: #要转换的数位列表弹空结束循环。
num += tmp.pop()*n**k #累加各数位的值。
k += 1 #数位向前进一。
return num #返回数位字符串的十进制数值。
#!/usr/bin/env python # Linux 脚本解释器路径指定注释。
# coding: utf-8 #本脚本编码说明。
from python_color import color #用 \033[m “自制”输出色彩控制模块加载。
'''
作者:梦幻精灵_cq
QQ:479469838(八爪章鱼)
'''
def error(s): input(f"\n\n{s}:\
{color('Is Error!', 'red', 'black','light')} \
{color('Try Again!', 'green')}\
\n{'':.^42}\n") #异常捕获提示字符打印。
def del_zero(s):
'''去除前导零'''
if s[0] != '0': #没有前导零,
return s #返回传入字符串。
for k, i in enumerate(s): #遍历枚举字符串,方便使用下标。
if i != '0': #前导不为0,
return s[k:] #返回当前往后的字符串。
def to_decimal(s, n):
'''进制转换'''
if s == '': #传入字符为空,
return 0 #返回 0 。
nums_dict = {
'0': 0, '1': 1, '2': 2,
'3': 3, '4': 4, '5': 5,
'6': 6, '7': 7, '8': 8,
'9': 9, 'a': 10, 'b': 11,
'c': 12, 'd': 13, 'e': 14,
'f': 15,
} #转换所需字符字典。
tmp = [nums_dict.get(i)
for i in list(s)] #列表解析字符对应值。
num, k = tmp.pop(), 1 #初始返回转换值为字符最后一位对应值,进制转换幂为 1 。
while tmp != []: #要转换的数位列表弹空结束循环。
num += tmp.pop()*n**k #累加各数位的值。
k += 1 #数位向前进一。
return num #返回数位字符串的十进制数值。
def isinput(s, lis):
'''输入判定:
判定s的字符元素都在lis'''
for i in lis: #遍历进制构成列表。
s = s.replace(i, '') #依次清除构成列表的字符。
return s #返回判定后的列表
def to_decimalism(s):
'''进制转换 >> 十进制'''
s = str(s) #转输入为字符串。\
# (防输入十进制数字出错。本来是字符串再用 str() 也无仿。)
# 反斜杠续行,对 # 注释语句无效,折行也得 # 打头。
if s.isdigit(): #是纯数字字符串,
return del_zero(s) #去除前导零返回。
else: #不为纯数字,大写英文字母转小写,便于后续操作。
for i in ('B', 'O', 'X',
'A', 'B', 'C', 'D', 'E', 'F'):
s = s.replace(i, i.lower())
b = s[1]
if b not in ('b', 'o', 'x') \
and not b.isdigit(): #不是纯数字,进制符不对报错。
#(本 if 可与上条 if 写在一起,但会增加一层缩进。个人看着不爽。)
error(s) #调用报错信息打印。
else: #这句可以不要,把后面三个 if 向前推一个缩进。
#那样,结构性稍显不明析。
if b == 'b': #二进制字符串处理分支。
if isinput(s[2:], ['1', '0']) != '': #判定二进制字符串结构是否合规。
error(f'二进制数结构{color(s, "red")}') #异常报错。
return #返回空。
if len(del_zero(s[2:])) > 32: #大于32位报错。
error(f'二进制数 {color(s, "red")} 大于32位') #异常报错。
return #返回空。
return to_decimal((s[2:]), 2) #返回转换十进制数。
elif b == 'o': #八进制字符串处理分支。
rule = [
'0', '1', '2', '3',
'4', '5', '6', '7'
] #十六进制码表
if isinput(s[2:], rule) != '': #判定八进制字符串结构是否合规。
error(f'八进制数 {color(s, "red")} :') #判定二进制字符串结构是否合规。
return #返回空。
return to_decimal(del_zero(s[2:]), 8) #返回转换十进制数。
elif b == 'x': #十六进制字符串处理分支。
rule = [
'0', '1', '2', '3',
'4', '5', '6', '7',
'8', '9', 'a', 'b',
'c', 'd', 'e', 'f',
] #十六进制码表
if isinput(s[2:], rule) != '': #判定十六进制字符串结构是否合规。
error(f'十六进制数 {color(s, "red")} :') #报错打印。
return #返回空。
return to_decimal(del_zero(s[2:]), 16) #返回转换十进制数。
上一篇: 练习:找寻完数
下一篇:
来源:老齐教室