Python:为什么while循环排除第一个值?

时间:2017-10-13 02:50:31

标签: python list while-loop

我正在尝试创建十进制到二进制转换器,但是,我注意到有些值被忽略,最后一个值没有输入到我创建的列表中。

#Here we create a new empty list.
binary = []
n = int(input("Enter number: "))

while n > 1:
    n = n//2
    m = n%2
    binary.append(m)

binary.reverse()
print( " ".join( repr(e) for e in binary ))

4 个答案:

答案 0 :(得分:1)

这是纠正后的代码:

binary = []
n = int(input("Enter number: "))
while n > 0:   
    m = n%2
    n = n//2
    binary.append(m)
if len(binary)==0:
    binary.append(0)
binary.reverse()
print( " ".join( repr(e) for e in binary ))

您的问题与此stackoverflow question重复检查链接。

祝你好运:)

答案 1 :(得分:1)

n = int(input("Enter number: "))

print("{0:0b}".format(n))    # one-line alternate solution

if n == 0:                     # original code with bugs fixed
    binary = [0]
else:
    binary = []
    while n > 0:
        m = n%2
        n = n//2
        binary.append(m)
    binary.reverse()
print("".join( repr(e) for e in binary ))

答案 2 :(得分:1)

正如PM 2Ring所说,元组分配可能是要走的路。使您的代码更短: - ) ...也改变 n> 1 n> = 1

binary = []
n = int(input("Enter number: "))
while n >= 1:
    n, m = n // 2, n % 2
    binary.append(m)
binary.reverse()
print( " ".join( repr(e) for e in binary ))

答案 3 :(得分:0)

您的算法很接近,但您需要在执行除法之前保存余下的。您还需要更改while条件,并在n的输入值为零时进行特殊处理。

我已经修复了你的代码&把它放在循环中以便于测试。

for n in range(16):
    old_n = n
    #Here we create a new empty list.
    binary = []
    while n:
        m = n % 2
        n = n // 2
        binary.append(m)

    # If the binary list is empty, the original n must have been zero
    if not binary:
        binary.append(0)

    binary.reverse()
    print(old_n, " ".join(repr(e) for e in binary))

<强>输出

0 0
1 1
2 1 0
3 1 1
4 1 0 0
5 1 0 1
6 1 1 0
7 1 1 1
8 1 0 0 0
9 1 0 0 1
10 1 0 1 0
11 1 0 1 1
12 1 1 0 0
13 1 1 0 1
14 1 1 1 0
15 1 1 1 1

正如Blckknght在评论中提到的那样,有一个标准函数可以一步为你提供商和余数

n, m = divmod(n, 2)

它可以很方便,但除了使代码更具可读性之外,它并没有真正提供太多好处。另一种选择是使用元组赋值来并行执行操作:

n, m = n // 2, n % 2 

这是一个很好的做法,特别是当你刚接触编码时,在纸上完成算法以了解它正在做什么。如果您的代码没有提供预期的输出,那么在战略位置添加一些print调用是个好主意,以检查变量的值是否符合您的预期。或者学习使用适当的调试器。 ;)