【问题标题】:Python code showing conversion from decimal to binary显示从十进制到二进制转换的 Python 代码
【发布时间】:2020-08-25 22:47:18
【问题描述】:

此python代码的目的是将十进制数转换为二进制数。我知道我可以在代码中使用 int() 函数,但我无法确定代码中发生的过程。

def decimal_to_binary(n):
   if(n > 1):
       decimal_to_binary(n//2)

   print(n % 2 , end='')

print(decimal_to_binary(18))
# The output for it is : 10010None

据说当程序进入if条件时,会先解释if里面的代码strong> 语句,那么它如何同时执行print(n % 2 , end='')。据我说,我认为这个print(n % 2 , end='') 只会打印一个值(0 或 1)。对我来说,似乎递归和 if 语句之后的 print 语句同时被解释。 其次,为什么 None 也打印输出?

【问题讨论】:

  • 您可能想决定该函数是打印值还是返回值。如果返回字符串,则可以进行单元测试。并且在返回字符串后打印字符串非常容易(就像您自动完成的那样,即使您编写此函数的方式是错误的)。
  • Nonedecimal_to_binary(18)的返回值,它是没有return指定的函数的默认返回值。如果您不想打印它,请不要print() 它,只需在代码末尾调用decimal_to_binary(18),此函数将打印它必须打印的内容。你的其余问题对我来说真的不清楚。无论如何:不能同时解释任何东西。如果您想了解发生了什么,请拿起铅笔和一张纸,然后按照程序进行操作。
  • Nitpick: decimal_to_binary 不会将十进制转换为二进制:它将 Python int 转换为该 int 的二进制字符串表示形式。 Python ints 以二进制形式存储,而不是十进制。 (当您执行decimal_to_binary(18) 时,从十进制数字文字18 到内部二进制格式的转换实际上发生在解析时,早在调用decimal_to_binary 之前。)
  • 它不会转换任何东西 :)
  • @KennyOstrom:说得好。

标签: python function binary


【解决方案1】:

问题是“它做了你告诉它做的事情。”
您的函数会打印,然后返回 None。
然后打印函数的返回值(无)。
您的函数从不打印换行符并没有帮助。

您希望该函数完成打印数字,然后为换行符执行单独的打印。为此,您可以使用辅助函数单独处理递归:

def print_decimal_to_binary(n):
    dec_to_bin_recursive(n)
    print()

def dec_to_bin_recursive(n):
    if(n > 1):
        dec_to_bin_recursive(n//2)
    print(n % 2 , end='')

print_decimal_to_binary(18)

当然,您还希望该函数返回一个值,否则您不会将它包含在 print 语句中。您期望这是有充分理由的,因为应该这样做,以便您也可以进行自动化测试。如果有人想打印一个字符串,那是一个单独且微不足道的任务。

def decimal_to_binary_string(n):
    if not n:
        return ''
    return decimal_to_binary_string(n//2) + str(n%2)

print (decimal_to_binary_string(18))

返回一个值很重要,这样您就可以编写单元测试。我们不想运行它并检查二进制表示。我们希望计算机为我们做到这一点。在 pythong 中查找单元测试。这是一个严重的过度简化:

assert('10010' == decimal_to_binary_string(18))

当然,这很傻,因为这个任务已经在 python 中实现了,见Convert decimal to binary in python

print(bin(18)[2:])
print('{0:b}'.format(18))

【讨论】:

  • 通常我不会发布可能是类分配的工作代码,但这个特定的代码遍布 stackoverflow 和其他多个地方。这样可以更轻松地指出代码中的一些内容。
猜你喜欢
  • 2017-02-04
  • 1970-01-01
  • 1970-01-01
  • 2019-07-15
  • 1970-01-01
  • 2023-04-11
  • 2022-10-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多