You are on page 1of 14

Лекція 5

ІНСТРУКЦІЇ ЦИКЛУ В PYTHON

Мова Python дозволяє швидко створювати прототипи (швидка, чорнова реалізація


майбутньої програм) реальних програм завдяки тому, що в нього закладені конструкції для
вирішення типових завдань, з якими часто доводиться стикатися програмісту.
Згадайте, як ми вирішували завдання підрахунку суми елементів списку через виклик
функції sum ([1, 4, 5, 6, 7.0, 3, 2.0]) – всього лише один виклик функції!
У цьому розділі ми розглянемо ще кілька подібних прийомів, які значно спрощують
життя розробника на мові Python.

5.1 Інструкція циклу for

Наприклад, у нас є список num і ми хочемо красиво вивести на екран кожен з його
елементів:

>>> num = [0.8, 7.0, 6.8, -6]


>>> num
[0.8, 7.0, 6.8, -6 ]
>>> print(num [0], '-number')
0.8 - number
>>> print(num [1], '-number')
7.0 - number
>>> # ААААААААААААААААааааааааааааааааааа!

Якщо в списку буде п'ятсот елементів ?! Для подібних випадків в Python існують цикли.
Цикли є рушійною силою в програмуванні. Їх розуміння дозволить писати справжні живі і
корисні програми!

Перепишемо цей приклад з використанням циклу for:

>>> num = [0.8, 7.0, 6.8, -6]


>>> for i in num:
print(i, '-number')

0.8 - number
7.0 - number
6.8 - number
- 6 - number
>>>
Цикл for дозволяє перебрати всі елементи зазначеного списку. Цикл спрацює рівно
стільки разів, скільки елементів знаходиться в списку. Ім'я змінної, в якій на кожному кроці
буде міститися елемент списку, вибирає програміст. У нашому прикладі це змінна з ім'ям i.
На першому кроці змінній i буде присвоєно перший елемент списку num, рівний 0.8.
Потім програма переходить в тіло циклу for, відокремлене відступами (чотири пробіли
або одна табуляція). У тілі циклу міститься виклик функції print, до якої передається
змінна i.
На наступному кроці змінній i буде присвоєно другий елемент списку, рівний 7.0.
Відбудеться виклик функції print для відображення вмісту змінної i на екрані і т.д. до

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


тих пір, поки не закінчяться елементи в списку!

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

Невеликий приклад:

>>> for i in [1, 2, 'hi']:


print(i)

1
2
hi
>>>

Насправді, цикл for працює і для рядків!

>>> for i in 'hello':


print(i)

h
e
l
l
o
>>>

За аналогією зі списком для рядків перебираються всі символи рядка. У загальному


вигляді запис циклу for для заданого рядка:

Цикл for дозволяє не тільки виводити елементи рядка або списку на екран, але і
виконувати між ними певні операції:

>>> num = [0.8, 7.0, 6.8, -6]


>>> for i in num:
if i == 7.0:
print(i, '- число 7.0')
7.0 - число 7.0
>>>
Наприклад, можемо вивести на екран тільки задане значення зі списку, виконавши
порівняння на кожному кроці циклу.

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


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

>>> country = "USA"


>>> for ch in country:
if ch.isupper ():
print(ch)

R
>>>

Нагадую, що строковий метод isupper перевіряє великі букви символу (З ВЕЛИКОЇ


ВІН БУКВИ?), повертає True або False. У циклі перевіряється кожен символ рядка.
Якщо символ у верхньому регістрі, то він виводиться на екран.

5.2 Функція range


Досить часто при розробці програм необхідно отримати послідовність (діапазон) цілих
чисел:

Для вирішення цього завдання в Python передбачена функція range, що створює


послідовність (діапазон) чисел. В якості аргументів функція приймає: початкове значення
діапазону (за замовчуванням 0), кінцеве значення (НЕ включно) і крок (за замовчуванням 1).
Якщо викликати функцію, то результату ми не побачимо:

>>> range(0,10,1)
range (0, 10)
>>> range(10)
range (0, 10)
>>>

Справа в тому, що для створення діапазону чисел необхідно використовувати цикл for:

>>> for i in range(0, 10, 1):


print(i, end ='')

