Вступ
Ваш мозок ще далі болить від попереднього уроку? 🙂 Без проблем, я спеціально постарався, щоб під час цього уроку ми з вами трошки відпочили. Ми повертаємося до простої теми – змінні – але копнемо трошки глибше.
Давайте задумаємось… Змінні зберігають якусь невелику частинку інформації. Вони можуть повернути її нам у будь-який час, також ми можемо змінити цю інформацію (значення змінної) у будь-який час. Змінні – це чудовий інструмент, щоб зберігати певну інформацію і змінювати її по ходу нашої програми.
Але що, якщо нам потрібно зберегти наприклад цілий довгий список різноманітних “кусочків інформації”? Наприклад: імена місяців року. Або довгий список стрічок, який нам треба з часом змінювати? Наприклад: імена всіх собак чи котів у вашій сім’ї протягом останніх 20-ти років (у мене вони часто змінювалися у дитинстві). Або наприклад – телефонний довідник з усіма його номерами… Для цього нам треба буде мати список усіх імен, а також прив’язаний номер телефону до кожного з імен. Як же ж нам цього досягнути у нашій програмі на мові Python?
Рішення – Кортежі, Списки та Словники
Для вище згаданих трьох випадків, Пітон використовує 3 різні підходи – Кортежі, Списки та Словники. Давайте коротенько пройдемося по кожному з них:
- Списки – це послідовність певних значень. Кожен елемент у списку є пронумерований і нумерація їхня починається з нуля – тобто перший елемент в списку має номер 0, другий – 1, і т.д. Ми можемо видаляти елементи зі списку, також додавати нові елементи.
- Кортежі – в основному подібні до списків, але ми не можемо їх змінювати. Послідовність значень, які ми надаємо кортежу в момент його початкового визначення, не може бути змінено пізніше у програмі. Нумерація елементів в кортежі є такою ж самою як і в списку.
- Словники – можна сказати, що це “розумний список”, який є невпорядкованим, та елементи якого проіндексовані визначеними нами індексами – ключами. А не так як це є в списку: 0, 1, 2, і т.д. Тобто у словниках у нас є чітко виражене поняття індекса, або ще можемо його називати ключем (також словом), кожному з яких відповідає певне встановлене значення – визначення. Таким чином в Словнику ми маємо справу з парами: слово – визначення. Визначення (значення словника) не є окремо пронумеровані, і не мають наперед визначеного порядку. Ми також можемо на ходу змінювати пари у словнику. Приклад словника – телефонна книга, де кожному імені (слову) відповідає номер телефону (визначення).
А тепер давайте пройдемось по кожному з наших складних типів даних окремо і з прикладами. Голова не кипить?
Кортежі
Кортежі достатньо легко створювати. Визначаємо назву нашому кортежу, тоді назначаємо йому послідовністю значень (візьмемо для прикладу список стрічок) розділених комою, і огорнемо це все гарненько в круглі дужки. От і матимемо кортеж назв днів тижня англійською:
1 2 |
>>> days = ('Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday') |
Зауважте, перед переходом на наступний рядок в послідовності елементів кортежу після стрічки ‘Friday’ я пропустив знак переводу на новий рядок ‘\’. Це не обов’язково, якщо код огорнутий круглими дужками.
Python інтерпретатор тоді організовує наш кортеж собі у вигляді індекса (таблиці), де кожен елемент кортежа доступний під певним номером – позицією в послідовності:
1 2 3 4 5 6 |
Індекс Значення 0 Monday 1 Tuesday 2 Wednesday ... ... 6 Sunday |
В наступному параграфі ми розберемо як доступатися до елементів послідовності на прикладі роботи зі списком.
Списки
Списки є дуже подібні до кортежів у плані роботи з ними. Єдині дві відмінності:
- визначаємо їх не круглими, а квадтратними дужками
- їх можемо змінювати в процесі програми
Відповідно напрошується питання, а для чого ж нам тоді Кортежі? В основному для двох речей:
- для підвищення швидкодії програми, якщо не потрібно змінювати послідовність – тоді краще використовувати кортеж, незмінні типи даних завжди ресурсо економніші
- якщо потрібна константа (незмінюваний список), щоб уникнути випадкових змін (наприклад як передача в ролі аргумента функції) – також краще використовувати Кортеж
Отже визначимо наш перший список:
1 |
>>> colors = ['blue', 'white', 'black', 'red', 'green', 'yellow'] |
Маємо послідовність 6-ти стрічок – кольорів в квадтратних дужках, а значить ми визначили саме список, а не кортеж. Тепер давайте спробуємо видрукувати на екран колір червоний (‘red’):
1 |
>>> print colors[3] |
Хто знає, чому саме 3?
Так, адже починаємо нумерацію з нуля, ‘red’ маємо на позиції четвертій, відповідно індекс його буде – 3.
Також ми можемо взяти підмножину нашого списку кольорів, наприклад з першого по третій. Для цього потрібно скористатися двокрапкою (“:”) :
1 2 |
>>> colors[0:3] ['blue', 'white', 'black'] |
А тепер спробуємо змінити наш список. Ми можемо додати до нього нові значення, а також видалити існуючий елемент. Давайте для початку спробуємо додати новий колір у кінець списку:
1 |
>>> colors.append('grey') |
Виглядає трохи дивно? Давайте розберемось… Після імені змінної списку (colors) ми бачимо крапочку (“.”). В подальших уроках ми з вами побачимо таких крапочок більше. А поки у двох словах – ми викликали метод (функцію) списку ‘append’, який додає переданий йому аргумент (у нашому випадку це стрічка ‘grey’) до кінця списку. Не повністю зрозуміло? Не хвилюйтесь, у наступних уроках (зокрема Об’єктно Орієнтоване Програмування в Пітоні), ми розглянемо це все в деталях. А поки рухаємося далі.
Після виклику ‘append’ наш список виглядатиме отак:
1 2 |
>>> colors ['blue', 'white', 'black', 'red', 'green', 'yellow', 'grey'] |
Бачимо ‘grey’ у кінці списку.
А тепер давайте спробуємо видалити колір ‘black’ з нашої послідовності кольорів. Тут запис буде також цікавий:
1 |
>>> del colors[2] |
Пам’ятаємо, оскільки нумерація починається з 0, то і ‘black’ колір, який є третім у нашому списку – матиме індекс 2. ‘del’ функція (delete) видаляє емелент зі списку colors під індексом 2.
Є ще і інша можливість викинути елемент зі списку. Використовуючи функцію – ‘pop’:
1 |
>>> colors.pop(2) |
Результат буде аналогічним – список colors без елементу ‘black’:
1 2 |
>>> colors ['blue', 'white', 'red', 'green', 'yellow', 'grey'] |
На цьому закінчуємо ознайомлення зі списками і рухаємось далі – Словники:
Словники
Тепер давайте уявимо, що нам треба створити телефонну книгу. Як вона працює? Ми знаємо ім’я людини, але не знаємо її домашнього номера телефону. У цьому випадку телефонна книга може допомогти (звичайно, якщо людина живе по місцю прописки ;). В цій книзі ми знаходимо людину з даним ім’ям (або адресою) і навпроти даного ім’я будемо мали її домашній номер телефону. Тобто в даній книзі маємо набір пар: ім’я – телефон.
Можемо з цього визначення зрозуміти, що списки чи кортежі нам тут не допоможуть, адже там ключем (індексом) є число. А нам треба щось таке, що має ключами наприклад стрічку – ім’я людини…
Ось тут нам і приходять Пітонівські Словники на допомогу! Словник складається з ключів та значень. В нашій книзі Імена будуть в ролі Ключів, а Номери Телефонів – в ролі Значень словника.
Списки огортаються квадратними дужками, кортежі – круглими, а тепер вгадайте чим огортаються словники? Так – фігурними 🙂
Давайте вже нарешті до прикладу. Визначаємо нашу телефонну книгу – словник:
1 2 3 4 5 |
>>> book = { 'Vitaliy Podoba': 380322329823, 'Andriy Mylenkyy': 38044233453, 'Taras Leskiv': 38032234234, } |
В даному прикладі ми визначили словник під назвою book, який складається з трьох пар (ключ-значення). Бачимо, що ключ словника є у нашому випадку стрічкою – ім’ям, а значенням словника, яке йде після ключа і двокрапки, є число – номер телефону (телефони видумані ;). Ось такий простий синтаксис словника.
А тепер давайте додамо ще одну людину в нашу книгу:
1 |
>>> book['Andriy Ivachevskyy'] = 80678765432 |
Ми щойно додали новий ключ ‘Andriy Ivachevskyy’ в наш словник, а ключ має значення – 80678765432. Тепер маємо книгу, в якій чотири людини:
1 2 |
>>> book {'Andriy Ivachevskyy': 80678765432, 'Andriy Mylenkyy': 38044233453, 'Vitaliy Podoba': 380322329823, 'Taras Leskiv': 38032234234} |
Таким же ж чином ми можемо переприсвоїти нове значення вже існуючому ключе, а не лише додати новий ключ:
1 |
>>> book['Andriy Ivachevskyy'] = 0 |
Ми щойно встановили номер Андрію (‘Andriy Ivachevskyy’) в 0, цей ключ у нас уже існував.
Тобто, якщо ключу в словнику присвоїти значення, тоді цей ключ або змінить своє значення у випадку якщо ключ вже існує в словнику, або словник отримає нову пару (ключ-словник), у випадку якщо ключ до цього в словнику не існував.
Додати і змінити значення в словнику вміємо. Тепер ще давайте з вами видалимо пару зі словника. Тут скористаємося тим же ж синтаксисом і оператором, який ми використовували при видалені елементу зі списку ‘del’:
1 2 3 |
>>> del book['Andriy Ivachevskyy'] >>> book {'Andriy Mylenkyy': 38044233453, 'Vitaliy Podoba': 380322329823, 'Taras Leskiv': 38032234234} |
Бачимо зверху, що словник поменшав – значення ‘Andriy Ivachevskyy’ не стало.
І наприкінці розгляду Python словників пропоную вашій увазі невеличку програму, з вкладеними у неї пояснювальними коментарями. В ній наведу приклади використання додаткових функцій роботи зі словниками. Читайте, вникайте, викопійовуйте в свій редактор і запускайте, експериментуйте. Якщо щось не співпадає або не працює – сваріть мене в коментарях – будем розбирались 😉
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 |
# -*- coding: utf-8 -*- # кілька прикладів використання словників # спочатку визначаємо словник, поки порожній # тут ми триматимемо наші планети: # ім'я - ключ словника # діаметер планети в км - значення словника planets = {} # давайте кілька планети встановимо planets['Earth'] = 12756 # матінка Земля planets['Moon'] = 3476 # Місяченько planets['Mercury'] = 4880 # Меркурій planets['Jupiter'] = 142740 # Юпітер # скористаємося функцією has_key() - вона працює наступним чином: # function_name.has_key(key-name) # і повертає True, якщо словник має даний (key-name) ключ, i False # в протилежному випадку # згадуємо умовні оператори if, then, else: if planets.has_key('Earth'): print "Земля - частина нашої сонячної планети" else: print "Земля зникла?" # тепер спробуємо функцію keys() - вона повертає список усіх ключів словника print "Наші планети:" print planets.keys() # також ми можемо скористатися даною функцією, щоб присвоїти змінній список # ключів словника keys = planets.keys() # таким самим чином можемо отримати список усіх значень словника # для цього маємо функцію values(): print "Радіуси планет бувають:", planets.values() # присвоїми список значень нашого словника планет у змінну values = planets.values() # списки можемо також сортувати (адже пам'ятаємо, що списки це тип даних, # що є впорядкованим!) з допомогою функції sort() # Якщо даній функції не передавати додаткових параметрів, тоді, # по замовчуванню, вона сортуватиме елементи списку згідно абетки (для стрічок) # або у зростаючому порядк (для чисел) # Зверніть увагу: ми не можемо сортувати словники, адже дані всередині нього не # є впорядкованими. print keys keys.sort() # введіть цю програму у себе в редакторі, запустіть і порівняте що виведе # наступний рядок у порівнянні з першим 'print keys' print keys # так само із значеннями нашого словника print values values.sort() print values # і на останок, ми можемо взнати кількість елементів у словнику, чи списку, чи # кортежі з допомогою функції len(): print "Кількість планет: ", len(planets) |
І на завершення…
Загалом існує багато функцій, яких ми не розглянули у даному уроці, і які ми з вами можемо використовувати у своїх програмах для роботи із списками, кортежами та словниками. Але того, що ми тут розглянули буде більш, ніж достатньо для початку.
Ви молодці, що дійшли до цього моменту! Якщо виникли питання, чи знайшли неточності – коментуйте будь-ласка нижче.
У наступному уроці ми з вами детальніше розглянемо оператор циклу ‘for’. Тому пропоную трохи перепочити, зробити собі чаю чи кави. І аж тоді із свіжими силами приступати до діла.
Сподобалося? Було Корисним? Тоді прошу лайкати і ретвітити, передавати своїм друзям, що також можливо хочуть навчитися основ програмування.
Доброго вечора.
Є деякі опечатки:
– розділ Словники – четвертий приклад:
на початку рядка символи: “>>>” – вірно: “>>>”;
– розділ Словники – шостий приклад – рядок 7:
“діаметер” – вірно: “діаметр”;
– розділ Словники – шостий приклад – рядок 10:
“кілька планети” – вірно: “кілька планет”;
– розділ Словники – шостий приклад – рядок 39:
“присвоїми” – вірно: “присвоїмо”.
Добрий день!
Допоможіть із помилкою при запуску файлу із програмою-приклад на Python 3.6.3 Shell:
Traceback (most recent call last):
File “C:\Users\ADMIN\Desktop\dictionary.py”, line 22, in
if planets.has_key(‘Earth’):
AttributeError: ‘dict’ object has no attribute ‘has_key’
Дякую!
Доброго вечора! Підкажіть будь ласка як зчитати дані з файла .txt у якому містьться числові дані типу float у двох стовпчиках.
Потрібно потім перший стовпчик записати в один список а другий стовпчик в інший список.
Приклад даних у файлі:
-0,00036 3,36
-0,0153 0.08
-0,0085 3.33
Доброго дня!
Підкажіть будь ласка, чому при використанні методу sort для словників він впорядковується? Хоча не мав би.
питання – для чого ви застосовується операцію сортування на словнику? якщо вам потрібно пробігатись по посортованих ключах словниках – краще зберегти ключі в окремий список. це гарантуватиме що сортування буде завжди однаковим.
у мене переприсвоювання не працює
>>> book[‘Andriy Ivachevskyy’] = 0
SyntaxError: invalid syntax
Python 2.7.5
підсвічує червоним &
перепрошую
>>> book[‘Andriy Ivachevskyy’] = 0
накінець то зрозумів, друкував ‘>>>’ а тоді переприсвоєння
Привіт!
Ще з попереднього уроку у мене чомусь не розуміє кирилицю.
Для початку:
У мене Вінда 10. Поставив пітона 2.7.11
Проблема наступна. В коді я вказав # -*- coding: utf-8 -*-
Але чомусь через cmd(командну строку), воно не розуміє кирилиці.
Хоча якщо включати через IDLE то там все нормально (тому що попередньо в налаштуваннях я відмітив utf-8)
Хіба воно не мало б працювати в cmd також?
А так мені все дуже подобається!)
cmd також потрібно налаштувати, щоб розуміло інші ніж ascii символи (напр. кириличні)
З власного маленького досвіду, рекомендую тобі переходити на GNU/Linux – тут все набагато простіше в установці, та й python адекватно працює з консолі.
Можливо, на початках вивчення python, Linux – як сніг на голову, але потрать тиждень часу, перейди на Ubuntu 14.04, потім не пожалієш.
З власного досвіду – на Ubuntu Flask піднявся “з коробки” за допомогою 3-х команд, на Windows – бив помилками, а додаткові модулі приходилось прикручувати руцями.
Орфографія: розділ “Словники”, четверта строка першого абзацу: “і навпроти даного ім’я будемо мали її домашній номер телефону”, замість “мали” – “мати”
Дякую!
Питання відносно коду про планети. В коментах вказано що словник не сортується бо від не впорядкований.Але ми використовуємо sort до keys i values. Я так зрозумів що це є списки котрі входять у словник?
методи keys i values словник віддають нові об’єкти – списки, які вже є впорядкованими множинами.
Дякую за відповіді!
і ще питаннячко:) чому при друці прізвища виводяться в іншому порядку, а не так як у словнику?
словник – це невпорядкований набір даних. там порядку немає
>>> book[‘Andriy Ivachevskyy’] = 0
з цим ясно, користувачам видно карлючки > >>
Доброго дня!
При запуску коду:
book = {
‘Vitaliy Podoba’: 380322329823,
‘Andriy Mylenkyy’: 38044233453,
‘Taras Leskiv’: 38032234234,
}
book[‘Andriy Ivachevskyy’] = 80678765432
print book
видає літеру L після номерів телефонів:
{‘Andriy Ivachevskyy’: 80678765432L, ‘Andriy Mylenkyy’: 38044233453L, ‘Vitaliy Podoba’: 380322329823L, ‘Taras Leskiv’: 38032234234L}
а також питання тут: “Таким же ж чином ми можемо переприсвоїти нове значення вже існуючому ключе, а не лише додати новий ключ:
>>> book[‘Andriy Ivachevskyy’] = 0”
що це за >>>?
літера L позначає тип даних Long Integer: https://docs.python.org/2/library/stdtypes.html#numeric-types-int-float-long-complex
“>>>” це друкує пітон інтерпритатор на кожній стрічці в якості запрошення писати код.
Запускаю такий код
x = []
x.insert(460,4)
x.insert(461,5)
x.insert(462,6)
print x[461]
Пише помилку
Traceback (most recent call last):
File “mary_1.py”, line 15, in
print x[461]
IndexError: list index out of range
Але чому? я ж задав значення 461-го елементу.
не дуже розумію який зміст пробувати вставляти у список 460 елемент якщо він порожні і немає навіть першого. зроби print x і побачив як насправді виглядає він. мабуть 3 елементи. а ти пробуєш 461 елемент витягнути.
Я хочу оголисии три списки, тоді я повинен писати окремо три рядки:
pirs = []
n1 = []
n2 = []
Чому не можна через кому pirs, n1, n2 = []
виникає помилка
File “mary.py”, line 9, in
pirs, n1, n2 = []
ValueError: need more than 0 values to unpack
Тобто, чи можна спростити задання списків?
можна так
pirs, n1, n2 = [], [], []
а по-друге, навіть якщо б синтаксис дозволяв робити як ти хочеш, тоді б виникала інша, логічна, помилка. усі змінні вказували б на один список. тобто при додавання елемент до списку n2, списки pirs i n1 також мали б цей елемент.
В цьому рядку коду
>>> book[‘Andriy Ivachevskyy’] = 0
що означає >>> ?
А ясно, просто в тексті не праильно вдобразилися >>>
Я правильно розумію, що Списки це масиви,
Кортежі – масиви констант?
Не можу знайти аналогу Словника в Pascal, що це може бути там?
“Також ми можемо взяти підмножину нашого списку кольорів, наприклад з першого по третій. Для цього потрібно скористатися двокрапкою (“:”) :
colors[0:3] ”
– мені здається потрібно так: colors[0:2] – 0, 1, 2 – [‘blue’, ‘white’, ‘black’]
Вибачте, був не правий: “…We start at the index before the colon and continue up to but not including the index after the colon.”
Саме так. Сам все порішав 🙂
В мене запитання до видалення елемента зі списку: після того як один з елементів видалено – інші (наступні) змінюють свій індекс? тобто зміщуються на -1 по порядку? І ще – додавати елемент можна тільки в кінець списку?
список також має метод ‘insert’, з допомогою нього можна вставляти елемент у будь-яку позицію в списку http://www.tutorialspoint.com/python/list_insert.htm
так, наступні елементи посуваються вліво на одну позицію. важливо уникати видалення елементу зі списку під час його ітерації. детальніше в цій статті: