Python 3.x 执行此代码的最佳方法是什么?

Python 3.x What's the best way to do this code?

我正在编写一个代码,用户可以在其中输入任意数量的数字,直到他们输入 Stop。每个输入都会添加到列表中。我希望输入是整数,这样输入就可以正确排序,但是当输入 'Stop' 时,将创建一条错误消息。但是,如果我输入字符串,那么数字将被错误排序。

代码如下:

Num_List = list()
Numbers = input('Enter a number: ')
Num_List.append(Numbers)
Num_B = False
while Num_B == False:
    Numbers = input('Enter a number: ')
    Num_List.append(Numbers)
    if Numbers == 'Stop':
        Num_List.remove('Stop')
        Num_List = [i for i in Num_List if i is not '']      
        Num_List.sort(reverse=False)
        sorted(Num_List)
        print(Num_List)
        Num_B = True

这是我的方法:在无限循环中,获取用户的输入。如果是'Quit'则跳出循环。否则,转换为整数并附加到数字列表。代码:

numbers = list()
while True:
    token = input('Number: ')
    if token == 'Quit':
        break
    numbers.append(int(token))

print('List is:', numbers)

更新

从楼主忽略空字符串来看,我猜有些输入是空字符串,这导致ValueError。有了这个猜测,我修改了我的代码以考虑那些未成功转换为数字的标记。

numbers = list()
while True:
    token = input('Number: ')
    if token == 'Stop':
        break
    try:
        numbers.append(int(token))
    except ValueError:
        print('Invalid token, ignore: {!r}'.format(token))

print('List is:', numbers)

更新 2:

我又修改了我的代码。这一次,代码 运行 在 Python 2 和 3 解释器中都很好。

from __future__ import print_function

# Level the difference between Python 2 and 3
try:
    raw_input
except NameError:
    raw_input = input

numbers = list()
while True:
    try:
        token = raw_input('Number: ')
        numbers.append(int(token))
    except ValueError:
        if token == 'Stop':
            break
        print('Invalid token, ignore: {!r}'.format(token))

print('List is:', numbers)

更新 3

来自 Python 3 运行 的更新 2 的输出:

Number: 7
Number: 87
Number: 120
Number: 
Invalid token, ignore: ''
Number: foo
Invalid token, ignore: 'foo'
Number: bar
Invalid token, ignore: 'bar'
Number: Stop
List is: [7, 87, 120]

Python 2 运行 的输出相同。

我怀疑您正在使用 python <2.8,因此 input() 的行为有所不同并执行给定的内容而不是将其作为字符串返回(例如eval(input()))。当给定一个 int 时,没有问题发生,但是当给定一个 "Stop" 时,python 不知道如何处理它(除非你的代码有一个名为 "Stop" .. .).

这是对 python2:

代码的简单修改
# little trick to use input with python2 or python3 !
# source: 
try: input = raw_input
except NameError: pass

# variables naming is prefered in snake_case
num_list = []
curr_num = '' # only use one variable for input
while curr_num.lower() != 'stop': # lower allows to be case insensitive
    # raw_input prevent the "bug"
    curr_num = input('Enter a number or "stop": ')

    # conversion to int raise an error on invalid string, so we ignore errors
    try: num_list.append(int(curr_num))
    except ValueError: pass

# we print and sorted only when everything have been inputted
print('Numbers: %s' % num_list)
print('Sorted: %s' % sorted(num_list))

编辑: 重构代码以 python 2 & 3 兼容。所以你可以在任何地方以相同的方式使用 input() ;)

你可以这样做:

Num_List = list()
Numbers = input('Enter a number:')
while Numbers != 'Stop':
    Num_List.append(int(Numbers))
    Numbers = input('Enter a number:')

Num_List = [i for i in Num_List if i is not '']      
Num_List.sort(reverse=False)
sorted(Num_List)
print(Num_List)