Упрощенное цепное сравнение

255

У меня есть целочисленное значение x, и мне нужно проверить, находится ли оно между значениями a startи end, поэтому я пишу следующие утверждения:

if x >= start and x <= end:
    # do stuff

Это утверждение подчеркивается, и подсказка говорит мне, что я должен

упростить сравнение

Насколько я могу судить, это сравнение так же просто, как они приходят. Что я здесь пропустил?

Бринн МакКаллаг
источник
1
Если вы получите подсказку из всплывающей подсказки, вы можете навести курсор мыши на область, и она даст вам немного лампочки. Вы можете щелкнуть по нему и автоматически вставить предложенное изменение. Таким образом, вы можете увидеть, что, по вашему мнению, вам следует делать (и вы можете отменить, если вам это не нравится).
Эдвард Нед Харви

Ответы:

433

В Python вы можете «связывать» операции сравнения, что просто означает, что они «и» объединены. В вашем случае это было бы так:

if start <= x <= end:

Ссылка: https://docs.python.org/3/reference/expressions.html#comparisons

Джон Цвинк
источник
2
Спасибо, я не знал, что ты можешь сделать это в Python. Я действительно почесал голову от этого.
Бринн МакКаллах
18
Боже, как все должно быть. Но, приходя с других языков, вы забываете свои идеалы и даже не думаете, что вещи могут быть такими, какими они должны быть. Но именно поэтому питон потрясающий, именно из-за таких вещей :)
Хакаишин
Знаете ли вы какие-либо «официальные» источники, которые рекомендуют цепочечный стиль другим? Какой из них более «идиоматичный» Python?
Рэй
Я не знаю, иногда я хотел бы, чтобы питон поднял больше ограждений. х == у == г терпит неудачу с ValueError , когда х, у, г является панда серии
BallpointBen
@BallpointBen: многие вещи не работают так, как вы могли бы ожидать в Пандах, даже x == y and y == z.
Джон Цвинк
12

Это может быть переписано как:

start <= x <= end:

Или:

r = range(start, end + 1) # (!) if integers
if x in r:
    ....
Марун
источник
5
Диапазон - плохой выбор, потому что для большого начала и конца вы создаете ненужный список.
Бурхан Халид
1
@BurhanKhalid Действительно, но я думаю, это стоит упомянуть для OP.
Марун
7
В python3 маркеры диапазона « хорошо» « содержатся », поэтому список не генерируется.
JoshNahum
2
@MarounMaroun начиная с python 3, функция range ведет себя как прежний xrange, также стоит упомянуть
dvdvck
5
Подробнее об использовании if x in range(...)см. « Почему« 1000000000000000 в диапазоне (1000000000000001) »так быстро в Python 3? ».
Кевин Дж. Чейз
-4

Упрощение кода

if start <= x <= end: # start x is between start and end 
# do stuff
Томсон Лукоше
источник
9
Чем это отличается от этого ответа?
GWigWam