0 1 2 3 4 5 6 7 8 9
>>> for i in range(10 ):
print(i, end ='')

0 1 2 3 4 5 6 7 8 9
>>> for i in range(2, 20, 2):
print(i, end ='')

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


2 4 6 8 10 12 14 16 18
>>>

Таким чином, в змінну i на кожному кроці циклу буде записуватися значення з


діапазону, який створюється функцією range.

При бажанні можна отримати діапазон в зворотному порядку проходження (зверніть


увагу на аргументи функції range):

>>> for i in range(20, 2, -2):


print(i, end =' ')

20 18 16 14 12 10 8 6 4
>>>

Тепер за допомогою діапазону знайдемо суму чисел на інтервалі від 1 до 100:

>>> total = 0
>>> for i in range(1, 101):
total = total + i

>>> total
5050
>>>

Змінній i на кожному кроці циклу буде присвоюватися значення з діапазону від 1 до 100
(крайнє значення не включаємо). У циклі ми накопичуємо лічильник. Що це означає? На
першому кроці циклу спочатку обчислюється права частина виразу, тобто total + i.
Змінна total на першому кроці дорівнює 0 (присвоїли їй значення 0 перед початком циклу),
змінна i на першому кроці містить значення 1 (перше значення з діапазону), таким чином,
права частина буде дорівнює значенню 1 і це значення присвоїти лівій частині виразу, тобто
змінній total.
На другому кроці total вже буде дорівнює значенню 1, i – містити значення 2, тобто
права частина виразу буде дорівнює 3, це значення присвоїли знову total і т.д. поки не
дійдемо до кінця діапазону. У підсумку в total після виходу з циклу буде міститися шукана
сума!
В Python є більш красиве рішення даної задачі:

>>> sum(list(range(1, 101)))


5050
>>>

Це рішення вимагає невеликих пояснень. Діапазони можна використовувати при


створенні списків:

>>> list(range(10))
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> list(range(2, 10, 2 ))
[2, 4, 6, 8]
>>>

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


Виклик функції sum для списку як аргумент наводить до підрахунку суми всіх елементів
списку – це якраз те, що нам потрібно!

Діапазон, створюваний функцією range, часто використовується для завдання індексів.


Наприклад, якщо необхідно змінити існуючий список, помноживши кожен його елемент на
2:

lst = [4, 10, 5, -1.9]


print(lst)
for i in range(len(lst)):
lst [i] = lst [i] * 2
print(lst)

В результаті виконання програми:

>>>
======== RESTART: C: /Python35-32/myprog.py
====== [4, 10, 5, -1.9 ]
[8, 20, 10, -3.8]
>>>

Необхідно пройти в циклі по всіх елементах списку lst, для цього перебираються і
змінюються послідовно елементи списку через вказівку їх індексу. Як аргумент range
задається довжина списку. У цьому випадку створюється діапазон буде від 0 до
len(lst)- 1. Python не включає крайній елемент діапазону, тому що довжина списку
завжди на 1 більше, ніж індекс останнього його елемента, тому що індексація починається з
нуля.

5.3 Підходи до створення списку

Розглянемо різні способи створення списків. Найбільш очевидний спосіб:

>>> a = []
>>> for i in range(1,15):
a.append (i)
>>> a
[1, 2, 3, 4, 5, 6, 7, 8 , 9, 10, 11, 12, 13, 14]
>>>

У циклі з діапазону від 1 до 14 вибираємо числа і за допомогою спискового методу


append додаємо їх до списку a.
Зі створенням списку з діапазону ми вже зустрічалися:

>>> a = list(range(1, 15))


>>> a
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
>>>

Можна також використовувати «спискові включення» (іноді його називають


«генератором списку»):

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


>>> a = [i for i in range(1, 15)]
>>> a
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
>>>

Правила роботи для спискового включення:

У наступному прикладі вибираємо з діапазону всі числа від 1 до 14, зводимо їх в квадрат
і відразу формуємо з них новий список:

>>> a = [i ** 2 for i in range(1,15)]


>>> a
[1, 4, 9, 16, 25, 36, 49, 64 , 81, 100, 121, 144, 169, 196]
>>>

