Довжина рядка і від’ємні індекси

Для зручної роботи з оператором індексування добре б було знати довжину рядка. Втім, з'ясувати це можна за допомогою вбудованої функції len().

>>> len('Hello world!')

>>>

Зверніть увагу, що пропуск теж враховується як символ. Визначати можна також і довжину змінної:

>>> a='Hello!'

>>> len(a)

Тепер давайте спробуємо вивести останній символ рядка:

>>> а = 'Hello!'

>>> а[len(a)]

Traceback (most recent call last):

File "<pyshell#16>", line 1, in -toplevela[

len(a)]

IndexError: string index out of range

>>>

Оскільки нумерація символів в рядках починається з нуля, ми використали неприпустиме значення індексу – символу з таким індексом в цьому рядку немає, тому інтерпретатор згенерував виключення IndexError: string index out of range. Виправимо помилку скориставшись композицією: як індекс можна використати будь-який вираз, що повертає ціле число.

>>> а = 'Hello!'

>>> а[len(a)-1]

'!'

Використання функції len() в операторі індексування виглядає громіздко, тому передбачено коротший варіант запису:

>>> а[-1]

'!'

Ще один маленький експеримент. Спробуємо підставити як індекс інше від’ємне число:

>>> а[-5]

'e'

Таким чином, ми можемо індексувати рядок з обох її кінців – це дуже зручно. До речі, така можливість є в дуже небагатьох мовах програмування. А зараз невелика вправа для закріплення матеріалу.

· Вправа. Напишіть програму, яка виводить довжину введеного користувачем рядка, а також перший, п'ятий і останній символ. Не забудьте передбачити випадок, коли довжина рядка складає менше за п'ять символів.

Доступ до підрядків

У випадку коли потрібно отримати доступ до більш ніж одного символу, ми повинні в квадратних дужках вказати індекс першого символу і останнього розділивши їх двокрапкою. Цей процес називається slicing (зріз).(Рис 1.)

Рис.1. Формування зрізів при доступі до підрядків.

>>> msg='Monty Python'

>>> msg[6:10]

'Pyth'

>>> msg[-12:-7]

'Monty'

Звертаємо увагу, що ми отримали три символи але не отримали четвертий. Якщо ввести діапазон [0:11] отримаємо весь рядок.

>>> msg='Monty Python'

>>> msg[6:10]

'Pyth'

>>> msg[-12:-7]

'Monty'

>>> len(msg)

>>> msg[0:12]

'Monty Python'

Також можна використовувати від’ємні індекси, та опускати перший чи останній індекс.

>>> msg[0:5]

'Monty'

>>> msg[:5]

'Monty'

>>> msg[:-1]

'Monty Pytho'

>>> msg[:]

'Monty Python'

При доступі до підрядків можна задавати крок в зрізі. В наступному прикладі ми доступаємось до кожного другого символу з вказаного діапазону та отримуємо обернену послідовність.

>>> msg[0:12:2]

'MnyPto'

>>> msg[12:0:-2]

'nhy to'

Зміни у рядках

Рядок – це послідовність символів з довільним доступом. Рядок в мові Python неможливо змінити – в цьому випадку говорять, що це immutable тип. Спроба змінити символ в певній позиції або підрядку викличе помилку:

>>> msg='Monty Python'

>>> msg[2]

'n'

>>> msg[2]='k'

 

Traceback (most recent call last):

File "<pyshell#19>", line 1, in <module>

msg[2]='k'

TypeError: 'str' object does not support item assignment

Але, змінити символ можна за допомогою зрізів в такий спосіб:



>>> msg=msg[:2]

>>> msg='Monty Python'

>>> msg[:2]

'Mo'

>>> msg[3:]

'ty Python'

>>> msg=msg[:2]+'k'+msg[3:]

>>> msg

'Mokty Python'

Речення

Речення також можна представити як рядок і працювати з ним, як було показано вище.

>>> sent='colorless green ideas sleep furiously'

>>> sent[16:21]

'ideas'

>>> len(sent)

Але нам потрібно працювати з реченням, яке є послідовністю слів, а не символів. Тому, варто познайомитися з наступним типом послідовностей – списками.

 

Списки

Список – це впорядкована множина значень, що ідентифікуються індексом. Багато в чому списки є схожими на рядки, які, по суті, теж є впорядкованими множинами символів. Відмінність списків і рядків полягає в тому, що елементи списку можуть бути любого типу. Впорядковані множини називають послідовностями.

Створення списків

