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


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


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.