Спискове включення дозволяє задавати умови для вибору значення з діапазону (в


прикладі виключили значення 4):
>>> a = [i ** 2 for i in range(1,15) if i != 4]
>>> a
[1, 4, 9, 25, 36, 49, 64 , 81, 100, 121, 144, 169, 196]
>>>

Замість діапазонів спискове включення дозволяє вказувати існуючий список:

>>> a = [2, -2, 4, -4, 7, 5]


>>> b = [i ** 2 for i in a]
>>> b
[4, 4, 16, 16, 49, 25]
>>>

У прикладі ми вибираємо послідовно значення зі списку a, зводимо в квадрат кожен з


його елементів і відразу додаємо отримані значення в новий список.
За аналогією можна перебирати символи з рядка і формувати з них список:

>>> c = [c*3 for c in 'list' if c != 'i']


>>> c
['lll', 'sss', 'ttt']
>>>

В Python є цікава функція map, яка дозволяє створювати новий список на основі
існуючого списку:

>>> def f(x):


return x + 5

>>> list(map(f, [1, 3, 4]))

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


[6, 8, 9]
>>>

Функція map приймає в якості аргументів ім'я функції і список (або рядок). Кожен
елемент списку (або рядка) подається на вхід функції, і результат роботи функції додається
як елемент нового списку. Отримати результат виклику функції map можна через цикл for
чи функцію list. Функції, які приймають на вхід інші функції, називаються функціями
вищого порядку.

Приклад виклику map для рядка:

>>> def f(s):


return s * 2

>>> list(map(f, "hello"))


['hh', 'ee', 'll', 'll', 'oo']
>>>

Розглянемо, як отримати список, що складається з випадкових цілих чисел:

>>> from random import randint


>>> A =[randint(1, 9) for i in range(5)]
>>> A
[2, 1, 1, 7, 8]
>>>

В даному прикладі функція range виступає як лічильник числа повторень (цикл for
спрацює рівно 5 разів). Зверніть увагу, що при формуванні нового списку змінна i не
використовується. В результаті п'ять разів буде проведений виклик функції randint, яка
згенерує ціле випадкове число з інтервалу, і вже це число буде додано в новий список.

Перейдемо до ручного введення значень для списку. Задамо довжину списку і введемо з
клавіатури всі його значення:

a = [] # оголошуємо порожній список


n = int(input()) # зчитуємо кількість елемент в списку
for i in range(n):
new_element = int(input()) # зчитуємо черговий елемент
a.append (new_element) # додаємо його в список
# останні два рядки можна було замінити однією:
# a.append (int (input ()))
print(a)

У результаті запуску програми:

>>>
=== ===== RESTART: C: \ Python35-32 \ myprog.py ========
3
4
2
1

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


[4, 2, 1]
>>>

У цьому прикладі range знову виступає як лічильник числа повторень, а саме – задає
довжину списку.

Тепер запишемо рішення цього завдання через спискові включення в один рядок:

>>> A =[int(input()) for i in range(int(input()))]


3
4
2
1
>>> A
[4, 2, 1]
>>>

5.4 Інструкція циклу while

Як ви вже здогадалися, цикл for використовується, якщо заздалегідь відомо, скільки


повторень необхідно виконати (вказується через аргумент функції range або поки не
закінчиться список / рядок).
Якщо заздалегідь кількість повторень циклу невідомо, то застосовується інша
конструкція, яка називається циклом while:

Тіло циклу виконується поки вираз є істиною, або поки не вийшли по break.
Визначимо кількість студентів:

students = 3
while students> 0:
print(students)
students = students - 1

В результаті виконання програми:

>>>
==== ===== RESTART: C: \ Python35-32 \ 5_3.py ==========
3
2
1
>>>

У прикладі цикл while виконується до тих пір, ПОКИ число студентів в умові додатнє.
На кожному кроці циклу ми змінну students зменшуємо на 1, щоб не піти в нескінченний

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


цикл, коли умова завжди буде істинною.
Розглянемо докладніше хід виконання програми.
На початку роботи програми змінна students дорівнює 3, потім потрапляємо в цикл
while, тому що умова rabbits > 0 буде істинною (поверне значення True).У тілі
циклу викликається функція print, яка відобразить на екрані поточне значення змінної
rabbits. Далі змінна зменшиться на 1 і знову відбудеться перевірка умови while, тобто
2 > 0 (поверне True). Потрапляємо в цикл і дії повторюються до тих пір, поки не дійдемо
до умови 0 > 0. В цьому випадку повернеться логічне значення False і цикл while не
спрацює.
Розглянемо наступний приклад:

