13
1 Обчислювальна техніка та програмування 2. Об’єктно-орієнтоване програмування. Лекція 4 Лекція 4 СПИСКИ В PYTHON 4.1 Створення списку Почнемо з прикладу. Припустимо, що нам необхідно обробити інформацію про курси валют: Ми можемо курс валюти на кожен день помістити в окрему змінну: >>> day1 = 26,86 >>> day2 = 26,83 >>> Схематично це виглядатиме як показано на рисунку:

4.1 Створення списку · Лекція 4 5 Потім адреса на цей об'єкт (id 7) поміщається в першу комірку списку (замість

  • Upload
    others

  • View
    6

  • Download
    0

Embed Size (px)

Citation preview

Page 1: 4.1 Створення списку · Лекція 4 5 Потім адреса на цей об'єкт (id 7) поміщається в першу комірку списку (замість

1 Обчислювальна техніка та програмування 2. Об’єктно-орієнтоване програмування. Лекція 4

Лекція 4 СПИСКИ В PYTHON

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

Почнемо з прикладу. Припустимо, що нам необхідно обробити інформацію про курси валют:

Ми можемо курс валюти на кожен день помістити в окрему змінну: >>> day1 = 26,86

>>> day2 = 26,83

>>>

Схематично це виглядатиме як показано на рисунку:

Page 2: 4.1 Створення списку · Лекція 4 5 Потім адреса на цей об'єкт (id 7) поміщається в першу комірку списку (замість

2 Обчислювальна техніка та програмування 2. Об’єктно-орієнтоване програмування. Лекція 4

А, якщо обробити необхідно курси валют за останні два роки? Тут нам на допомогу приходять списки. Їх можна розглядати як аналог масиву в інших

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

