Почему в python отсутствует специальная переменная ignore?

Предположим, я хочу разбить строку. Он возвращает кортеж из 3 предметов. Мне не нужен второй элемент.

Я прочитал, что _ используется, когда переменную нужно игнорировать.

 bar = 'asd cds' start,_,end = bar.partition(' ') 

Если я правильно ее понимаю, _ все еще заполняется значением. Я не слышал о том, как игнорировать часть результатов.

Разве это не спасет циклы?

Большим примером будет

 def foo(): return list(range(1000)) start,*_,end = foo() 

На самом деле это не означало бы сохранение каких-либо циклов, чтобы игнорировать возвращаемый аргумент, нет, за исключением тех, которые тривиально сохранены, отметив, что нет смысла привязывать имя к возвращенному объекту, который не используется.

Python не выполняет какую-либо функцию встраивания или оптимизации кросс-функций. Это не касается ниши ни малейшей. И это не должно, так как это может поставить под угрозу многие вещи, на которых хорошо работает python. Многие функциональные возможности python зависят от простоты его дизайна.

То же самое для примера распаковки списка. Легко думать о синтаксическом сахаре, чтобы python выбирал последний и первый элемент списка, учитывая этот синтаксис. Но нет никакого способа, оставаясь в пределах определяющих ограничений python, чтобы фактически не построить весь список в первую очередь. Кто скажет, что для построения списка нет соответствующих побочных эффектов? Python, как язык, безусловно, не гарантирует вам такую ​​вещь. Являясь динамическим языком, python даже не имеет ни малейшего понятия, ни пытается позаботиться о том, что foo может вернуть список до момента, когда он действительно это сделает.

И вернет ли он список? Что делать, если вы отскакиваете идентификатор списка?

В соответствии с документами допустимое имя переменной может иметь такую ​​форму

 identifier ::= (letter|"_") (letter | digit | "_")* 

Это означает, что первым символом имени переменной может быть буква или знак подчеркивания, а остальная часть имени может содержать букву или цифру или _ . Таким образом, _ является допустимым именем переменной в Python, но это реже используется. Поэтому люди обычно используют это как переменную use и throw.

И синтаксис, который вы указали, недействителен. Это должно было быть

 start,*_,end = foo() 

Во всяком случае, такая распаковка будет работать только в Python 3.x

В вашем примере вы использовали

 list(range(1000)) 

Итак, весь список уже построен. Когда вы возвращаете его, вы фактически возвращаете ссылку на список, значения не копируются на самом деле. Таким образом, нет конкретного способа игнорировать значения как таковые.

Конечно, есть способ извлечь только несколько элементов. Для остроумия:

 l = foo() start, end = foo[0], foo[-1] 

Вопрос, который вы задаете, заключается в следующем: «Почему нет однострочного сокращения для этого?» На это два ответа:

  1. Это недостаточно распространено, чтобы требовать сокращения. Решение для двух линий подходит для этого необычного сценария.

  2. Особенности не нужны, чтобы не существовать. Это не похоже на то, что Гвидо ван Россум составил список всех возможных идей, а затем вычеркнул твой. Если у вас есть идея улучшить синтаксис, вы можете предложить его сообществу Python и посмотреть, сможете ли вы их реализовать.