Робота зі списками в PYTHON.

Опубликовано kybik - вс, 12/03/2017 - 23:28

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

Перебір всього списку.

Типова задача з області програмування - перебрати всі елементи списку і виконати з кожним елементом одну і ту ж операцію. Наприклад, в комп'ютерній грі всі об'єкти можуть зміщуватися на однакову величину, або в списку чисел до кожного елементу може застосовуватися одна й та сама статистична операція. Або ж, вам потрібно вивести всі заголовки зі списку статей на сайті. У ситуаціях, що вимагають застосування однієї дії до кожного елементу списку, можна скористатися циклами for. Припустимо, є список з іменами фокусників, і ви хочете вивести кожне ім'я зі списку. Звичайно, можна звернутися до кожного елементу окремо, але такий підхід створює ряд проблем. По-перше, для дуже довгих списків все зведеться до одноманітних повторювань. По-друге, при будь-якій зміні довжини списку в програму доведеться вносити зміни. Цикл for вирішує обидві проблеми: Python буде стежити за всіма технічними деталями у своїй внутрішній реалізації.
У наступному прикладі цикл for використовується для виведення імен фокусників:

 

.1. magicians = [ 'alice', 'david', 'carolina']
.2. for magician in magicians:
.3. print(magician)

Все починається з визначення списку .1.. В точці .2. визначається цикл for. Цей рядок наказує Python взяти чергове ім'я зі списку і зберегти його в змінній magician. У точці .3. виводиться ім'я, тільки що збережене в змінній magician. Потім рядки .1. і .2. повторюються для кожного імені в списку. Цей код можна описати так: «Для кожного фокусника в списку вивести його ім'я". Результат являє собою простий перелік імен зі списку:

 

alice
david
carolina

Детальніше про цикли.

Концепція циклів дуже важлива, тому що вона являє один з основних способів автоматизації повторюваних завдань комп'ютером. Наприклад, в простому циклі, який я використав в magicians .py, Python спочатку читає перший рядок циклу:

for magician in magicians:

Цей рядок означає, що потрібно взяти перше значення зі списку magicians і зберегти його в змінній magician. Перше значення в списку - 'alice'. потім Python читає наступний рядок:

print(magician)

Python виводить поточне значення magician, яке все ще рівне 'alice'. Так як в списку ще залишилися інші значення, Python повертається до першого рядку циклу:

for magician in magicians:

Python бере таке значення зі списку - 'david' - і зберігає його в magician. Потім виконується рядок:

print(magician)

Python знову виводить поточне значення magician; тепер це рядок 'david'. Весь цикл повторюється ще раз з останнім значенням в списку, 'carolina'. Так як інших значень в списку не залишилося, Python переходить до наступного рядка в програмі. В даному випадку після циклу for нічого немає, тому програма просто завершується. Пам'ятайте, що всі дії повторюються по одному разу для кожного елемента в списку незалежно від їх кількості. Якщо список містить мільйон елементів, Python повторить ці дії мільйон разів - зазвичай це відбувається дуже швидко.
Також пам'ятайте, що при написанні власних циклів for тимчасовій змінній для поточного значення зі списку можна привласнити будь-яке ім'я. Однак на практиці рекомендується вибирати осмислене ім'я, яке описує окремий елемент списку. Кілька прикладів:

for cat in cats:
for dog in dogs:
for item in list_of_items:

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

Більш складні дії в циклах for.

У циклі for з кожним елементом списку може виконуватися практично будь-яка дія. Доповнимо попередній приклад, щоб програма виводила для кожного
фокусника окреме повідомлення:

 

magicians = [ 'alice', 'david', 'carolina']
for magician in magicians:
.1. print(magician.title() + ", that was a great trick!")

Єдина відмінність цього коду від попереднього полягає в тому, що в точці .1. для кожного фокусника будується повідомлення з його ім'ям. При першому проході
циклу змінна magician містить значення 'alice', тому Python починає перше повідомлення з імені 'Аlice'. При другому проході повідомлення буде починатися з імені 'David', а при третьому - з імені 'Carolina':

Alice, that was a great trick!
David, that was a great trick!
Carolina, that was a great trick!

Тіло циклу for може містити скільки завгодно рядків коду. Кожен рядок з початковим відступом після рядка for magician in magicians вважається, що знаходиться в циклі і виконується по одному разу для кожного значення в списку. Таким чином, з кожним значенням в списку можна виконати будь-які операції на ваш розсуд.
Включимо в повідомлення для кожного фокусника другий рядок:

 

magicians = [ 'alice', 'david', 'carolina']
for magician in magicians:
      print (magician.title() + ", that was a great trick!")
.1. print ( "I can not wait to see your next trick, " + magician.title() + ". \n")

Так як обидві команди print мають відступи, кожен рядок буде виконаний по одному разу для кожного фокусника в списку. Символ нового рядка ( "\n") у другій команді print .1. вставляє порожній рядок після кожного проходу циклу. В результаті буде створений набір повідомлень, акуратно згрупованих для кожного фокусника в списку:

 

Alice, that was a great trick!
I can not wait to see your next trick, Alice.

David, that was a great trick!
I can not wait to see your next trick, David.

Carolina, that was a great trick!
I can not wait to see your next trick, Carolina.

Тіло циклу for може містити скільки завгодно рядків коду. На практиці часто потрібно виконати в циклі for кілька різних операцій для кожного елемента списку.