Список (list) в Python є об'єктом (В Python все є об'єктами!!!), тому його може бути присвоєно змінній (змінна, як і в попередніх випадках, зберігає адресу об'єкта класу «список»).

Уявімо список для нашої задачі з курсом валют:

>>> e = [26.86, 26.86, 26.83, 26.76, 26.48]

>>> e

[26.86, 26.86, 26.83, 26.76, 26.48]

>>>

Список дозволяє зберігати різнорідні дані, звертатися до яких можна через назву списку (в даному випадку змінну e).

Розглянемо, як Python працює зі списками в пам'яті:

Page 3: 4.1 Створення списку · Лекція 4 5 Потім адреса на цей об'єкт (id 7) поміщається в першу комірку списку (замість

3 Обчислювальна техніка та програмування 2. Об’єктно-орієнтоване програмування. Лекція 4

Бачимо, що змінна e містить адресу списку (id6). Кожен елемент списку є покажчиком (зберігає адресу) іншого об'єкта (в даному випадку дійсних чисел).

У загальному вигляді створення списку виглядає наступним чином:

Зазначу, що на місці елементів списку можуть знаходитися вирази, а не просто окремі

об'єкти.

4.2 Операції над списками Звертатися до окремих елементів списку можна за їх індексом (позицією), починаючи з

нуля:

>>> e = [26.86, 26.86, 26.83, 26.76, 26.48]

>>> e[0]

56.806

>>> e[1]

57.1578

>>> e[-1] # останній крайній елемент

57.2207

>>

Звернення за неіснуючим індексом викличе помилку: >>> e[100]

Traceback (most recent call last):

File "<pyshell # 10>", line 1 , in

<module> e [100]

IndexError: list index out of range

>>>

До теперішнього моменту ми розглядали типи даних (класи), які не можна було змінити. Згадайте, як Python лаявся при спробі змінити рядок.

Списки можна змінити. Проведемо експеримент:

>>> h = ['Hi', 27, -8.1, [1, 2]]

>>> h[1] = 'hello'

>>> h

['Hi', 'hello', -8.1 , [1, 2]]

>>> h[1]

'hello'

>>>

У прикладі ми створили список і змінили елемент, що знаходиться в позиції 1. Бачимо, що список змінився. Розглянемо ще один приклад і покажемо, що відбувається в пам'яті:

Page 4: 4.1 Створення списку · Лекція 4 5 Потім адреса на цей об'єкт (id 7) поміщається в першу комірку списку (замість

4 Обчислювальна техніка та програмування 2. Об’єктно-орієнтоване програмування. Лекція 4

>>> spisok = ['понеділок', 'вівторок', 'середа', 'четвер',

''п’ятниця'']

>>>

У пам'яті:

Проведемо зміни списку: >>> spisok[1] = 'неділя'

>>> spisok

['понеділок', 'неділя', 'середа', 'четвер', 'п’ятниця']

>>> spisok[1]

'неділя'

>>>

В момент зміни списку в пам'яті створюється новий строковий об'єкт 'неділя'.

Page 5: 4.1 Створення списку · Лекція 4 5 Потім адреса на цей об'єкт (id 7) поміщається в першу комірку списку (замість

5 Обчислювальна техніка та програмування 2. Об’єктно-орієнтоване програмування. Лекція 4

Потім адреса на цей об'єкт (id7) поміщається в першу комірку списку (замість id2).

Python побачить, що на об'єкт за адресою id2 немає посилань, тому видалить його з пам'яті. Список (list), напевно, найбільш застосований тип даних, з яким доводиться

стикатися при написанні програм. Це пов'язано з вбудованими в Python функціями, які дозволяють легко і швидко обробляти списки:

len(S) - повертає число елементів в списку S

max(S) - повертає максимальне значення в списку S

min(S) - повертає мінімальне значення в списку S

sum(S) - повертає суму значень в списку S

sorted(S) - повертає копію списку S, в якому елементи

впорядковані за зростанням. Не змінює список S

Приклади викликів функцій:

>>> e = [26.86, 26.86, 26.83, 26.76, 26.48]

>>> e

[26.86, 26.86, 26.83, 26.76, 26.48]

>>> len(e) 5 >>> max(e) 26.86 >>> min(e) 26.48 >>> sum(e) 133.79 >>> sorted(e) [26.48, 26.76, 26.83, 26.86, 26.86]

>>> e [26.86, 26.86, 26.83, 26.76, 26.48]

>>>

Операція + для списків служить для їх об'єднання (згадайте рядки):

>>> original = ['H', 'B']

>>> final = original + ['T']

>>> final

['H', 'B', 'T']

Операція повторення (знову аналогія з рядками):

>>> final = final * 5

>>> final

['H', 'B', 'T', 'H', 'B', 'T', 'H', 'B', 'T', 'H', 'B', 'T',

'H', 'B', 'T']

Інструкція del дозволяє видаляти зі списку елементи за індексом:

>>> del final [0]

>>> final

Page 6: 4.1 Створення списку · Лекція 4 5 Потім адреса на цей об'єкт (id 7) поміщається в першу комірку списку (замість

6 Обчислювальна техніка та програмування 2. Об’єктно-орієнтоване програмування. Лекція 4

[ 'B', 'T', 'H', 'B', 'T', 'H', 'B', 'T', 'H', 'B' , 'T',

'H', 'B', 'T']

Розглянемо цікавий приклад, але для початку напишемо функцію, що об'єднує два списки.

Вийде наступне:

>>> def f(x, y):

return x + y

>>> f ([1, 2, 3], [4, 5, 6])

[1, 2, 3, 4, 5, 6]

>>>

Тепер передамо в якості аргументів два рядки:

>>> f ("123", "456")

'123456'

>>>

Передамо два числа:

>>> f (1, 2)

3

Вийшла невелика функція, яка може об'єднувати і складати в залежності від класу (типу

даних) переданих їй об'єктів. Наступний корисний оператор in. Для списків in виконує лінійний пошук, що сильно

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

