среда, 30 января 2013 г.

Коллекции данных в Python

Рассмотрим два типа коллекций:

- кортежи  (tuple)
- списки   (list)

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

Кортежи - неизменяемые объекты.
Списки - изменяемые объекты (можно вставлять и удалять элементы списка)

Кортежи создаются с помощью запятых (,)

>>> "green", "red", "yellow", "orange", "blue"
('green', 'red', 'yellow', 'orange', 'blue')
>>>
>>> "Autumn", "Winter", "Spring", "Summer"
('Autumn', 'Winter', 'Spring', 'Summer')
>>>
>>> "Montag",
('Montag',)
>>>
>>> 1,
(1,)
>>>

При выводе кортежа интерпретатор заключает его в круглые скобки.

(1,)   - кортеж с одним элементом

()     - пустой картеж



Списки можно создавать с помощью квадратных скобок:


>>> ["Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag", "Sonntag"]
['Montag', 'Dienstag', 'Mittwoch', 'Donnerstag', 'Freitag', 'Samstag', 'Sonntag']
>>>
>>> ["green", "red", "yellow", "orange", "blue"]
['green', 'red', 'yellow', 'orange', 'blue']
>>>
>>> [1, 2, 3, 4, 5]
[1, 2, 3, 4, 5]
>>>
>>> []
[]           - пустой список
>>>


Списки и кортежи хранят не сами элементы данных, а ссылки на объекты.

При создании списков и кортежей создаются копии указанных ссылок на объекты.

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

Можно вкладывать одни объекты-коллекции в другие, например создать список списков.

Рассмотрим функцию len(), которая в качестве аргумента принимает единственный элемент данных
и возвращает его длину в виде значения типа int.

>>> len(("green",))
1
>>>
>>> len([1, 2, 3, 4, 5, "red", "yellow", 8])
8
>>>
>>> len("oracle")
6
>>>

Кортежи, списки и строки имеют размер, т.е. это типы данных, которые обладают категорией размера.
Элементы данных таких типов можно передавать функции len().

Все элементы данных в языке Python являются объектами (экземплярами) определенных типов данных (классов).

Тип данных <-----> Класс  - будем считать синонимами.

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

В сущности метод - это обычная функция, которая вызывается в контексте конкретного объекта.

Например, тип list  имеет метод append(), с помощью которого можно добавить новый объект в список.

>>> z = [1, 2, "red", "yellow", 8]
>>>
>>> z.append("green")
>>>
>>> z
[1, 2, 'red', 'yellow', 8, 'green']
>>>

Объект z знает, что принадлежит к типу list поэтому явно указывать тип данных не нужно.

Первым аргументом методу append() передается сам объект z - делается это интерпретатором Python автоматически,
в порядке реализованной в нем поддержки методов.

Метод append() изменяет первоначальный список.
Это возможно потому что списки относятся к категории изменяемых объектов.

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

В процедурном языке тоже самое могло бы быть достигнуто с использованием метода append()

>>> list.append(z, "orange" )
>>>
>>> z
[1, 2, 'red', 'yellow', 8, 'green', 'orange']
>>>

Здесь указываются тип данных и метод этого типа данных,
а в качестве первого аргумента передается элемент данных того типа,
метод которого вызывается, за которым следуют дополнительные параметры.

С точки зрения наследования между этими двумя подходами существует малозаметное семантическое отличие.
На практике наиболее часто используется первая форма.

Обычные функции в языке Python вызываются так:

имя_функции(аргументы)

а методы вызываются так:

имя_объекта.имя_метода(аргументы)

Тип list имеет множество других методов, включая insert(),
который используется для вставки элемента в позицию с определенным индексом и remove(),
который удаляет элемент с указанным индексом.

Извлечь из строки символ можно так:

>>> s = "solaris"
>>> s[0]
's'
>>> s[5]
'i'
>>>

Извлечь элемент из списка можно так:

>>> z = [1, 2, 3, 4, 5, "red", "yellow", 8]
>>> z[0]
1
>>> z[5]
'red'
>>>


Из кортежей мы можем только извлекать элементы с помощью []

>>> t = ("green", "red", "yellow", "orange", "blue")
>>> t[0]
'green'
>>> t[4]
'blue'
>>>

Изменять значения элементов кортежа мы не можем:


>>> t = ("green", "red", "yellow", "orange", "blue")
>>> t[1] = "red"
Traceback (most recent call last):
  File "", line 1, in
    t[1] = "red"
TypeError: 'tuple' object does not support item assignment
>>>

Но для списков мы можем использовать [] еще и для изменения элементов списка:

>>> z = [1, 2, 3, 4, 5, "red", "yellow", 8]
>>> z[1] = "green"
>>> z
[1, 'green', 3, 4, 5, 'red', 'yellow', 8]
>>>

Если указать индекс, выходящий за пределы списка, будет возбуждено исключение.

>>> z = [1, 2, 3, 4, 5, "red", "yellow", 8]
>>> z[8]
Traceback (most recent call last):
  File "", line 1, in
    z[8]
IndexError: list index out of range
>>>

Комментариев нет:

Отправить комментарий