Что не так с моим простым выражением if ... elif ..

Этот сценарий берет все, что было введено, и форматирует его в формат типа "1/1".

Он работает с первыми двумя операторами elif, но при переходе к третьему по-прежнему присваивает 2/ перед номерами. Он должен перейти на 3/ и 4/, как вы видите ниже.

Ваша помощь очень ценится.

import re

port = input("Enter port number:")

if bool(re.search('/', port)) == True:
    p = port

elif int(port) <= 48:
    port = "1/" + str(port)

elif int(port) >= 53 <= 100:
    port = "2/" + str(port)

elif int(port) >= 105 <= 152:
    port = "3/" + str(port)

elif int(port) >= 157 <= 204:
    port = "4/" + str(port)

print(port)
port = "1/" + str(port) ... порт уже является str ...
Patrick Artner 26.10.2018 21:27

где вы используете переменную p? Я вижу, что вы назначаете его (когда re.search возвращает True), но никогда не используете его.

mauve 26.10.2018 21:28

Этот сценарий - небольшая часть того, что будет использоваться позже. Вот почему вы видите переменную p. Я не мог двигаться дальше, пока сначала не выяснил эти шаги.

Mike Book 26.10.2018 21:35
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
3
131
3

Ответы 3

Проблема в том, что вы пытаетесь связать сравнения:

elif int(port) >= 53 <= 100:

Это проверяет, есть ли int(port) >= 53 и 53 <= 100. Поскольку 53 <= 100 всегда истинен, этот блок поймает все, где int(port) >= 53. Я предполагаю, что вы собираетесь сделать следующее:

elif 53 <= int(port) <= 100:

Это будет ловить только те случаи, когда int(port) находится в диапазоне от 53 до 100 (включительно). Вам нужно будет внести аналогичные изменения в остальные блоки elif.

Это сработало. Потрясающие!

Mike Book 26.10.2018 21:38

Вы перепутали условные операторы if. Исправить:

def getPort(port):

    # https://stackoverflow.com/questions/12265451/ask-forgiveness-not-permission-explain
    # only convert to int once, if that does not work check for / else bail out
    try:
        p = int(port)
    except ValueError:
        if "/" in port: # no need for regex
            return port
        else:
            raise ValueError("Port either integer or somthing with / in it")

    if p <= 48:               # 49-52 are not covered
        port = "1/" + port

    elif  53 <= p <= 100:     # move the condition between, the way you did it theyre True
        port = "2/" + port    # no matter because 53 <= 100 all the time

    elif 105 <= p <= 152:     # 101-104 are not covered
        port = "3/" + port

    elif 157 <= p <= 204:     # 152-156 are not covered
        port = "4/" + str(port)

    else:
        raise ValueError("Port either integer or somthing with / in it")

    return port

for p in ["1","54","99","121","180","47/11","2000"]:
    try:
        print(getPort(p))
    except ValueError as e:
        print (e)

Выход:

# Input: ["1","54","99","121","180","47/11","2000"]

1/1
2/54
2/99
3/121
4/180
47/11
Port either integer or somthing with / in it

У вас есть несколько пропущенных диапазонов портов, 50 ф. Е. не покрывается и приведет к ошибке ValueError.

Ваша ошибка здесь:

elif int(port) >= 53 <= 100:

Это означает (вы можете прочитать о связанные операторы сравнения):

elif int(port) >= 53 and 53 <= 100:

и всегда будет True из-за второй части; так вот почему более поздние elif никогда не достигаются.


Мое предложение:

port = input("Enter port number:")
int_port = int(port)    # so we don't repeat the same operation multiple unnecessary times

if bool(re.search('/', port)):
    pass
elif int_port <= 48:
    port = "1/" + port
elif 53 <= int_port <= 100:
    port = "2/" + port
elif 105 <= int_port <= 152:
    port = "3/" + port
elif 157 <= int_port <= 204:
    port = "4/" + port

print(port)

@PatrickArtner Я так не думаю. Я добавил ссылку на документы python в свой ответ, и третий абзац в этом связанном разделе показывает это с использованием AND.

Ralf 26.10.2018 21:48

Я был неправ, извините.

Patrick Artner 26.10.2018 21:50

Другие вопросы по теме