Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
pythonworldru.pdf
Скачиваний:
249
Добавлен:
11.03.2016
Размер:
709.75 Кб
Скачать

Самоучитель Python, Выпуск 0.2

f = eval(fname) f()

30.19 Как удалить все символы новой строки в конце строки?

Можно использовать S.rstrip("\r\n") для удаления символов новой строки, без удаления конечных пробелов:

>>> lines = ("line 1

\r\n"

...

"\r\n"

 

...

"\r\n")

 

>>> lines.rstrip("\r\n") 'line 1 '

30.20 Как удалить повторяющиеся элементы в списке?

Существует несколько путей: http://code.activestate.com/recipes/52560/

30.21 Как создать многомерный список?

Возможно, вы попробуете этот неудачный вариант:

>>> A = [[None] * 2] * 3

Это выглядит правильно, если напечатать:

>>> A

[[None, None], [None, None], [None, None]]

Но если вы присвоите значение, то оно появится в нескольких местах:

>>>A[0][0] = 5

>>>A

[[5, None], [5, None], [5, None]]

Причина в том, что оператор * не создаёт копию, а только ссылку на существующий объект. *3 создаёт список из 3 ссылок на один и тот же список. Изменение в одной строке изменяют другие, что, вероятно, не то, что вы хотите.

Возможные пути решения:

30.19. Как удалить все символы новой строки в конце строки?

129

Самоучитель Python, Выпуск 0.2

A = [None] * 3

for i in range(3): A[i] = [None] * 2

w, h = 2, 3

A = [[None] * w for i in range(h)]

Или, можно использовать специальные модули, предоставляющие матрицы. Наиболее известным является NumPy.

30.22Почему a_tuple[i] += [’item’] не работает, а добавление работает?

Это из-за того, что расширенный оператор присваивания - оператор присваивания, а также из-за разницы между изменяемыми и неизменяемыми объектами в Python.

Это обсуждение относится в общем, когда расширенные операторы присваивания применяются к элементам кортежа, которые указывают на изменяемые объекты, но мы будем использовать список и +=, как образец.

Если вы напишете:

>>>a_tuple = (1, 2)

>>>a_tuple[0] += 1

Traceback (most recent call last):

...

TypeError: 'tuple' object does not support item assignment

Причина исключения должна быть понятна: 1 добавляется к объекту a_tuple[0], но когда мы пытаемся присвоить результат, 2, к первому элементу в кортеже, мы получаем ошибку, поскольку мы не можем изменить элемент кортежа.

То есть, это выражение делает следующее:

>>>result = a_tuple[0] + 1

>>>a_tuple[0] = result

Traceback (most recent call last):

...

TypeError: 'tuple' object does not support item assignment

Когда мы пишем что-то вроде:

>>>a_tuple = (['foo'], 'bar')

>>>a_tuple[0] += ['item'] Traceback (most recent call last):

...

TypeError: 'tuple' object does not support item assignment

30.22. Почему a_tuple[i] += [’item’] не работает, а добавление работает?

130

Самоучитель Python, Выпуск 0.2

Исключение немного более неожиданное, но более удивителен тот факт, что, несмотря на ошибку, элемент добавился!

>>> a_tuple[0] ['foo', 'item']

Чтобы понять, что случилось, нужно знать, что:

Если объект определяет метод __iadd__, он вызывается, когда выполняется +=, и возвращенное значение используется для присваивания

Для списков, __iadd__ эквивалентен вызову extend для списка

Таким образом,

>>>a_list = []

>>>a_list += [1]

>>>a_list

[1]

Эквивалентен:

>>>result = a_list.__iadd__([1])

>>>a_list = result

Таким образом, наш пример с кортежом эквивалентен:

>>>result = a_tuple[0].__iadd__(['item'])

>>>a_tuple[0] = result

Traceback (most recent call last):

...

TypeError: 'tuple' object does not support item assignment

__iadd__ завершился успешно, и список увеличился, но присваивание законилось ошибкой.

30.22. Почему a_tuple[i] += [’item’] не работает, а добавление работает?

131

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]