Опубликован: 14.06.2015 | Доступ: свободный | Студентов: 7371 / 1135 | Длительность: 09:49:00
Авторские права: Creative Commons Attribution 3.0
Самостоятельная работа 8:

Списки

< Самостоятельная работа 1 || Самостоятельная работа 8: 12345

16.10. Разбор списков

Обычно, когда мы читаем файл, мы хотим что-то сделать, а не просто вывести на экран всю строку. Часто мы хотим найти "интересные строки", а затем разобрать строки, чтобы найти некоторые интересные части строки. Как быть, если мы хотим распечатать день недели у тех строк, которые начинаются с "From ".

From stephen.marquard@uct.ac.za Sat Jan 5 09:14:16 2008

Метод split очень эффективен, когда сталкивается с подобной проблемой. Мы можем написать небольшую программу, которая ищет строки, начинающиеся с "From ", а затем разделить (split) эти строки и распечатать третье слово в строке:

fhand = open('mbox-short.txt')
for line in fhand:
         line = line.rstrip()
         if not line.startswith('From ') : continue
         words = line.split()
         print words[2]

Мы используем условие if, которое пропускает все строки, начинающиеся не с 'From '.

Результат работы программы будет следующим:

Sat
Fri
Fri
Fri
Fri
Fri
...

16.11. Объекты и значения

Если мы выполним эти операторы присваивания:

a = 'banana'
b = 'banana'

Мы знаем, что a и b ссылаются на строку, но мы не знаем, ссылаются ли они на одну и ту же строку. Возможны два варианта:


В первом случае, а и b ссылаются на два различных объекта, которые имеют некоторое значение. Во втором случае, они ссылаются на один и тот же объект.

Чтобы проверить, ссылаются ли две переменные на один и тот же объект, вы можете использовать оператор is.

>>> a = 'banana'
>>> b = 'banana'
>>> a is b
True

В этом примере Python создает только один строковый объект, a и b ссылаются на него.

Но когда вы создаете два списка, вы получите два объекта:

>>> a = [1, 2, 3]
>>> b = [1, 2, 3]
>>> a is b
False

На диаграмме это выглядит следующим образом:


В этом случае мы можем сказать, что два списка эквивалентны (equivalent), т.к. имеют одинаковые элементы, но не идентичны (identical), т.к. это не один и тот же объект. Если два объекта идентичны, они также эквивалентны, но если они эквивалентны не обязательно, что они идентичны.

До этого момента, мы использовали понятия 'объект' (object) и 'значение' (value), как синонимы, но более точно говорить, что объект имеет значение. Если вы выполните a = [1,2,3], то переменная a ссылается на объект-список, значением которого является определенная последовательность элементов.

16.12. Псевдонимы (Aliasing)

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

>>> a = [1, 2, 3]
>>> b = a
>>> b is a
True

Схема выглядит следующим образом:


Ассоциация переменной с объектом называется ссылкой (reference). В этом примере две ссылки на один объект. Объект с более чем одной ссылкой имеет больше одного имени, поэтому мы говорим, что объект имеет псевдонимы (aliased).

Если псевдоним объекта изменяется, то эти изменения касаются других псевдонимов:

>>> b[0] = 17
>>> print a
[17, 2, 3]

Хотя такое поведение может быть полезным, существует вероятность ошибиться. В общем, более безопасно избегать псевдонимов при работе с изменяемыми объектами.

Для неизменяемых объектов, таких как строки, псевдонимы не являются большой проблемой.

< Самостоятельная работа 1 || Самостоятельная работа 8: 12345
Алексей Виноградов
Алексей Виноградов

Видеокурс выложен на сайте Altube.ru вместо Youtube и плеер Altube не поддерживает субтитры. Прошу решить вопрос о предоставлении русских субтитров в этом англоязычном видеокурсе.

Петр Олейников
Петр Олейников

Данные файлы неоходимы не только для самостоятельных работ, но и для тестов. А по ссылкам в лекциях они не доступны, выдает ошибку 404.