Более эффективный способ написать этот маленький кусочек кода Python? - PullRequest
2 голосов
/ 25 февраля 2011

Я просматривал начальную книгу по Python и пытался написать небольшой блок кода, который будет принимать ввод от пользователей, проверить, что он может быть преобразован в int, и проверить, что он выше, чем 49152.

Я знаю, что есть более простой способ сделать это, но я не могу заставить себя это понять.

port_input = raw_input("port(number must be higher than 49152: ")

check = True
while check == True:
    check = False
    try:
        port_number = int(port_input)
    except:
        port_input = raw_input("port(number must be higher than 49152: ")
        check = True

while int(port_input) < 49152:
    port_input = raw_input("Please enter a higher number(hint: more than 49152): ") 

Ответы [ 7 ]

3 голосов
/ 25 февраля 2011

Вы можете избежать флага check, если заключите свой код в функцию:

def get_port():
    while True:
        port =  raw_input("port (number must be higher than 49152): ")
        try:
            port = int(port)
        except ValueError:
            continue
        if port > 49152:
            return port
3 голосов
/ 25 февраля 2011

То, что у вас есть, в любом случае не правильно. Подумайте, если кто-то ставит «123», то «abc». 123 получат их через блок while check, но когда они попадут в блок while < 49152, проверка не производится.

Вот что я придумаю (я не пишу на python, я просто взломал его на основе вашего существующего кода ...)

check = True
while check :
    port_input = raw_input("port(number must be higher than 49152: ")
    try:
        port_number = int(port_input)
        check = (port_number < 49152)
    except ValueError:
        check = True
1 голос
/ 25 февраля 2011

вариант без использования обработки исключений

def portInput(text):
    portInput.port_value = 0
    while True:
        port_input = raw_input(text)
        if not port_input.isdigit(): yield "port must be numeric"
        else:
            portInput.port_value = int(port_input)
            if portInput.port_value <= 49152: yield "number must be higher than 49152"
            else: return

for error in portInput("port(number must be higher than 49152): "):
    print error

print "entered port: %d" % portInput.port_value
1 голос
/ 25 февраля 2011
n = 0

while n < 49152:
    try:
        n=int(raw_input("enter number heghier than 49152->"))
    except: 
        print "not integer!"

print "ok!"
1 голос
/ 25 февраля 2011
def get_input(msg = "port(number must be higher than 49152: "):
    port_input = raw_input(msg)
    try :
        if int(port_input) < 49152:
            return get_input("Please enter a higher number(hint: more than 49152): ")
    except ValueError:
        return get_input()
    return int(port_input)
0 голосов
/ 26 февраля 2011
port = raw_input("port(number must be higher than 49152): ")
while not port.isdigit() or int(port) <= 49152:
    print("port must be a number > 49152")
    port = input("port(number must be higher than 49152): ")

Вызов int(port) выполняется только тогда, когда not port.isdigit() имеет значение False -> порт содержит цифры. Это связано с тем, что второй операнд для оператора or вычисляется только в том случае, если первый является ложным.

0 голосов
/ 25 февраля 2011

Я пытался избежать дублирования кода и сделать вещи немного более питонными с этим исполнением.Заметьте, что я не «кроме:», а специально ловлю ValueError.Часто люди забывают, что «кроме:» также ловит исключение SyntaxError, которое может сделать поиск глупой опечатки чрезвычайно расстраивающим.Я предположил, что номер порта здесь является номером порта TCP или UDP, и поэтому убедитесь, что он также меньше 65536.

have_valid_input = False

while not have_valid_input:
    unsafe_port = raw_input('port: ')
    try:
        port_number = int(unsafe_port)
    except ValueError:
        pass
    else:
        if port_number > 49152 and port_number < 65536:
            have_valid_input = True

    if not have_valid_input:
        print 'Invalid port'

print 'port', port_number
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...