Спростіть ланцюгові порівняння


254

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

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

Це твердження підкреслюється, і підказка підказує мені, що я повинен

спростити порівняльне порівняння

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


1
Якщо ви отримаєте пропозицію з підказки, ви можете навести курсор миші на область, і вона дає вам трохи лампочки. Ви можете натиснути на нього, щоб автоматично вставити зміни, які він пропонує. Таким чином, ви можете бачити, що він думає, що ви повинні робити (і ви можете скасувати, якщо вам це не подобається).
Едвард Нед Харві

Відповіді:


432

У Python ви можете "ланцюжок" порівняльних операцій, що просто означає, що вони "і" разом. У вашому випадку це було б так:

if start <= x <= end:

Довідка: https://docs.python.org/3/reference/expressions.html#comparisons


2
Дякую, я не знав, що ти можеш це зробити в Python. На цьому справді чухав голову.
Brynn McCullagh

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 Дійсно, але я думаю, що це варто згадати для ОП.
Марун

7
У python3, ручки діапазону добре " містять ", тому список не формується.
JoshNahum

2
@MarounMaroun, оскільки python 3, діапазон функціонує як колишній xrange, також варто згадати
dvdvck

5
Деталі щодо використання if x in range(...)див. У " Чому" 1000000000000000 в діапазоні (1000000000000001) "так швидко на Python 3? ".
Кевін Дж. Чейз

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.