>>> spisok = ['січень', 7, 'лютий', -1.0, 'листопад']

>>> if 7 in spisok:

print('Значення є в списку')

Значення є в списку

>>>

Аналогічно рядкам для списку є операція взяття зрізу:

>>> spis = ['січень', 7, 'лютий', -1.0, 'листопад']

>>> spis

['січень', 7, 'лютий', -1.0, 'листопад']

>>> new_spis = spis [1:2]

>>> new_spis

[7]

>>>

У пам'яті це виглядає наступним чином:

Page 7: 4.1 Створення списку · Лекція 4 5 Потім адреса на цей об'єкт (id 7) поміщається в першу комірку списку (замість

7 Обчислювальна техніка та програмування 2. Об’єктно-орієнтоване програмування. Лекція 4

Змінній new_spisok присвоюється адреса нового списку (id7), що містить покажчик на числовий об'єкт, обраний з допомогою зрізу.

Повернемося до інструкції del і видалимо за допомогою зрізу підсписок:

>>> a = [-1, 1, 66.25, 333, 333, 1234.5]

>>> del a[0]

>>> a

[1, 66.25, 333, 333 , 1234.5]

>>> del a[2:4] # видалення підсписку

>>> a

[1, 66.25, 1234.5]

>>> del a[:]

>>> a

[]

>>>

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

>>> spisok

['січень', 7, 'лютий', -1.0, 'листопад']

>>> spisok2 = spisok # містять покажчик на один і той же список

>>> spisok2

['січень', 7, 'лютий', -1.0, 'листопад']

>>> spisok2[0] = 1 # модифікуємо одну з змінних

>>> spisok # змінилася інша змінна!

[1, 7, 'лютий', -1.0, 'листопад']

>>> spisok2

[1, 7, 'лютий', -1.0, 'листопад']

>>>

В Python дві змінні називаються псевдонімами, коли вони містять однакові адреси пам'яті.

Page 8: 4.1 Створення списку · Лекція 4 5 Потім адреса на цей об'єкт (id 7) поміщається в першу комірку списку (замість

8 Обчислювальна техніка та програмування 2. Об’єктно-орієнтоване програмування. Лекція 4

На схемі видно, що змінні spisok і spisok2 вказують на один і той самий список:

Створення псевдонімів – особливість списків, тому що вони можуть змінюватися. Будьте вкрай уважні.

Виникає питання, як перевірити, чи посилаються змінні на той самий список:

>>> x = y = [1, 2] # створили псевдоніми

>>> x is y # перевірка, чи посилаються змінні на один і

той самий об'єкт

True

>>> x = [1, 2]

>>> y = [1, 2]

>>> x is y

False

>>>

* З допомогою is порівнюються посилання-адреси, а не самі об'єкти. До списків застосовні два види копіювання. Перший вид – поверхневе копіювання, при

якому створюється новий об'єкт, але він буде заповнений посиланнями на елементи, які містилися в оригіналі:

>>> a = [4, 3, [2, 1]]

>>> b = a[:]

>>> b is a

False

>>> b [2] [0] = - 100

>>> a

[4, 3, [-100, 1]] # список a теж змінився

>>>

Наступний малюнок демонструє схему розміщення посилань на об'єкти при поверхневому копіюванні:

Page 9: 4.1 Створення списку · Лекція 4 5 Потім адреса на цей об'єкт (id 7) поміщається в першу комірку списку (замість

9 Обчислювальна техніка та програмування 2. Об’єктно-орієнтоване програмування. Лекція 4

Другий вид копіювання – глибоке копіювання. При глибокому копіюванні створюється новий об'єкт і рекурсивно створюються копії всіх об'єктів, що містяться в оригіналі: https: //docs.python.org/3/library/copy.html

>>> import copy

>>> a = [4, 3, [2, 1]]

>>> b = copy.deepcopy (a)

>>> b [2] [0] = - 100

>>> a