Існує декілька способів створення списків. Найпростіший з них: перерахувати елементи списку через кому в квадратних дужках:

>>> [10, 20, 30, 40]

[10, 20, 30, 40]

>>> ["one", "two", "three"]

['one', 'two', 'three']

Перший приклад – список чотирьох цілих чисел, а другий – список трьох рядків. Елементи списків зовсім не обов'язково повинні бути одного типу. Наступний список містить рядок, ціле і дробове число та інший список:

>>> ["hello", 5, 2.0 [10, 20]]

['hello', 5, 2.0 [10, 20]]

Список, що є елементом іншого списку, називають вкладеним.

Список, який не містить жодного елементу, називають порожнім. Він позначається порожніми квадратними дужками ([]).

Ну, і нарешті, як і будь-які інші значення, списки можуть зберігатися в змінних:

numbers = [17, 123, 537]

empty = []

print numbers, empty

[17, 123, 537] []

Функція range

Для завдання послідовності чисел у формі арифметичної прогресії (1 2 3 4 5 6...) зручно користуватися вбудованою функцією range(). Вона має три форми, розглянемо на прикладах всі:

>>> range(10)

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

Ця форма повертає всі цілі числа в діапазоні від 0 до числа 10, не включаючи само число 10.

>>> range(5, 10)

[5, 6, 7, 8, 9]

Ця форма повертає всі цілі числа в діапазоні від 5 до числа 10, не включаючи само число 10, але включаючи початкове число 5.

>>> range(0, 10, 3)

[0, 3, 6, 9]

>>> range(-10, -100, -30)

[-10, -40, -70]

Ця форма повертає всі цілі значення в діапазоні від початкового до кінцевого з кроком, заданим третім параметром. Причому, якщо, наприклад, ви спробуєте ввести range(1, 100 -1), то очевидно, що чисел в цьому діапазоні немає, тобто результатом буде порожня множина([]).

Якщо ви хочете задати діапазон через кількість елементів в списку, то слід скористатися функцією range у поєднанні з функцією len:

