鱼C论坛

 找回密码
 立即注册
查看: 2998|回复: 2

关于运用def定义函数时,return返回值的问题

[复制链接]
发表于 2018-3-22 23:42:46 | 显示全部楼层 |阅读模式

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

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

x
我在做模拟 bin() 函数的联系,之前一个函数我已经成功了,但不够简练,我通过递归的方式想做一个优化。但返回值总是None。经验证,是最后的 return 命令出了问题,请高手解答:

代码如下:
  1. def Bin(decimal = 0, binary = '', minus_sign = ''):
  2.     ' binary & minus_sign is for function use.'
  3.     mi = minus_sign
  4.     print('1') #这里是验证1

  5.     if decimal > 0:
  6.         dec = decimal // 2
  7.         if decimal % 2 == 1:
  8.             bi = '1' + binary
  9.         else:
  10.             bi = '0' + binary
  11.         Bin(dec, bi, mi)

  12.     elif decimal < 0:
  13.         mi = '-'
  14.         dec = -decimal
  15.         bi = binary
  16.         Bin(dec, bi, mi)

  17.     else:
  18.         if len(binary) == 0:
  19.             bi = '0b0'
  20.         else:
  21.             bi = mi + '0b' + binary
  22.         print('2') #这里是验证2
  23.         print(bi) #这里是验证3
  24.         return bi

  25. de = Bin(1,'test') #这里将第二个参数,输入内容,作为验证
  26. print(de) #这里是最终验证
复制代码


以上只是模拟 bin() 函数的部分。Bin(0) 完全可以运行,但输入其他的值就不行了。通过插入验证的语句可知,只是在最后 return 时出了问题。运行结果如下:
  1. 1
  2. 1
  3. 2
  4. 0b1test
  5. None
  6. >>>
  7. =============== RESTART: /Users/henry/Lin/Python/L17-3 test.py ===============
  8. 1
  9. 2
  10. 0btest
  11. 0btest
  12. >>>
复制代码


附上我前一版本的代码,运行完全没有问题,return 的运行机理和这里完全一样:
  1. def Bin_base(value_base = 0):
  2.     'value_base > 0'
  3.     if value_base <= 0:
  4.         return False
  5.     else:
  6.         export = value_base //2
  7.         num = value_base % 2
  8.         final_base = str(num)
  9.         return (final_base, export)
  10.    

  11. def Bin(value = 0):
  12.     '此函数用于模拟bin(),value must be int'
  13.     minus_sign = ''
  14.     Final = ''
  15.     if value < 0:
  16.         minus_sign = '-'
  17.         value = -value
  18.         #取保值为正数,方便计算此处的value还要继续后面的计算
  19.     elif value == 0:
  20.         Final = '0b0'
  21.         return Final

  22.     a = Bin_base(value)
  23.         
  24.     while a[1] != 0:
  25.         Final = a[0] + Final
  26.         a = Bin_base(a[1])
  27.     Final = minus_sign + '0b' + a[0] + Final
  28.     return Final

  29. #以上为 bin() 的模拟运算过程

  30. while True:
  31.     #保证输入的为int
  32.     temp = input('请输入一个整数:')

  33.     if temp.isdigit() or temp[0] == '-' and temp[1:].isdigit():
  34.         decimal = int(temp)
  35.         break
  36.     else:
  37.         print('输入有误,', end = '')

  38. binary = Bin(decimal)
  39. print(binary)
  40. #输出求得的二进制数值

  41. check = bin(decimal)
  42. if check == binary :
  43.     print('经验证,答案正确')
  44. else:
  45.     print('答案有误,请检查')
  46. #验证答案是否正确
复制代码


运行结果如下:
  1. 请输入一个整数:-900
  2. -0b1110000100
  3. 经验证,答案正确
  4. >>>
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2018-3-23 08:57:57 | 显示全部楼层
递归的时候前面加个return试试
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-3-24 18:18:46 | 显示全部楼层
本帖最后由 linzhengren90 于 2018-3-24 18:20 编辑
BngThea 发表于 2018-3-23 08:57
递归的时候前面加个return试试


和顺序没有问题,我把之前的内容做成一个闭包,绕过return语句,程序可以正常运行

  1. def Bin(decimal0 = 0):
  2.     'decimal0 must be 0'
  3.     bi = ''
  4.     #由于return的缩进问题,在函数内部定义一个
  5.     def Bin_base(decimal = 0 , binary = '', minus_sign = ''):
  6.         'decimal & binary are for function Bin_base use'

  7.         if decimal > 0:
  8.             dec = decimal // 2
  9.             if decimal % 2 == 1:
  10.                 binary = '1' + binary
  11.             else:
  12.                 binary = '0' + binary
  13.             Bin_base(dec, binary, minus_sign)

  14.         elif decimal < 0:
  15.             minus_sign = '-'
  16.             dec = -decimal
  17.             Bin_base(dec, binary, minus_sign)

  18.         else:
  19.             if len(binary) == 0:
  20.                 binary = '0b0'
  21.             else:
  22.                binary = minus_sign + '0b' + binary
  23.             nonlocal bi #这个位置是我想要使用return的地方
  24.             bi = binary

  25.     Bin_base(decimal0)
  26.     print(bi)
  27.     return bi #省略后面的语句
复制代码


运行结果:
  1. 请输入一个整数:-90
  2. -0b1011010
  3. -0b1011010
  4. 经验证,答案正确
  5. >>>
复制代码


多了一个闭包,我感觉代码有变得复杂了,明明return能够实现的话,就可以简单很多。函数输出只有return这一个方法吗? 可能帖子沉了,我再开一个
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-28 20:26

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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