[4, 3, [2, 1]] # список a не змінився

>>>

З одного боку список надає можливість модифікації, з іншого - з'являється небезпека непомітно змінити список за рахунок створення псевдонімів або при поверхневому копіюванні.

4.4 Методи списку

Згадайте, що ми говорили про строкові методи. Для списків ситуація буде аналогічна. Далі наведені найбільш популярні методи списків:

https://docs.python.org/3/tutorial/datastructures.html#more-on-lists

>>> colors = ['red', 'orange', 'green']

>>> colors.extend (['black', 'blue']) # розширює список списком

>>> colors

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

>>> colors.append ('purple') # додає елемент в список

>>> colors

['red', 'orange', 'green', 'black', 'blue', 'purple']

>>> colors.insert (2,'yellow') # додає елемент в зазначену позицію

Page 10: 4.1 Створення списку · Лекція 4 5 Потім адреса на цей об'єкт (id 7) поміщається в першу комірку списку (замість

10 Обчислювальна техніка та програмування 2. Об’єктно-орієнтоване програмування. Лекція 4

>>> colors

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

>>> colors.remove('black') # видаляє елемент зі списку

>>> colors

['red', 'orange', 'yellow', 'green', 'blue', 'purple']

>>> colors.count ('red') # вважає кількість повторень аргументу методу

1

>>> colors.index ('green') # повертає позицію в списку аргументу методу

3

Ще кілька корисних методів для списку:

>>> colors

['red', 'orange', 'yellow', 'green', 'blue', 'purple']

>>> colors.pop() # видаляє і повертає останній елемент списку

'purple'

>>> colors

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

>>> colors.reverse () # список в зворотному порядку

>>> colors

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

>>> colors.sort () # сортує список (згадайте про порівняння рядків)

>>> colors

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

>>> colors.clear () # очищає список. Аналог del colors[:]

>>> colors

[]

>>>

Методів багато, тому для їх запам'ятовування рекомендуємо виконати кожен з перерахованих вище методів для різних аргументів і подивитися, що вони повертають. Це обов'язково стане в нагоді при написанні програм.

4.5 Перетворення типів

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

>>> s = 'Рядок для зміни'

>>> list(s) # функція list () намагається перетворити аргумент в список

['Р', 'я', 'д', 'о', 'к', ' ', 'д', 'л', 'я', ' ', 'з', 'м',

'і', 'н', 'и']

>>> lst = list(s)

>>> lst[0] = 'М' # змінюємо список, отриманий з рядка

>>> lst

['М', 'я', 'д', 'о', 'к', ' ', 'д', 'л', 'я', ' ', 'з', 'м',

'і', 'н', 'и']

>>> s =''.join(lst) # перетворимо список в рядок за допомогою строкового

методу join()

Page 11: 4.1 Створення списку · Лекція 4 5 Потім адреса на цей об'єкт (id 7) поміщається в першу комірку списку (замість

11 Обчислювальна техніка та програмування 2. Об’єктно-орієнтоване програмування. Лекція 4

>>> s

'Мядок для зміни'

>>>

Окремо розглянемо кілька прикладів строкового методу join:

>>> A = ['red', 'green', 'blue']

>>> ' '.join(A)

'red green blue'

>>> ''.join(A)

'redgreenblue'

>>> '***'.join(A)

'red***green***blue'

>>>

Метод join приймає на вхід список, який необхідно перетворити в рядок, а в якості

строкового об'єкта вказується з'єднувач елементів списку. Аналогічно можна перетворити число до списку (через рядок) і потім змінити

отриманий список:

>>> n = 73485384753846538465

>>> list(str(n)) # число перетворимо в рядок, потім рядок до списку

['7', '3', '4', '8', '5', '3', '8', '4', '7', '5', '3', '8',

'4', '6', '5', '3', '8', '4', '6', '5']

>>>

