Ремонт принтеров, сканнеров, факсов и остальной офисной техники


назад Оглавление вперед




[6]

Список - это более обычный для опытных (испорченных другими языками) программистов, встречающийся во многих языках программирования высокого уровня. Сечения берутся подобным же образом:

K=range(l,10) даёт [1,2,3,4,5,6,7,8,9]

L=K[2:] даёт [3,4,5,6,7,8,9]

В первой строчке стандартной функцией питона мы создали список последовательных целых чисел от 1 до 10 (как обычно, первое число вошло в результат, а второе - нет). Эта функция чрезвычайно полезна и, как сказал бы на нашем месте философ, если бы ее не было, ее стоило бы придумать. Полную её мощь мы сможем вкусить на следующей лекции, когда доберемся до операторов циклов. Пока же вернемся к последовательностям.

Во второй строчке берется конечное сечение - с третьего элемента по последний включительно. Прочие типы сечений берутся аналогично.

Кроме того, мы можем изменять значения элементов списка:

К [5] =5 даёт в К [3,4,5,6,7,5,9]

Здесь следует быть осторожным и различать семантику копирования и семантику указателей. Например, если мы напишем:

М=[3,4,5]

N[0]=333

То какое значение окажется в М? Правильно, [333,4,5], потому что какое бы имя мы не использовали: М или N, обращение идет к одним и тем же ячейкам оперативной памяти.

Воспользуемся уже известным методом для определения операций над списком - функцией dir:

»> dir( [])

[append, count, extend, index, insert, pop, remove, reverse, sort]

Эти функции служат соответственно для добавления элемента в конец готового списка; для подсчета количества элементов списка, равных данному; для расширения этого списка другой последовательностью (в т.ч. и кортежем) добавлением всех его элементов в конец этого; для действия, обратного взятию элемента - определения индекса элемента по его значению; N. insert (2,3) позволяет вставить новый элемент не в конец списка, а на определенное место, номер места идёт первым параметром, значение - вторым; pop позволяет вытолкнуть последний элемент из списка (при этом сам список становится короче); remove удаляет элемент, значение которого ему дано; reverse обращает список (последний элемент теперь идёт первым); sort сортирует


список по возрастанию. Для сортировки по убыванию, конечно, можно использовать комбинацию sort и reverse.

Упражнение. Запустите функцию dir для кортежа и объясните результат.

Для преобразования строки или последовательности в список используется функция list():

»> list(123)

[1,2,3]

»> list((l,2,3))

[1,2,3]

Если аргумент этой функции - список, то она создаст копию и вернет именно её (а не его исходный список). Таким образом, если Р - список, то P=list(Q) эквивалентно P=Q[:].

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

Вдумчивому слушателю (читателю) не даст покоя очередной вопрос: имеют ли кортежи право на существование, раз всё их отличие от списков заключается в неудобстве, связанном с невозможностью изменения структуры? Разница между кортежем и списком философская, её можно уподобить разнице между джазом и блюзом. И то, и другое - музыка, которую могут исполнять одни и те же музыканты на тех же инструментах, но разницу можно уловить невооруженным ухом. Суть этих стилей принципиально разная: джаз - это импровизация, полёт фантазии, экспромт, а блюз - это крик души испытываемого судьбой человека. Список - это прежде всего нумерованая последовательность, кортеж - прежде всего упорядоченная. Координаты точки в пространстве - это кортеж; перечень фамилий студентов - список. Цветовые составляющие пикселя - кортеж; строчки, введенные из файла - список. Конечно, удобства и полноты ради и список упорядочен, и кортеж пронумерован, но это уже вторично. Безусловно, никто (и даже сам Гвидо ван Россум) не в силах вам помешать использовать списки вместо кортежей везде, где они только встречаются - начинающие программисты, замученные паскалем, бейсиком и явой, так и делают, но это (кроме замедления работы программы) есть ни что иное, как преступление против философии - самое тяжкое из всех преступлений, а если это и что-то другое, то демонстрация собственного невежества, некомпетентности и неумения грамотно пользоваться предоставляемыми средствами. Тем не менее, даже дав зарок никогда не пользоваться кортежами, вы рискуете вскоре его нарушить, даже не подозревая об этом. Например, в следующем случае:

R, S=2,3


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

Т=1,2,3

U,V,W=T

Теперь понятно, как реализуется предыдущий пример: кортеж сначала создаётся, а потом декомпозиционируется.

А о каких возможностях мы говорили, заявляя, что как-то можно обойти ограничения, наложеные изобретателем кортежей? Есть одна лазейка в его определении, позволяющая кое-что сделать. Сказано - нельзя менять структуру. Изменение самих элементов кортежа может существенно изменить структуру, потому и запрещено. Но представьте, что один из элементов кортежа - список. Можно ли менять его элементы? Да, конечно!

Х=[2,3,4],5,6

X [1] =4 - нельзя Х[0] [1]=33 - можно

3. Словарь есть ассоциативный изменяемый неоднородный массив. Задается парами ключ: значение, перечисленными в фигурных скобках.

Словарь - это квинтэссенция программистской мысли, направленной на изучение последовательностей, это массив, в котором элементы пронумерованы не подряд идущими целыми положительными числами, а чем угодно: строками, вещественными числами, кортежами. Конечно, это не может быть сделано списками (которые меняют свою структуру) и словарями. Индекс элемента словаря называется ключей.

Сечений словарь не поддерживает, а для создания копии нужно написать в явном виде:

Y={"one":i,"tvo":2}

Z=A.copy()

Полное очищение словаря производится функцией clear(), добавление новой пары - простым присваиванием:

Y["three"]=3

При попытке узнать значение по несуществующему ключу выдаётся ошибка и работа программы останавливается, поэтому нужно почаще пользоваться функцией has key О, определяющей, есть ли такой ключ



[стр.Начало] [стр.1] [стр.2] [стр.3] [стр.4] [стр.5] [стр.6] [стр.7] [стр.8] [стр.9] [стр.10] [стр.11] [стр.12] [стр.13]