>>> а = [`Linux', 'is', 'the', 'best', 'system']

>>> for i in range(len(a)):

... print i, а[i] #Звертання до елементу списку по його індексу

...

0 Linux

1 is

2 the

3 best

4 system

Крім того, Python надає можливість швидкого створення списків цілих значень, без необхідності їх перераховувати:

>>> range(1,5)

[1, 2, 3, 4]

У даному прикладі функція range() приймає два цілих аргументи і повертає список, який містить всі цілі числа в проміжку між заданими значеннями, включаючи перше і виключаючи друге.

Існує ще два способи виклику функції range(). Якщо їй передано тільки одне значення, то в результаті вона поверне список з цілими значеннями від 0 до N, де N – значення параметра:

>>> range(10)

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

Якщо ж range() викликана з трьома аргументами, то останній з них інтерпретується як розмір кроку. Тобто в результуючому списку значення йтимуть не підряд, а через проміжки, що дорівнюють заданому кроку:

>>> range(1, 10, 2)

[1, 3, 5, 7, 9]

Списки і індекси

Синтаксис звернення до елементів списку такий самий, як і при зверненні до символів стрічок – використовуємо оператор індексування ([]).

>>> numbers[0]

>>> numbers[-1]

Стосовно списків оператор індексування працює точно так, як і у випадку стрічок. Індексом може бути будь-який вираз, що повертає ціле число, в тому числі від’ємне. Якщо індекс менше нуля, то відлік індексу буде розпочато з кінця списку.

Оператор побудови зрізу списку працює подібно, як і зі стрічками:

>>> list = ['a', 'b', 'c', 'd', 'e', 'f']

>>> list[1:3]

['b', 'c']

>>> list[:4]

['a', 'b', 'c', 'd']

>>> list[3:]

['d', 'e', 'f']

>>> list[:]

['a', 'b', 'c', 'd', 'e', 'f']

Єдина відмінність полягає в тому, що елементи списків (на відміну від символів стрічок) можна змінювати:

>>> numbers[1]= 5

>>> numbers

[17, 5, 537]

>>> numbers[1:]= [6, 7]

>>> numbers

[17, 6, 7]

>>> numbers[0], numbers[2]= 1, 2

>>> numbers

[1, 6, 2]

Довжина списку

Неважко здогадатися, що для обчислення довжини списку можна використати функцію len(). Зверніть увагу, що якщо список містить як елемент інший список, то цей вкладений список вважатиметься як один елемент. Це видно з наступного прикладу:

>>> mylist = [[1, 'one'], [2, 'two'], [3, 'three'], 'four', 5]

>>> len(mylist)

Додатково про списки

Списковий тип даних має декілька методів. Всі вони приведені нижче:

insert (i, x) Вставляє елемент в задану позицію. Перший аргумент - індекс елементу, перед яким проводиться вставка. Наприклад, а.insert(0,x) вставить в початок списку, а а.insert(len(a),x) додасть елемент до кінця списку.
append (x) Додає елемент до кінця списку.
index (x) Повертає індекс першого елементу списку, значення якого рівне x . Якщо такого елементу немає, то виникне помилка.
remove (x) Видаляє із списку перший елемент, рівний x . У разі його відсутності також виникне помилка.
sort () Сортує елементи списку.
reverse () Записує елементи списку в зворотному порядку.
count (x) Повертає кількість елементів списку, рівних x
extend(L) Додає до кінця списку всі елементи списку L.
pop(i) Повертає елемент з індексом i і вилучає його зі списку. Якщо функція pop() задається без параметрів, то буде повернено і вилучено останній елемент списку.

Ось приклади, що використовують методи списків:

>>> phrase=['red', 'green', 'blue', 'yellow']

>>> phrase.insert(1,'black')

>>> phrase

['red', 'black', 'green', 'blue', 'yellow']

>>> phrase.append('black')

>>> phrase

['red', 'black', 'green', 'blue', 'yellow', 'black']

>>> phrase.count('black')

>>> phrase.index('black')

>>> phrase.remove('black')

>>> phrase

['red', 'green', 'blue', 'yellow', 'black']

>>> phrase.sort()

>>> phrase

['black', 'blue', 'green', 'red', 'yellow']

>>> phrase.reverse()

>>> phrase

['yellow', 'red', 'green', 'blue', 'black']

>>>

>>> phrase1=[10,20,30,40]

>>> phrase.extend(phrase1)

>>> phrase

['yellow', 'red', 'green', 'blue', 'black', 10, 20, 30, 40]

>>> phrase.pop(0)

'yellow'

>>> phrase

['red', 'green', 'blue', 'black', 10, 20, 30, 40]

Оператор del

Існує спосіб видалення елементу із списку шляхом завдання індексу елементу, а не його значення: оператор del. Він також дозволяє видаляти цілі шматки із списку (що ми і раніше робили, привласнюючи шматку порожній список). Наприклад:

>>> phrase=['yellow', 'red', 'green', 'blue', 'black']

>>> phrase

['yellow', 'red', 'green', 'blue', 'black']

>>> del phrase[2]

>>> phrase

['yellow', 'red', 'blue', 'black']

>>> del phrase[:2]

>>> phrase

['blue', 'black']

delможна ще використовувати для видалення цілої змінної:

>>> del phrase

>>> phrase

 

Traceback (most recent call last):

File "<pyshell#80>", line 1, in <module>

phrase

NameError: name 'phrase' is not defined

Тепер посилання на ім'я а приведе до помилки (принаймні, поки йому не привласнимо нового значення).

 

Кортежі

Як можна було побачити раніше, списки і стрічки мають багато загальних властивостей, таких як індексація і зрізи. Вони є прикладами типів даних "послідовність". Існує ще один стандартний тип даних послідовності: кортеж.

Кортеж складається з множини значень, що розділені комами, наприклад:

>>> t = 12345, 54321, 'Привіт!'

>>> t[0]

>>> t

(12345, 54321, 'hello!')

>>> # Кортежі так само можуть бути вкладеними:

... u = (t, (1, 2, 3, 4, 5))

>>> u

((12345, 54321, 'hello!'), (1, 2, 3, 4, 5))

Вміст кортежів завжди поміщається в круглі дужки, для того, щоб вкладені кортежі інтерпретувалися правильно; вони можуть бути введені як з, так і без навколишніх круглих дужок, хоча часто круглі дужки необхідні так чи інакше (особливо, якщо кортеж - частина більшого виразу).

Кортежі використовуються дуже часто. Наприклад: (x, у) - координати в парі, запис в базі даних тощо. Кортежі, подібно до рядків, є незмінними: неможливо змінити окремі елементи кортежу. Можна створювати кортежі, які містять змінні об'єкти, на подобі списків.

Порожні кортежі створюються парою круглих дужок без всяких елементів; кортеж з одним елементом створюється одним значенням з комою після нього (недостатньо включити одне значення в круглі дужки). Наприклад:

>>> kortez_0=()

>>> type(kortez_0)

<type 'tuple'>

>>> len(kortez_0)

>>> kortez_1='hello',

>>> type(kortez_1)

<type 'tuple'>

>>> len(kortez_1)

>>> kortez_2='by',0

>>> type(kortez_2)

<type 'tuple'>

>>> len(kortez_2)

Інструкція kortez_2='by',0 є типовим прикладом упаковки кортежу: значення 'by' і 0 упаковані в одному кортежі. Також можлива операція розпаковування кортежу:

>>> x,y=kortez_2

>>> x

'by'

>>> y

Цієї операції достатньо, щоб розпакувати послідовність. Послідовність, що підлягає розпаковуванню вимагає списку змінних зліва, щоб кількість елементів зліва збігалася з довжиною послідовності. Зверніть увагу, що множинне призначення - дійсно тільки для комбінації упаковки кортежу і його розпаковування!

Тут також слід зазначити маленьку асиметрію упаковки і розпаковування кортежів: упаковка кількох значень завжди створює кортеж, в результаті роботи розпаковування може бути будь-яка послідовність.

 

Набори

Python використовує такий тип даних як набори.

Набір - це неврегульована колекція значень без дублікатів елементів.

Основне використання полягає у тестуванні вмісту і усунення подвійних значень. Набори також підтримують математичні операції такі як, об'єднання, перетинання, порівняння, і симетричне порівняння.

>>> basket = ['apple', 'orange', 'apple', 'pear', 'orange', 'banana']

>>> fruit = set(basket) # створення набору без дублікатів

>>> fruit

set(['orange', 'pear', 'apple', 'banana'])

>>> 'orange' in fruit # швидке тестування вмісту

True

>>> 'crabgrass' in fruit

False

>>> # Демонструє операції над набором і наявність символів у вмісті набору

...

>>> а = set('abracadabra')

>>> b = set('alacazam')

>>> а # які унікальні символи є в а

set(['a', 'r', 'b', 'c', 'd'])

>>> а – b # символи в а, але що не входять в b

set(['r', 'd', 'b'])

>>> а | b # символи, що містяться в а або b

set(['a', 'c', 'r', 'd', 'b', 'm', 'z', 'l'])

>>> а & b # символи містяться і в а, і в b

set(['a', 'c'])

>>> а ^ b # символи містяться в а або в b, але не в обох словах

set(['r', 'd', 'b', 'm', 'z', 'l'])

 

Додаток А

Методи роботи з рядками

Метод Пояснення
s.find(t) Індекс першого знайденого елемента t стрічки s (-1 якщо не знайдено)
s.rfind(t) Індекс останнього знайденого елемента t стрічки s (-1 якщо не знайдено)
s.index(t) Аналогічно до s.find(t)але повертає ValueError якщо не знайдено
s.rindex(t) Аналогічно до s.rfind(t) але повертає ValueError якщо не знайдено
s.join(text) Об’єднання стрічок в одну стрічку використовуючи s як символ поєднання
s.split(t) Перетворення s на список де t – розділювач стрічок (пробіл по замовчуванню)
s.splitlines() split s into a list of strings, one per line
s.lower() Перетворення всіх літер в s на малі літери
s.upper() Перетворення всіх літер в s на великі літери
s.title() Перетворення першої літери s на велику
s.strip() Створення копії s без пробідів на початку і в кінці стрічки
s.replace(t, u) Заміна елемента t на u в стічці s

Методи роботи зі списками

Метод Пояснення
s.insert (i,t) Вставляє елемент в задану позицію. Перший аргумент - індекс елементу, перед яким проводиться вставка. Наприклад, s.insert(0,t) вставить на початок списку, а s.insert(len(s),t) додасть елемент до кінця списку.
s.append (t) Додавання елемента t до списку s
s.index (t) Визначення індексу елемента t списку s
s.remove (t) Вилучає із списку перший елемент, що збігається з t . У разі його відсутності виникає помилка.
s.sort () Сортування елементів списку s за абеткою
s.reverse () Записує елементи списку в зворотному порядку.
s.count (t) Повертає кількість елементів списку, що збігаються з фрагментом t
s.extend(L) Додає до кінця списку s всі елементи списку L.
s.pop(i) Повертає елемент з індексом i і вилучає його зі списку. Якщо функція pop() задається без параметрів, то буде повернено і вилучено останній елемент списку.

 









Последнее изменение этой страницы: 2016-04-07; Нарушение авторского права страницы

infopedia.su не принадлежат авторские права, размещенных материалов. Все права принадлежать их авторам. Обратная связь