Якщо рядок містить роздільник, то її можна перетворити до списку за допомогою строкового методу split, який за замовчуванням як роздільник використовує пробіл:

>>> s = 'd a dd dd gg rr tt yy rr'.split()

>>> s

['d', 'a', 'dd', 'dd', 'gg', 'rr', 'tt', 'yy', 'rr', 'ee']

>>>

Візьмемо інший роздільник:

>>> s ='d:a:dd:dd:gg:rr:tt:yy:rr:ee'.split(":")

>>> s

['d', 'a', 'dd', 'dd', 'gg', 'rr', 'tt', 'yy', 'rr', 'ee']

>>>

4.6 Вкладені списки

Ми вже згадували, що в якості елементів списку можуть бути об'єкти будь-якого типу, навіть, інші списки:

>>> lst = [['A',1], ['B',2], ['C',3]]

>>> lst

[['A', 1], ['B', 2], ['C', 3]]

Page 12: 4.1 Створення списку · Лекція 4 5 Потім адреса на цей об'єкт (id 7) поміщається в першу комірку списку (замість

12 Обчислювальна техніка та програмування 2. Об’єктно-орієнтоване програмування. Лекція 4

>>> lst [0]

['A', 1]

>>>

Подібні структури використовуються для зберігання матриць.

Звернення (зміна) до вкладеного списку відбувається через вказування двох індексів:

>>> lst[0][1]

1

>>>

Схематично вкладені списки виглядають наступним чином:

Page 13: 4.1 Створення списку · Лекція 4 5 Потім адреса на цей об'єкт (id 7) поміщається в першу комірку списку (замість

13 Обчислювальна техніка та програмування 2. Об’єктно-орієнтоване програмування. Лекція 4

Вправа 4.1 L = [3, 6, 7, 4, -5, 4, 3, -1]

1. Визначте суму елементів списку L. ЯКЩО сума перевищує значення 2, ТО вивести на екран число елементів списку.

2. Визначити різницю між мінімальним і максимальним елементами списку. ЯКЩО абсолютне значення різниці більше 10, ТО вивести на екран відсортований за зростанням список, ІНАКШЕ вивести на екран фразу «Різниця менше 10».

Вправа 4.2

L = [3, 'hello’, 7, 4, 'привіт’, 4, 3, -1] Визначте наявність рядка «привіт» в списку. ЯКЩО такий рядок в списку присутній, ТО

вивести його на екран, повторивши 10 разів. Вправа 4.3

L = [3, 'hello’, 7, 4, 'привіт’, 4, 3, -1] Дослідіть кілька прикладів використання зрізів (виконуються аналогічно рядкам).

>>> L [:3] >>> L [:] >>> L [::2] >>> L [::-1] >>> L [:-1] >>> L [-1:]

Вправа 4.4

L = [3, 'hello',7, 4, 'привіт',4, 3, -1] 1. Визначте наявність рядка «привіт» в списку. ЯКЩО такий рядок в списку присутній,

ТО видалити його зі списку, ІНАКШЕ додати рядок в список. 2. Підрахувати, скільки разів в списку зустрічається число 4, ЯКЩО більше одного разу,

ТО очистити список.

Вправа 4.5 Напишіть програму, яка запитує у користувача два рядки і формує з цих рядків список.

Якщо рядки складаються тільки з чисел, то програма додає в середину списку суму введених чисел, інакше додається рядок, утворена з злиття двох введених раніше рядків. Підсумковий рядок виводиться на екран.

Вправа 4.6

Задано список слів. Необхідно вибрати з нього випадкове слово. З обраного випадкового слова випадково вибрати букву і попросити користувача її вгадати.

Наведено список слів: ['самовар', 'весна', 'літо’] Вибираємо випадкове слово: 'весна' Вибираємо випадкову букву: ‘с’ Виводимо на екран: ве?на Користувач намагається вгадати букву. Примітка: використовуйте метод choice модуля random.