进制转换原理
1.1 十进制转其他进制
这里以十进制转二进制转换说明十进制转其他进制的原理。所谓十进制就是满十进一,二进制就是满二进一。所以十进制转低进制就需要用到除法,十进制数除以2取得的余数就是二进制倒数第一位数,得到的商继续除以2得到二进制倒数第二位。以此类推,直到得到的商为0便停止计算。下面以十进制数‘10’为例,将其转换为二进制(以下都规定最左边为第一位):
10÷2=5…0 所以0为二进制倒数第一位
5÷2=2…1 所以1为二进制倒数第二位
2÷2=1…0 所以0为二进制倒数第三位
1÷2=0…1 所以1为二进制倒数第四位
综上,十进制‘10’对应二进制‘1010’。值得一提的时,每次运算结果我们关注的余数,而商只作为判断结束的标准。
1.2 其他进制转十进制
对于其他进制转十进制,其过程与十进制转其他进制相反。所以用到的是乘法,几进制转化就将其进对应的进制数作为幂函数的底数。下面以十六进制‘522’转为十进制为例,用到的公式是:
y
=
∑
n
=
1
m
x
m
−
n
+
1
d
m
−
n
y=\sum_{n=1}^{m}{x_{m-n+1}d^{m-n}}
y=n=1∑mxm−n+1dm−n
式中,n为数值的位置,m为数值位数,x为数值,d为要转换的进制数。应用在十六进制‘522’就等于,
5
×
1
6
2
+
2
×
1
6
1
+
2
×
1
6
0
=
1314
5×16^{2}+2×16^{1}+2×16^{0}=1314
5×162+2×161+2×160=1314
所以,十六进制的‘522’对应十进制的‘1314’。
需要说明的是对于大于十进制中的表示,用a或者A表示10,b或者B表示11,以此类推。
代码实现
2.1算法思想
由于我们日常使用的数大多都是十进制,所以先编写一下其他进制数转十进制的函数,再将十进制转为需要的进制数,即
输入进制数→十进制→输出进制数。
2.2转十进制代码
def to_dec(inputy,inputx):
"""将输入转为十进制数"""
error_out=False #输出标志
output=0
#获取长度
input_str=inputy
length=len(input_str)
if int(inputx) < 2: #小于二进制的情况0
error_out=True
elif int(inputx) < 10: #小于十进制的情况1
if inputy.isalpha() :#纯字母
error_out=True
elif not inputy.isdigit(): #不是数字(数字和字母的组合)
error_out=True
else:
for num in range(length):
if int(inputy[length-num-1]) >= int(inputx):
error_out=True
else:
output += int(input_str[length-num-1])*(int(inputx)**num)
elif int(inputx) == 10: #等于十进制情况2
if inputy.isalpha() :#纯字母
error_out=True
elif not inputy.isdigit(): #不是数字(数字和字母的组合)
error_out=True
else:
output=inputy
elif int(inputx) > 10 : #大于十进制情况3
for num in range(length):
if input_str[length-num-1]=='.': #小数
error_out=True
elif input_str[length-num-1].isalpha():#字母
if int(inputx) < to_num(input_str[length-num-1]): #输入进制是否符合要求
error_out=True
elif input_str[length-num-1]=='a' or input_str[length-num-1]=='A':
output += 10*(int(inputx)**num)
elif input_str[length-num-1]=='b' or input_str[length-num-1]=='B':
output += 11*(int(inputx)**num)
elif input_str[length-num-1]=='c' or input_str[length-num-1]=='C':
output += 12*(int(inputx)**num)
elif input_str[length-num-1]=='d' or input_str[length-num-1]=='D':
output += 13*(int(inputx)**num)
elif input_str[length-num-1]=='e' or input_str[length-num-1]=='E':
output += 14*(int(inputx)**num)
elif input_str[length-num-1]=='f' or input_str[length-num-1]=='F':
output += 15*(int(inputx)**num)
else:
error_out=True
elif not input_str[length-num-1].isalpha(): #数字(不是字母)
output += int(input_str[length-num-1])*(int(inputx)**num)
if error_out:
output='ERROE'
return output
else:
return output
在判断输入是否符合要求的时候,应用的isdigit()函数是判断字符串是否为纯数字和isalpha()函数判断是否为纯字母。如果不符合要求就把‘错误标志位’设置为真,最后输出时通过‘错误标志位’判断。
2.3十进制转其他进制代码
def to_x(inputnum,inputbin,outputbin):
"""任意进制转换"""
output=[]
output_2=''
output_3=''
outputnum=0
error_out=False
if str(to_dec(inputnum,inputbin)).isdigit():#判断是否在转十发生中错误
dec=to_dec(inputnum,inputbin) #得到十进制数
else:
error_out=True
if not error_out:#成功转换十进制
if inputbin==outputbin:
outputnum=inputnum
elif int(outputbin) < 2: #不存在1进制或者小于1进制的情况
error_out=True
elif int(outputbin) < 10: #小于十进制
while dec!=0:
mod=int(dec) % int(outputbin)
output.append(mod)
dec=int(int(dec)/int(outputbin))#整数部分
length=len(output)
for num in range(length):
outputnum += output[length-num-1]*(10**(length-num-1))
if int(outputbin) == 10: #十进制
outputnum=int(dec)
elif int(outputbin) > 10: #大于十进制
if int(outputbin) > 16:
error_out=True
else:
while dec!=0:
mod=int(dec)%int(outputbin)
if mod >=10:
output.append(alpha(mod))
else:
output.append(mod)
dec=int(int(dec)/int(outputbin))#整数部分
#转output为字符串
length=len(output)
for num in range(length):
output_2 += str(output[num])
#正确输出
for num in range(length):
output_3 += output_2[length-num-1]
outputnum=output_3
if error_out:
outputnum='ERROE'
return outputnum
else:
return outputnum
从原理中可以看出,求得的第一个余数实际上是倒数第一位数。所以在输出时按照倒叙正确输出。对于全数字的输出,可以按位乘以相应的10的次方输出。程序中用到的alpha()函数如下,实际上是一组字母对应表,如果想增加进制转换的位数,只需修改这个对应表,并修改进制输出的限制即可。
def alpha(mod):
"""判断大于十进制是否为字母"""
if mod==10:
out='a'
elif mod == 11:
out='b'
elif mod == 12:
out='c'
elif mod == 13:
out='d'
elif mod == 14:
out='e'
elif mod == 15:
out='f'
return out
程序中用到的to_num()函数如下,这是为了考虑在转十进制的‘大于十进制’情况下。当输入的数值的字符为字母时,需要将字母转为数字,再与输入的进制数进行比较,判断是否为正确输入的情况。举个例子,如输入的进制为15进制,输入的数值为字符‘F’,要将其转为2进制,则输出应该为错误输出,而不是‘1111’,因为15进制最大的数值为‘E’。
def to_num(alp):
"""判断输入是否大于输出"""
if alp=='a' or alp=='A':
return 11
elif alp=='b' or alp=='B':
return 12
elif alp=='c' or alp=='C':
return 13
elif alp=='d' or alp=='D':
return 14
elif alp=='e' or alp=='E':
return 15
elif alp=='f' or alp=='F':
return 16
2.4所有程序+结果演示
#进制转换计算器1
import math
def to_dec(inputy,inputx):
"""将输入转为十进制数"""
error_out=False #输出标志
output=0
#获取长度
input_str=inputy
length=len(input_str)
if int(inputx) < 2: #小于二进制的情况0
error_out=True
elif int(inputx) < 10: #小于十进制的情况1
if inputy.isalpha() :#纯字母
error_out=True
elif not inputy.isdigit(): #不是数字(数字和字母的组合)
error_out=True
else:
for num in range(length):
if int(inputy[length-num-1]) >= int(inputx):
error_out=True
else:
output += int(input_str[length-num-1])*(int(inputx)**num)
elif int(inputx) == 10: #等于十进制情况2
if inputy.isalpha() :#纯字母
error_out=True
elif not inputy.isdigit(): #不是数字(数字和字母的组合)
error_out=True
else:
output=inputy
elif int(inputx) > 10 : #大于十进制情况3
for num in range(length):
if input_str[length-num-1]=='.': #小数
error_out=True
elif input_str[length-num-1].isalpha():#字母
if int(inputx) < to_num(input_str[length-num-1]): #输入进制是否符合要求
error_out=True
elif input_str[length-num-1]=='a' or input_str[length-num-1]=='A':
output += 10*(int(inputx)**num)
elif input_str[length-num-1]=='b' or input_str[length-num-1]=='B':
output += 11*(int(inputx)**num)
elif input_str[length-num-1]=='c' or input_str[length-num-1]=='C':
output += 12*(int(inputx)**num)
elif input_str[length-num-1]=='d' or input_str[length-num-1]=='D':
output += 13*(int(inputx)**num)
elif input_str[length-num-1]=='e' or input_str[length-num-1]=='E':
output += 14*(int(inputx)**num)
elif input_str[length-num-1]=='f' or input_str[length-num-1]=='F':
output += 15*(int(inputx)**num)
else:
error_out=True
elif not input_str[length-num-1].isalpha(): #数字(不是字母)
output += int(input_str[length-num-1])*(int(inputx)**num)
if error_out:
output='ERROE'
return output
else:
return output
def alpha(mod):
"""判断大于十进制是否为字母"""
if mod==10:
out='a'
elif mod == 11:
out='b'
elif mod == 12:
out='c'
elif mod == 13:
out='d'
elif mod == 14:
out='e'
elif mod == 15:
out='f'
return out
def to_num(alp):
"""判断输入是否大于输出"""
if alp=='a' or alp=='A':
return 11
elif alp=='b' or alp=='B':
return 12
elif alp=='c' or alp=='C':
return 13
elif alp=='d' or alp=='D':
return 14
elif alp=='e' or alp=='E':
return 15
elif alp=='f' or alp=='F':
return 16
def to_x(inputnum,inputbin,outputbin):
"""任意进制转换"""
output=[]
output_2=''
output_3=''
outputnum=0
error_out=False
if str(to_dec(inputnum,inputbin)).isdigit():#判断是否在转十发生中错误
dec=to_dec(inputnum,inputbin) #得到十进制数
else:
error_out=True
if not error_out:#成功转换十进制
if inputbin==outputbin:
outputnum=inputnum
elif int(outputbin) < 2: #不存在1进制或者小于1进制的情况
error_out=True
elif int(outputbin) < 10: #小于十进制
while dec!=0:
mod=int(dec) % int(outputbin)
output.append(mod)
dec=int(int(dec)/int(outputbin))#整数部分
length=len(output)
for num in range(length):
outputnum += output[length-num-1]*(10**(length-num-1))
if int(outputbin) == 10: #十进制
outputnum=int(dec)
elif int(outputbin) > 10: #大于十进制
if int(outputbin) > 16:
error_out=True
else:
while dec!=0:
mod=int(dec)%int(outputbin)
if mod >=10:
output.append(alpha(mod))
else:
output.append(mod)
dec=int(int(dec)/int(outputbin))#整数部分
#转output为字符串
length=len(output)
for num in range(length):
output_2 += str(output[num])
#正确输出
for num in range(length):
output_3 += output_2[length-num-1]
outputnum=output_3
if error_out:
outputnum='ERROE'
return outputnum
else:
return outputnum
#功能提示
tip1="这是一个进制转化器,目前的版本我只能在小于等于16进制间转化\n"
tip2="您只需输入你要转化的数字和其进制,并且输入您需要转出的进制,便能得到结果\n"
tip3="比如 输入进制数:16,输入数值:ff,输出进制:10\n"
tip4="结果输出:255\n"
tip5=("输入'q'即退出程序,否则继续\n")
print(tip1+tip2+tip3+tip4+tip5)
while True :
inputbin=input('选择输入的进制数:')
if inputbin=='q':
print('ByeBye')
break
inputnum=input('输入的数值:')
if inputnum=='q':
print('ByeBye')
break
outputbin=input('选择输出的进制数:')
if outputbin=='q':
print('ByeBye')
break
print(to_x(inputnum,inputbin,outputbin))
转exe文件
接下来将编写好的.py文件转为.exe文件,可用于其他电脑。
3.1安装pip
点击下方链接下载get-pip.py文件
get-pip.py
点击Installation面板,再点击download get-pip.py.便可下载
安装pip
快捷键win+R打开cmd界面,将路径转为存放上面下载文件的地方,输入指令[ $ python get-pip.py ] 运行文件
3.2安装win32
点击下方链接下载win32文件,注意找对应python版本的win32文件
win32
快捷键win+R打开cmd界面,将路径转为存放上面下载文件的地方,输入pip install pywin32进行安装。
3.3安装pyinstaller
快捷键win+R打开cmd界面,输入pip install PyInstaller进行安装。
3.4cmd常用指令
指令 | 操作 |
---|---|
D: | 转至D盘 |
cd 文件夹名 | 转至相应的文件夹 |
cd… | 返回上一级 |
cd/ | 返回根目录 |
3.5将.py文件转.exe文件
我在D盘建立了一个文件夹[小程序],用来存放exe文件。把编写代码的.py文件放在文件夹中。
打开cmd界面,转至该路径下。
输出pyinstaller -F myfile.py指令便会自动转为exe文件。其中的 myfile是py文件名,如下图。
转换成功,会提示成功信息。再来看看我的D盘的小程序文件夹,变成这样:
exe文件存在[dist]文件夹中,点击exe文件便可直接使用。
结语
最后,分享《Python编程:从入门到实践》的pdf,这本书适合初学python的朋友,需要的自取。
《Python编程:从入门到实践》提取码0ehb