显示从十进制到二进制转换的Python代码

显示从十进制到二进制转换的Python代码,python,function,binary,Python,Function,Binary,这段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条件时,它将首先解释

这段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语句中的代码,因此它如何同时执行
打印(n%2,end='')
。据我所知,我认为这个
打印(n%2,end='')
将只打印一个值(0或1)。在我看来,递归和if语句后面的print语句似乎同时被解释。 其次,为什么没有也会打印输出?

问题是“它做了你让它做的事。”
您的函数将打印,然后返回值None。
然后打印函数的返回值(无)。
你的函数从不打印换行符也没用

您希望函数完成打印号码,然后对换行符执行单独的打印。为此,可以使用helper函数分别处理递归:

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实现了,请参见


您可能需要决定函数是打印值还是返回值。如果返回字符串,则可以进行unittest。而且在返回字符串后打印字符串非常容易(就像您自动完成的那样,即使您编写此函数的方式是错误的)。
None
decimal\u to\u binary(18)
的返回值,它是未指定带有
return
的函数的默认返回值。如果您不想打印它,只需不
print()
it,只需在代码末尾调用
decimal\u to\u binary(18)
,此函数将打印它必须打印的内容。你剩下的问题我真的不清楚。无论如何,不能同时解释任何内容。如果你想了解发生了什么,拿一支铅笔和一张纸,按照程序进行操作。挑剔:
decimal\u to\u binary
不会将十进制转换为二进制:它会将Python
int
转换为该
int
的二进制字符串表示形式。Python
int
s以二进制形式存储,而不是十进制形式。(在执行
decimal\u到\u binary(18)
时,从十进制数值文本
18
到内部二进制格式的转换实际上在解析时发生,远远早于调用
decimal\u到\u binary
的时间。)它不会转换任何东西:)@KennyOstrom:这一点很好。通常我不会发布可能是类赋值的工作代码,但这个特定的代码到处都是stackoverflow和其他多个地方。这样就更容易指出代码中的某些内容。
print(bin(18)[2:])
print('{0:b}'.format(18))