while True:
text = input("Введіть число або стоп для виходу: ")
if text == "стоп":
print("Вихід з програми! До зустрічі!")
break # інструкція виходу з циклу
elif text == '1':
print("Число 1")
else:
print("Що це?!")

В результаті роботи програми отримаємо:

>>>
============ RESTART: C: \ Python35 -32 \ 5_4.py ===========
Введіть число або стоп для виходу: 4
Що це ?!
Введіть число або стоп для виходу: 1
Число 1
Введіть число або стоп для виходу: стоп
Вихід з програми! До зустрічі!
>>>

Програма виконується в нескінченному циклі, тому що True завжди є істиною.


Всередині циклу відбувається введення значення з клавіатури і перевірка введеного
значення. Інструкція break здійснює вихід з циклу.
У подібних програмах необхідно уважно стежити за перетворенням типів даних.

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

s = 'aa3aBbb6ccc'
total = 0
for i in range(len(s)):
if s[i].isalpha(): # посимвольно перевіряємо наявність літери
continue # інструкція переходу до наступного кроку циклу
total = total + int(s[i]) # накопичуємо суму, якщо зустрілася цифра

print("сума чисел:",total)

Результат виконання:

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


>>>
======== RESTART: C: \ Python35-32 \ 5_5.py =======
сума чисел: 9
>>>

У прикладі демонструється використання інструкції continue. Виконання даної


інструкції призводить до переходу до наступного кроку циклу, тобто всі команди, які
знаходяться після continue, будуть проігноровані.

5.5 Анонімні функції (функція lambda)

Python не відноситься до функціональних мов програмування, але реалізує окремі


можливості функціонального стилю, наприклад дозволяє створювати лямбда вирази.

Розглянемо наступний приклад. Для початку визначимо функцію edit_story:

>>> def edit_story(words, func):


for word in words:
print(func (word))

Тепер необхідно визначити список і функцію, які будуть передаватися в якості


параметрів в edit_story:

>>> s = ['aaaaa', 'bbbbbb', 'cccccc'] # створили список


>>> def f(word):
return word.capitalize () + '!'
>>> edit_story (s, f) # викликали функцію і передали f
Aaaaa!
Bbbbbb!
Cccccc!
>>>

Замість створення окремої функції f запишемо лямбда-функцію всередині виклику


edit_story:

>>> edit_story (s, lambda word: word.capitalize () + '!')


Aaaaa!
Bbbbbb!
Cccccc!
>>>

5.6. Функція генератора

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


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

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


>>> def my_range(first = 0, last = 10, step = 1):
number = first
while number < last:
yield number
number += step

>>> my_range
<function my_range at 0x02DF6228>
>>> ranger = my_range (1, 5)

Бачимо, що функція my_range повернула об'єкт генератора:

>>> ranger
<generator object my_range at 0x02E00450>
>>> for i in ranger: print(i)

1
2
3
4
>>>

5.7 Вкладені цикли

Цикли можна вкладати один в одного.

outer = [1, 2, 3, 4] # зовнішній цикл


inner = [5, 6, 7, 8] # вкладений (внутрішній) цикл
for i in outer:
for j in inner:
print('i=',i, 'j=',j)

Результат роботи програми:

>>>
======= RESTART: C: \ Python35-32 \ 5_7.py ======
i= 1 j= 5
i= 1 j= 6
i= 1 j= 7
i= 1 j= 8
i= 2 j= 5
i= 2 j= 6
i= 2 j= 7
i= 2 j= 8
i= 3 j= 5
i= 3 j= 6
i= 3 j= 7
i= 3 j= 8

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


i= 4 j= 5
i= 4 j= 6
i= 4 j= 7
i= 4 j= 8
>>>

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


(фіксуємо i = 1), потім переходить до вкладеного циклу (змінна j) і проходимо по всіх
елементах вкладеного списку. Далі повертаємося до зовнішнього циклу (фіксуємо значення
i = 2) і знову проходимо по всіх елементах вкладеного списку. Так повторюємо до тих пір,
поки не закінчаться елементи в зовнішньому списку:

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

