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=1mxmn+1dmn
式中,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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值