2014-01-25 5 views
2

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

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

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

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

Не могли бы вы сохранить циклы?

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

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

хорошо, умный компилятор мог выяснить, что переменная '_' не используется. –

+0

Неужели кто-нибудь заботится о тех крошечных дополнительных циклах? если да, то зачем вы используете python для этой задачи? –

+0

@KarolyHorvath Возможно, я ошибаюсь в связи с накладными расходами на копирование. –

ответ

3

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

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

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

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

1

согласно docs, действительный имя переменной может иметь такую ​​форму

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

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

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

start,*_,end = foo() 

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

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

list(range(1000)) 

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

+0

извините * после _ была опечатка. Как насчет моего вопроса о том, почему его нет? –

1

Существует, конечно, способ извлечь только несколько элементов.А именно:

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

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

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^