Виконання дій після циклу for.

Що відбувається після завершення циклу for? Зазвичай програма виводить зведену інформацію або переходить до інших операцій. Кожен рядок коду після циклу for, який не має відступу, виконується без повторення. Припустимо, ви хочете вивести повідомлення для всієї групи фокусників і подякувати їм за чудову виставу. Щоб вивести загальне повідомлення після всіх окремих повідомлень, розмістіть його після циклу for без відступу:

 

magicians = [ 'alice', 'david', 'carolina']
for magician in magicians:
            print(magician.title() + ", that was a great trick!")
            print( "I can not wait to see your next trick, " + magician.title() + ".\n")
.1. print( "Thank you, everyone. That was a great magic show!")

Перші дві команди print повторюються по одному разу для кожного фокусника в списку, як було показано раніше. Але оскільки рядок .1. відступу не має, це повідомлення виводиться тільки один раз:

 

Alice, that was a great trick!
I can not wait to see your next trick, Alice.

David, that was a great trick!
I can not wait to see your next trick, David.

Carolina, that was a great trick!
I can not wait to see your next trick, Carolina.

Thank you, everyone. That was a great magic show!

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

Запобігання помилкам, які можуть виникнути з відступами.

В Python зв'язок одного рядка коду з попереднім рядком позначається відступами. У наведених прикладах рядки, які виводили повідомлення для окремих фокусників, були частиною циклу, тому що вони мали відступи. Застосування відступів в Python сильно спрощує читання коду. фактично відступи змушують розробника писати акуратно відформатований код з чіткою візуальною структурою. У більш довгих програмах Python можуть зустрічатися блоки коду з відступами кількох різних рівнів. Ці рівні сприяють розумінню загальної структури програми. Коли розробники тільки починають писати код, робота якого залежить від правильності відступів, в їхньому коді нерідко зустрічаються поширені помилки. Наприклад, іноді вони розставляють відступи в коді, в якому ці відступи не потрібні, або навпаки - забувають ставити відступи в блоках, де це необхідно. Кілька прикладів допоможуть вам уникнути подібних помилок у майбутньому і успішно виправляти їх, коли вони зустрінуться в ваших програмах.
Отже, розглянемо кілька типових помилок при використанні відступів.

Пропущений відступ.

Рядок після команди for в циклі завжди повинен мати відступ. Якщо ви забудете поставити цей відступ, Python нагадає вам про це:

 

magicians = [ 'alice', 'david', 'carolina']
for magician in magicians:
.1. print(magician)

Команда print в точці .1. повинна мати відступ, але тут його немає. Коли Python очікує побачити блок з відступом, але не знаходить його, з'являється повідомлення із зазначенням номера рядка:

 

File "magicians.py", line 3
print(magician)
       ^
IndentationError: expected an indented block

Зазвичай для усунення подібних помилок досить поставити відступ в рядку (або рядках), який іде безпосередньо після команди for.

Пропущені відступи в інших рядках.

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

 

magicians = [ 'alice', 'david', 'carolina']
for magician in magicians:
                print(magician.title() + ", that was a great trick!")
.1. print ( "I can not wait to see your next trick," + magician.title() + ".\n")

Команда print в точці .1. повинна мати відступ, але, оскільки Python знаходить хоча б один рядок з відступом після команди for, повідомлення про помилку не видається. В результаті перша команда print буде виконана для кожного елемента в списку, тому що в ній є відступ. Друга команда print відступу не має, тому вона буде виконана тільки один раз після завершення циклу. Так як останнім значенням magician є рядок 'carolina', друге повідомлення буде виведено тільки з цим ім'ям:

 

Alice, that was a great trick!
David, that was a great trick!
Carolina, that was a great trick!
I can not wait to see your next trick, Carolina.

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

Зайві відступи.

Якщо ви випадково поставите відступ в рядку, у якому він не потрібен, Python повідомить про це:

 

message = "Hello Python world!"
         .1. print(message)

Відступ команди print в точці .1. не потрібен, тому що цей рядок не підпорядкований попередньому; Python повідомляє про помилку:

 

File "hello_world.py", line 2
       print (message)
       ^
IndentationError: unexpected indent

Щоб уникнути непередбачених помилок з відступами, використовуйте їх тільки там, де для цього існує необхідність. У тих програмах, які ви пишете на цій стадії вивчення Python, відступи потрібні тільки в рядках, повторюваних для кожного елемента в циклі for.

Зайві відступи після циклу.

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

 

magicians = [ 'alice', 'david', 'carolina']
for magician in magicians:
        print(magician.title() + ", that was a great trick!")
        print( "I can not wait to see your next trick, " + magician.title() + ".\n")
        .1. print("Thank you everyone, that was a great magic show!")

Так як рядок .1. має відступ, повідомлення буде виведено для кожного фокусника в списку .2.:

 

Alice, that was a great trick!
I can not wait to see your next trick, Alice.
.2. Thank you everyone, that was a great magic show!

David, that was a great trick!
I can not wait to see your next trick, David.
.2. Thank you everyone, that was a great magic show!

Carolina, that was a great trick!
I can not wait to see your next trick, Carolina.
.2. Thank you everyone, that was a great magic show!

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

Пропущено двокрапку.

Двокрапка в кінці команди повідомляє Python, що наступний рядок є початком циклу.

 

magicians = ['alice', 'david', 'carolina']
.1. for magician in magicians
print(magician)

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

 

Теги