Эквивалентно ли [a,b][a>b] min(b, a)?

Я наткнулся на сторонний код Python, который гласил:

count = [remaining, readlen][remaining > readlen]

Посмотрев на это немного, я должен спросить: есть ли случаи, когда эта конструкция НЕ эквивалентна:

count = min(readlen, remaining)

то есть есть ли между ними какие-либо функциональные различия?

Это эквивалентно (a > b)? b : a, что также является классической мини-идиомой в C. Поэтому я думаю, что это то же самое, по крайней мере, для целых чисел.

qwr 10.08.2024 18:08
min(), вероятно, не определен в терминах оператора >, поэтому перегрузка может изменить результат, не так ли?
Allan Wind 10.08.2024 18:08

@AllanWind это просто синтаксис Python, который использует [] для списков и индексации

qwr 10.08.2024 18:09

@gwr Да, я знаю, я говорил о >

Allan Wind 10.08.2024 18:09

Ах, ок. stackoverflow.com/questions/45308212/… предполагает, что встроенная функция min просто вызовет сравнение на итераторе

qwr 10.08.2024 18:13

Это будет зависеть от методов сравнения . Например. если бы __lt__ существовало и всегда возвращалось True (что, по общему признанию, было бы немного странно), результаты были бы противоположны друг другу.

jonrsharpe 10.08.2024 18:18

Ух ты, какой способ написать код, который потом будет сложно понять! Вопрос внимательного понимания этого кода — отличный вопрос, но я надеюсь, что никто не возьмет это и не начнет использовать.

joanis 10.08.2024 18:18

@joanis это обычная конструкция в кодовом гольфе, которая служит руководством по антистилю.

qwr 10.08.2024 18:27
Похоже, это и есть сторонний код. Если я не ошибаюсь, они работают только с int, что делает эти две конструкции эквивалентными в данном случае.
InSync 10.08.2024 18:30

@qwr Верно, я думаю, что код-гольф никогда не сводится к разборчивости. Хотя [a,b][a<b] на 2 символа длиннее, чем min(a,b), последний все равно следует отдавать предпочтение, даже в коде гольфа. Но я понимаю суть.

joanis 10.08.2024 18:32

@AllanWind Сначала он попробует __lt__ (<), а затем вернется к __gt__ (>), если __lt__ не определен.

wjandrea 10.08.2024 18:32

Первый сравнивает remaining > readlen, а второй сравнивает remaining < readlen. Это предназначено?

ken 10.08.2024 18:33

@qwr Взятие минимального значения *iterable не имеет значения, потому что OP использует форму с несколькими аргументами min(), а не форму с одним аргументом.

wjandrea 10.08.2024 19:07

Было ли переключение операндов намеренным? min возвращает первый минимальный объект, если оба равны. Нечетная конструкция делает то же самое. Переключение порядка меня, кажется, сбивает с толку.

tdelaney 10.08.2024 19:08

Чтобы сделать их эквивалентными, нам нужно поменять знак неравенства (и список) в первом. Если мы поменяем операнды в последнем, то логически будет то же самое, но разница в том, какой из __gt__ и __lt__ вызывается, все равно есть. Однако реальный вопрос заключается в том, хотел ли ОП знать об этих незначительных различиях или о более широкой картине.

ken 10.08.2024 19:46
Почему в 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 может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
15
90
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Предположим a == b. В этом случае [a,b][a>b] возвращает a, поскольку a>b оценивается как False, которое затем преобразуется в 0. Но min(b, a) возвращает b (первый аргумент).

Это не относится к числам, но может иметь значение, если a и b являются изменяемыми объектами, например списками:

>>> a = [1, 2]
>>> b = [1, 2]
>>> c = [a, b][a>b]
>>> c is a
True
>>> c is b
False
>>> c.append(3)
>>> a
[1, 2, 3]
>>> b
[1, 2]

При использовании списков имеет значение, какой из двух равных объектов будет выбран.

Обратите внимание, что простая замена аргументов min на min(a, b) устранит эту разницу.

Ах да, равенство не означает одинаковый объектный регистр

qwr 10.08.2024 18:20

Для чисел разных типов действительно есть заметная разница. a = 1; b = 1.0 затем [a, b][a > b]1 и min(b, a)1.0

wjandrea 10.08.2024 19:04

Теперь ясно, что мне следовало написать min(a, b), а не min(b, a), но когда я задавал вопрос, это было не так очевидно! Спасибо! (Но да, это не пример кода для подражания!)

fearless_fool 11.08.2024 03:35

Обе конструкции задают count меньшим из remaining и readlen, поэтому не будет случаев, когда они дают разные результаты.

Что, если они равны, но не являются одним и тем же объектом?

qwr 10.08.2024 18:21

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