admin管理员组

文章数量:1794759

python 入门]手动编写进制转换程序(并转exe文件)

python 入门]手动编写进制转换程序(并转exe文件)

进制转换原理

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∑m​xm−n+1​dm−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

本文标签: 写进转换程序入门文件并转