鱼C论坛

 找回密码
 立即注册
查看: 4887|回复: 6

[已解决]编写一个十进制转换为二进制的函数,采用“除二取余”的方法,结果与调用BIN()函数...

[复制链接]
发表于 2017-7-30 21:48:50 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
def Dec2Bin(dec):
    temp = []
    result = ''
   
    while dec:
        quo = dec % 2
        dec = dec // 2
        temp.append(quo)

    while temp:
        result += str(temp.pop())

   
    return result

print(Dec2Bin(62))
以上是鱼C论坛上的标准答案,其中黄色标示的这两句我一直想不明白,比如,while 后面返回的值是真,就一直循环,返回假,就跳出循环,那么上述这个例子什么时候会返回假呢?还有,为什么temp.pop()前面一定要加str呢,貌似如果不加,它返回的值的类型是整型,而不是字符串,这样会对程序造成怎样的影响?
最佳答案
2017-7-30 22:36:25
本帖最后由 status 于 2017-7-30 22:39 编辑

先看这个代码,实例化传入4:
  1. def Dec2Bin(dec):
  2.     temp = []
  3.     result = ''
  4.     while dec:
  5.         quo = dec % 2
  6.         print('quo',quo)
  7.         dec = dec // 2
  8.         print('dec',dec)
  9.         temp.append(quo)
  10.         print('temp',temp)

  11.     while temp:
  12.         result += str(temp.pop())
  13.    
  14.     return result
  15. print(Dec2Bin(4))
复制代码

输出结果为:
  1. quo 0
  2. dec 2
  3. temp [0]
  4. quo 0
  5. dec 1
  6. temp [0, 0]
  7. quo 1
  8. dec 0
  9. temp [0, 0, 1]
  10. 100
复制代码

第一个问题,while什么时候会为假而停止
第一个while,条件是dec,传入4,所以dec等于4,然后一直被2除,取整除(//)依次得2,2,0。quo取余除依次得0,0,2并添加进temp,所以temp为[0,0,1],然后最后dec等于0时则为假退出,进入下面的程序。
第二个while,条件是temp,因为上面第一个循环得temp[0,0,1],列表的pop()方法是如果不传入索引值,默认则从最后开始删除列表元素并返回,所以,取三次去完为空时,while也为假了,结束循环。
第二个问题:为什么要加str()
str()是工厂函数,把把其对象转为字符串的,由于函数最开始给定result为空字符串,temp里是int整数型,字符串和整数相加是会报错的:
  1. Traceback (most recent call last):
  2.   File "C:\Users\Administrator\Desktop\1.py", line 16, in <module>
  3.     print(Dec2Bin(4))
  4.   File "C:\Users\Administrator\Desktop\1.py", line 13, in Dec2Bin
  5.     result +=(temp.pop())
  6. TypeError: must be str, not int
复制代码

当然你可以说result可以定义为列表,像这样(片段代码):
  1. result = []
  2.     while temp:
  3.         result.append(temp.pop())
复制代码

结果为:
  1. [1, 0, 0]
复制代码

但是。需要知道的是,二进制是怎么书写的,见到的都是010,101,001之类的,并不是这个结果里的[1,0,0],如果做大型操作,这个结果还要再次进行修饰才能表达二进制。所以使用字符串表示,输出时是最符合二进制写法的(没有其他符号,只有引号作为字符串身份,当直接一般输出时是不带引号的)。所以需要转成字符串来表示最终结果。
我不知道我说清楚没有,希望你能理解
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2017-7-30 21:56:32 | 显示全部楼层
先说while dec:循环:dec是一个整数,每次//2,最后会为0,这时就结束循环。
result希望得到一个字符串,所以用str把列表中每个整数变为字符串,并拼接到一起。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-7-30 22:36:25 | 显示全部楼层    本楼为最佳答案   
本帖最后由 status 于 2017-7-30 22:39 编辑

先看这个代码,实例化传入4:
  1. def Dec2Bin(dec):
  2.     temp = []
  3.     result = ''
  4.     while dec:
  5.         quo = dec % 2
  6.         print('quo',quo)
  7.         dec = dec // 2
  8.         print('dec',dec)
  9.         temp.append(quo)
  10.         print('temp',temp)

  11.     while temp:
  12.         result += str(temp.pop())
  13.    
  14.     return result
  15. print(Dec2Bin(4))
复制代码

输出结果为:
  1. quo 0
  2. dec 2
  3. temp [0]
  4. quo 0
  5. dec 1
  6. temp [0, 0]
  7. quo 1
  8. dec 0
  9. temp [0, 0, 1]
  10. 100
复制代码

第一个问题,while什么时候会为假而停止
第一个while,条件是dec,传入4,所以dec等于4,然后一直被2除,取整除(//)依次得2,2,0。quo取余除依次得0,0,2并添加进temp,所以temp为[0,0,1],然后最后dec等于0时则为假退出,进入下面的程序。
第二个while,条件是temp,因为上面第一个循环得temp[0,0,1],列表的pop()方法是如果不传入索引值,默认则从最后开始删除列表元素并返回,所以,取三次去完为空时,while也为假了,结束循环。
第二个问题:为什么要加str()
str()是工厂函数,把把其对象转为字符串的,由于函数最开始给定result为空字符串,temp里是int整数型,字符串和整数相加是会报错的:
  1. Traceback (most recent call last):
  2.   File "C:\Users\Administrator\Desktop\1.py", line 16, in <module>
  3.     print(Dec2Bin(4))
  4.   File "C:\Users\Administrator\Desktop\1.py", line 13, in Dec2Bin
  5.     result +=(temp.pop())
  6. TypeError: must be str, not int
复制代码

当然你可以说result可以定义为列表,像这样(片段代码):
  1. result = []
  2.     while temp:
  3.         result.append(temp.pop())
复制代码

结果为:
  1. [1, 0, 0]
复制代码

但是。需要知道的是,二进制是怎么书写的,见到的都是010,101,001之类的,并不是这个结果里的[1,0,0],如果做大型操作,这个结果还要再次进行修饰才能表达二进制。所以使用字符串表示,输出时是最符合二进制写法的(没有其他符号,只有引号作为字符串身份,当直接一般输出时是不带引号的)。所以需要转成字符串来表示最终结果。
我不知道我说清楚没有,希望你能理解
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 4 反对 0

使用道具 举报

发表于 2017-7-30 22:41:17 | 显示全部楼层
本帖最后由 ba21 于 2017-7-30 22:43 编辑


转成str,是因为要用到字符串的连接,如果不转就成了加法运算了
2017-07-30_223933.png
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-8-11 14:35:38 | 显示全部楼层
status 发表于 2017-7-30 22:36
先看这个代码,实例化传入4:

输出结果为:

非常感谢!现在我能明白了,谢谢您的答案。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-8-11 14:36:29 | 显示全部楼层
冬雪雪冬 发表于 2017-7-30 21:56
先说while dec:循环:dec是一个整数,每次//2,最后会为0,这时就结束循环。
result希望得到一个字符串, ...

谢谢,我先在稍微明白点了。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-8-11 14:37:23 | 显示全部楼层
ba21 发表于 2017-7-30 22:41
转成str,是因为要用到字符串的连接,如果不转就成了加法运算了

明白了,谢谢,图文并茂
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2026-3-1 04:03

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表