Спочатку приклад з одним циклом for:

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

for i in lst:
print(i)

Результат виконання програми:

>>>
====== RESTART: C: \ Python35-32 \ 5_8.py =======
[1, 2, 3]
[4, 5, 6]
>>>

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

lst = [[1, 2, 3],


[4, 5, 6]]

for i in lst: # цикл за елементами зовнішнього списку


print()
for j in i: # цикл по елементах елементів зовнішнього списку
print(j, end = "")

Результат виконання програми:

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


>>>
======= RESTART: C: \ Python35-32 \ 5_9.py ==== ===

123
456
>>>

5.8. Else в інструкції циклу

Інструкції циклів можуть мати відгалуження else. Воно виконується, коли цикл
виконав перебір до кінця (в разі for) або, коли умова стає помилковою (в разі while),
але не в тих випадках, коли цикл переривається по break.
Розглянемо наступний приклад розкладання числа на множники:

for n in range(2, 10):


for x in range(2, n):
if n % x == 0:
print(n, 'дорівнює', x, '*', n // x)
break
else:
# циклу не вдалося знайти множник
print(n, '- простечисло')

Результат виконання програми:

>>>
======== RESTART: C: \ Python35-32 \ 5_10.py =========
2 - просте число
3 - просте число
4 дорівнює 2 * 2
5 - просте число
6 дорівнює 2 * 3
7 - просте число
8 дорівнює 2 * 4
9 дорівнює 3 * 3
>>>

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


Вправи до лекції 5
Вправа 5.1
Знайдіть всі значення функції y (x) = x2 + 3 на інтервалі від 10 до 30 з кроком 2.
Вправа 5.2
L = [-8, 8, 6.0, 5, 'рядок', -3.1]
Визначити суму чисел, що входять до списку L. Підказка: для визначення типу об'єкта
можна скористатися порівнянням виду type (-8) == int.
Вправа 5.3
Дано список числових значень, що нараховує N елементів. Поміняйте місцями першу і
другу половини списку.
Вправа 5.4
Напишіть програму-гру. Комп'ютер загадує випадкове число, користувач намагається
його вгадати. Користувач вводить число до тих пір, поки не вгадає чи не введе слово «Вихід».
Комп'ютер порівнює число з введенням і дає знати користувачу більше воно чи менше
задуманого.
Вправа 5.5
Дано число, введене з клавіатури. Визначте суму квадратів непарних цифр в числі.
Вправа 5.6
Знайдіть суму чисел, що вводяться з клавіатури. Кількість чисел, що вводяться
заздалегідь невідомо. Закінчення введення, наприклад, слово «Стоп».
Вправа 5.7
Задано рядок з вірша Л. Костенко: «Уже в дітей порожевіли личка, Уже дощем
надихалась рілля. І скрізь трава, Травиченька, Травичка! І сонце сипле квіти, як з бриля!».
Видаліть з рядка всі слова, що починаються на букву «т». Результат вивести на екран у
вигляді рядка. Підказка: згадайте про модифікацію списків.
Вправа 5.8
Дан довільний текст. Знайдіть номер першого найдовшого слова в ньому.
Вправа 5.9
Дан довільний текст. Надрукуйте всі наявні в ньому цифри, визначте їх кількість, суму і
знайти максимальне.
Вправа 5.10
Створіть матрицю (список з вкладених списків) розміру N x M (фіксуються в програмі),
заповнену випадковими цілими числами.
Вправа 5.11
Створіть матрицю (список з вкладених списків) розміру N x N (фіксуються в програмі),
заповнену випадковими цілими числами.
Вправа 5.12
Дана матриця (див. Вправу 5.10). Вивести номер рядка, що містить максимальну
кількість однакових елементів.
Вправа 5.13
Дана цілочисельна квадратна матриця (див. Вправу 5.11). Знайти добуток елементів
матриці, що лежать нижче головної діагоналі.
Вправа 5.14
Дана цілочисельна квадратна матриця (див. Вправу 5.11). Знайти суму елементів матриці,
що лежать вище головної діагоналі.

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

You might also like