Це наш останній урок перед тим як ми почнемо працювати з вводом від користувача. Тобто наступні уроки будуть ще цікавішими…
Цикли
Отже, переходимо до циклів у Пітоні.
Вступ
Просто уявіть, що вам потрібно зробити так, щоб ваша програма виконала певно одну і ту ж саму дію 20 разів. Що ви у цьому випадку будете робити? Звичайно ви можете скопіювати один і то й же ж кусок коду 20 разів, і мати важко-читабельний код, вже не кажучи про її швидкість. Або натомість ви можете сказати комп’ютеру, щоб він повторював той самий кусочок коду між точкою А і точкою Б допоки ви самі не зупините його. У цьому випадку ми назвемо такий підхід циклом.
Цикл “while”
У наступному прикладі ви можете бачити цикл під назвою “while“:
1 2 3 4 |
i = 0 while i < 10: i = i + 1 print i |
Як ця програмка працює? Давайте пройдемось по ній тепер українською рядок в рядок:
1 2 3 4 |
'i' тепер рівне 0 Допоки 'i' є менше, ніж 10 робимо наступне: Робимо 'i' на 1 більше, ніж воно зараз є. Виводимо на екран значення 'i' |
А тепер давайте спробуємо відтворити процес нашого коду комп’ютером. Тобто що він думає про кожен рядочок нашої програми:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
Є 'i' менше, ніж 10? ТАК (на першому колі циклу воно є 0) Збільшуємо значення змінної 'i' на один (і тепер воно рівне 1) Друкуємо значення змінної 'i' на екран (отримаємо 1) Є 'i' менше, ніж 10? ТАК (воно рівне 1) Збільшуємо значення змінної 'i' на один (і тепер воно рівне 2) Друкуємо значення змінної 'i' на екран (отримаємо 2) .... так ми проходимо аж до 9 ... Є 'i' менше, ніж 10? ТАК (воно рівне 9) Збільшуємо значення змінної 'i' на один (і тепер воно рівне 10) Друкуємо значення змінної 'i' на екран (отримаємо 10) Є 'i' менше, ніж 10? НІ (воно рівне 10) Тому цього разу тіло циклу 'while' не виконується Не залишилося коду для інтерпретатора для обробки, отже програма закінчується |
То ж, коли ви лише вивчаєте цикли, пробуйте думати про них у тому напрямку як описано вище, щоб краще зрозуміти їхню суть і те як інтерпретатор обробляє їх. Тепер загальна структура і деякі моменти циклу ‘while‘:
1 2 3 4 5 |
while {тут іде умова циклу при правдивості якої виконання циклу продовжується}: {це тіло циклу, воно виконується лише коли умова циклу наведена вище була True} {зверніть увагу, що тіло циклу починається з відступів, зазвичай 4 пробіли} {а код на цьому місці вже не буде в тілі циклу} {адже він не починається з відступів} |
І накінець розробу циклу ‘while‘ приклад. Спробуйте в голові продумати те, як ‘пітон’ буде обробляти даний цикл і що в кінцевому результаті ви отримаєте на екрані після виконання даного прикладу. Якщо зовсім важко – тоді просто передрукуйте у свій файл і запустіть. Тоді спробуйте проаналізувати, чому вивід програми саме такий.
1 2 3 4 5 6 |
i = 10 while i != 0: print i i = i - 1 print "i = ", i print "End of 'while' cycle" |
Пам’ятаєте, щоб написати свою програму, достатньо створити новий файл (у IDLE або текстовому редакторі на вибір), ввести код програми, і тоді запустити даний файл (пітон модуль) пітон інтерпретатором. Якщо виникаються труднощі – будь-ласка зверніться до наших попередніх уроків Інсталяція Пітона і Програми у Файлах.
Булеанівські (логічні) вирази (Булеан… що це?!?)
В попередній секції ми розглянули оператор циклу ‘while‘. Мабуть у вас виникло питання, а що це за такі вирази, що йдуть одразу за ключовим словом ‘while‘ і закінчуються двома крапками ‘:’ . Це логічні (або ще їх називають булеанівські) вирази.
Це математичний вираз. Для тих, хто не пам’ятає, або і ніколи не знав, коротко: логічний вираз означає певне питання, на яке можна відповісти лише з допомогою слів ТАК (True) або НІ (False).
Наприклад, якщо ви хочете сказати, що ви одного росту з вашим сусідом, тоді ваш логічний вираз був би:
1 |
Мій Ріст == Ріст Мого Сусіда |
І цей вираз був би правдивим (True). Якщо ж ви нижчий за вашого сусіда, тоді ви б сказали:
1 |
Мій Ріст < Ріст Мого Сусіда |
І цей вираз також був би правдивим. Проте, якщо б ви сказали, що:
1 |
Мій Ріс > Ріст Мого Сусіда |
Тоді результат даного виразу був би Хибним (False, ще можна сказати Негативним, Фальшивим, Неправдивим).
Так само працює наш цикл ‘while‘ з даним йому логічним виразом. Якщо логічний вираз є правдивим (True), лише тоді тіло цикла виконується. Знаючи це, тепер пройдемось по усіх існуючих логічних операторах (це символи, що представляють певну дію) у Пітоні, які використовуютсья у логічних виразах. Більшість дій ви уже знаєте зі шкільного курсу математики:
Оператор | Його Значення |
---|---|
< | менше ніж |
<= | менше ніж, або рівне |
> | більше ніж |
>= | більше ніж, або рівне |
!= | не рівне |
<> | не рівне (альтернативне позначення) |
== | дорівнює |
Зверніть увагу, не плутайте оператор ‘=‘ з оператором ‘==‘. ‘=‘ – присвоює значення змінній зліва від нього значення те, що є справа. А оператор ‘==‘ каже чи значення ліворуч дорівнює значенню праворуч, таким чином вертає True або False.
Умовні оператори
Ок, виглядає ніби ми більш-менш розібралися з ‘while‘ циклом. Якщо є питання, або щось не достатньо дедально пояснено у даному уроці – будь-ласка коментуйте зі скаргами, і я обов’язково оновлю урок, і відповім на кожен комент!
Тепер, рухаємось далі – до умовних операторів.
Умовні оператори використовуються там, де потрібно запускати частину коду лише при певних умовах, а не завжди. Вони якимось чином подібні до ‘while‘ циклу, який ми щойно проходили з вами. Адже тіло даного циклу запускається лише коли умова циклу задовольняється (тобто є правдивою, True). Проте, тіло умовного оператора запускається лише один раз. От і вся різниця 😉
Найбільш поширеним умовним оператором у більшості мов програмування є оператор ‘if‘. І одразу до прикладу:
1 2 3 |
x = 1 if x == 1: print 'x =', x |
Це досить простий приклад, у якому ми скористалися змінною ‘x’. Їй спочатку присвоїли значення 1. А потім подивилися чи дійсно вона рівна 1, і якщо таки рівна, аж тоді роздрукували її значення на екран. Тобто оператор ‘if‘ у даному випадку просто перевірив чи значення змінної x рівне 1.
А тепер розглянемо загальну структуру побудови оператора ‘if‘:
1 2 3 4 5 6 |
if {логічний вираз, умова оператора if, при якій виконується тіло даного оператора}: {це тіло нашого умовного оператора} {виконується лише якщо умова оператора справджується, є True} {зверніть увагу що тіло оператора також має відступи, зазвичай 4 пробіла} {а оце вже код поза нашим умовним оперетором, без відступів з початку рядка} {виконується незалежно від умови оператора, завжди} |
Ще давайте розберем трохи складніший випадок з оператором ‘if‘ + цикл ‘while‘:
1 2 3 4 5 6 |
i = 1 while i <= 20: if i % 2 == 0: print i i = i + 1 print 'done...' |
Виглядає не так просто? Ми ускладнили цей приклад тим, що використали умовний оператор ‘if‘ всередині циклу ‘while‘. Як бачимо, цикл буде запускати своє тіло 20 разів (n <= 20). Але рядочок ‘print i‘ не кожен раз запускається, а лише коли задовільняється умова оператора всередині, якого він знаходиться (i % 2 == 0). Пам’ятаєте, що означеє операція % ? Так, правильно, остача від ділення. Тобто, якщо остача від ділення значення змінної ‘i‘ на 2 є нуль (а це як ми знаємо з математики, означає що значенням буде парне число), лише тоді значення змінної ‘i‘ буде виведено на екран.
Тобто даний кусок коду друкує усі парні числа від 1 до 20. Тепер звучить просто? 🙂
‘else’ та ‘elif’ – Коли це не є Правдивим (True) виразом
Є багато варіантів використання ‘if‘ оператора. Але, що робити коли умова даного оператора є Хибною (False), тіло оператора відповідно не виконується, але ви хочете робити щось інше у цьому випадку?
Для таких випадків ми маємо доповнення до умовного оператору ‘else‘ та ‘elif‘.
‘else‘ просто каже комп’ютеру, що робити у випадку коли умова оператора ‘if‘ не задовольняється. Наприклад:
1 2 3 4 5 |
k = 1 if k > 5: print 'no chances!' else: print 'to be printed' |
‘k‘ є меншим ніж п’ять, тому виконується код що є під оператором ‘else‘, а код, що є під ‘if‘ – ніколи не буде виконуватися у даному випадку.
Тепер ‘elif‘. Цей оператор є просто скороченнням для того щоб сказати ‘else if‘. Тобто він виконується не лише коли умова головного ‘if‘ оператора не задовольняється, але ще й коли його власна умова (так, elif повенен мати власну умову, логічний вираз, навідміну від оператора ‘else‘) задовольняється. Наприклад:
1 2 3 4 5 |
a = 4 if a > 50: print 'this is wrong!' elif a < 8: print 'this is right!' |
Зрозуміло, що ‘if‘ умова поверне False, тому Пітон піде дивитися, що ж там з ‘elif‘. Він перевірить умову ‘elif‘ (a < 8), яка у даному випадку задовольняється (є правдива), тому тіло оператора ‘elif‘ виконається!
Зверніть увагу, що як ‘if‘, так і ‘else‘ та ‘elif‘, мають своє власне тіло, код під ними що починається з відступів. Все що без відступів, вже не є частиною даних операторів.
Ще один приклад. Тепер з використанням усіх трьох операторів одночасно!
1 2 3 4 5 6 7 8 |
if {логічний вираз 1}: {виконується якщо вираз 1 є True} elif {логічний вираз 2}: {виконується якщо вираз 2 є True} elif {логічний вираз 3}: {виконується якщо вираз 3 є True} else: {виконується якщо ніякий з попередніх виразів не є правдивим} |
Тобто ми можемо мати скільки завгодно ‘elif‘ операторів. Але лише один ‘if‘, і не більше одного ‘else‘ оператора. Оператори виконується в порядку їх використання. Також ‘else‘ мусить бути в самому кінці як показано у прикладі зверху, після ‘if’ i ‘elif‘.
Також зверніть увагу, після кожного логічного виразу ми маємо двокрапку ‘:‘. Він є обов’язковим для того, щоб дати знати інтерпретатору що це кінець умови оператора і далі за ним слідує початок тіла умовного оператора (або оператора циклу).
Відступи
Ще раз хочу наголосити, що код який запускається якщо умови є задоволені (True), Повинен Починатися з Відступів. Це означає, що якщо ви хочете щоб Пітон запускав наступні 5 рядочків коду всередині ‘while’ циклу, ви повинні ставити певну (однакову, зазвичай 4 пробіли) кількість пробілів на початку кожного з тих 5 рядочків коду.
Загалом це хороша практика у кожній мові програмування ставити пробіли у вкладених блоках для покращення читабельності. Але в Пітоні це не просто для покращення вигляду коду, в Пітоні це обов’язкова умова і частина синтаксису мови.
Глянемо на наступний трохи більший приклад з відступами:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
i = 10 while i > 0: print i if i > 5: print "Bigger than 5!" elif i % 2 != 0: print "this is ODD number" print "and i <= 5" else: print "i <= 5" print "this is EVEN number, not ODD" print "special number! :)" i = i - 1 print "we are after 'while' loop" print "the end" |
У даному прикладі є два важливих слова англійською мовою. ODD – це непарне число, EVEN – це парне число. Якщо виникатимуть проблеми з коментарями англійською чи певними словами, будь-ласка, звертайтеся до онлайн перекладача.
Зверніть увагу на 3 рівні відступів у даному прикладі:
- кожен рядок у першому рівні починається без пробілів. Це головний програма, основний код і він запускається завжди!
- кожен рядок на другому рівні починається з чотирьох відступів. Коли там є ‘if‘ оператор або оператор циклу на першому рівні, все що є на другому рівні після цього – буде частиною того умовного оператора або оператора циклу. Аж допоки наступний рядок не почнеться без відступів, тобто буде частиною першого рівня.
- Кожен рядок на третьому рівні починається відповідно з 8 пробілів. В даному прикладі третій рівень – це в основному тіло умовного оператора ‘if‘ та його колег: ‘elif‘ i ‘else‘.
- І це може продовжуватися безкінечно, поки мізки в людини що пише код не закіплять і перестане розуміти що вона пише 🙂 Насправді у всьому треба шукати золоту середину, якщо у вас виходить більше ніж 5-10 вкладень, значить щось не так, і швидше за все можна краще переписати код.
І на завершення…
Є ще інший оператор циклу в Пітоні – ‘for‘, але його ми розберемо у одному з наступних уроків, після того як вивчимо що таке списки.
А наразі, можу вас привітати з успішним завершенням непростого уроку про цикли та умовні вирази і оператори в Пітоні!
В наступному уроці ми з вами перейдемо до вивчення функцій, та роботи з вводом від користувача. Буде цікаво!
Прошу коментувати з вашими питаннями, а також запитами для покращення уроку. Буду радий допомогти!
Все доступно і цікаво…
Хотілось би більше практичних задач на самостійне опрацювання.
Доброго вечора.
Урок 4 має деякі опечатки:
– розділ Умовні оператори – після четвертого прикладу – другий абзац:
“скороченнням” – лишня буква “н”
“повенен” – вірно: “повинен”
– розділ Відступи – рядок починається з цифри “1”:
“Це головний програма…” – вірно: “Це головна програма…”
“дедально” – детально, “будь-ласка” – будь ласка
Дайте пару задач для самостійної роботи. Бажано вкінці кожного уроку.
Мій Ріс > Ріст Мого Сусіда- Закралась помилочка. Дуже подобається курс. Все доступно. Хотілось би більше прикладного матеріалу і завдань для виконання.
Перш за все Дякую за надані уроки!
Вони написані доступно але, що головне, заставляють думати і аналізувати.
В даному уроці № 4, як на мене, не вистачає більш детальної інформації про умови операторів(повинна бути одна умова, чи можуть бути декілька? яким чином їх зв’язати між собою?)
Поверхнево пройшовшись відповідями гугла знайшов згадку про “and”(чесно кажучи пробував &, &&, що не хотіло працювати)
Можливо у майбутніх уроках буде висвітлено відповідь на дані питання, тому заздалегіть прошу вибачити.
Чому було би непогано приділити увагу даному питанню саме у цьому уроці?
Через останній приклад.
Чесно кажучи, мені не подобалося, що програма на цифри 5, 3 і 1 видавала одинакову відповідь “i<=5", хотілося окремо "i = 5" і окремо "i<5", а зхалтурити написавши "elif i ==5:" було не цікаво, а мої поверхневі знання по С++ виявились занадто С-ішними як для пітона:)
доброго вечора!
Чи є різниця що ми ставим після слова print? адже на перших уроках ми писали print “….” а зараз вже print ‘…’
дякую!)
Різниці між подвійними лапками “” чи ординарними ” , як такої немає. Тільки варто зауважити що по практиці краще притримуватись одного варіанту на весь проект. Про це здається вже згадувалось в попередніх уроках, якщо я не помиляюсь 🙂
“Це головний програма, основний код…” орфографія
Щось я не дуже розумію у кодах строку i = i + 1. Її враховує ще до того, як виконується print? Хіба без цієї строки буде не такий самий результат при запуску?
i = 1
while i <= 20:
if i % 2 == 0:
print i
i = i + 1
print 'done…'
щоб цикл не був вічним треба щоб “i” росло на одиницю при кожній наступній ітерації. от і збільшуємо його цим виразом i = i + 1
“приклда з відступами” приклад …
дякую, поправив
забув додати важливий момент, в нашому випадку іменно “,” після змінної “х” створює пробіл.
пробіл після коми ні на що не впливає. а той пробіл додатковий доставляє функція print, вона автоматично додає пробіл між кожним аргументом розділеним комою.
тому в прикладі можна забрати пробіл після знаку рівності. що і зробив
як для мене, то пробіл після “print ‘x = ‘, x ” – є зайвим! оскільки він додає зайвого непотрібного відступу.
x = 1
if x == 1:
print ‘x =’, x
якщо помиляюсь, поясніть будь-ласка для чого він потрібен?
щойно перевірив. там немає пробілу
Ой вибач, я мав на увазі як за допомогою оператора for переписати цей код
Як переписати цей код
i = 0
while i < 10:
i = i + 1
print i
Як переписати цей код
i = 0
while i < 10:
i = i + 1
print i
з оператором if ?
Ніяк не виходить.
писати код не буду, бо користі з того тобі буде мало.
натомість дам підказку. скористайся функцією range для генерації списку по якому пробігатись
Доброго дня. Дякую Вам за прекрасний курс, розбираються навіть філологи)))
Скажіть, у мене в цьому прикладі видає помилку, неправильний синтаксис, в чому може бути справа?
i = 10
while i != 0:
print i
i = i – 1
print “i = “, i
print “End of ‘while’ cycle”
1. потрібно перевірити кількість відступів і чи часом немає десь використаних табів замість пробілів
2. яка версія мови пітон?
3. кидайте повний текст помилки, можливо щось підкажемо
Дякую за оперативну відповідь!
Версія Python 2.7.8 (якщо проблема у версії, то як її вирішити?)
Приклад копіювала, так що ніяких табів не використовувала.
Пише, що invalid syntax у мене))
потрібно повний код помилки
А можна замість 4-х пробілів використовувати один TAB?
Принаймні, у Sublime Text 2 та інших редакторах такий варіант проходить і це набагато зручніше.
Дякую!
якщо налаштувати редактор щоб вставляв під час табу 4 пробіла то так. інакше – не рекомендовано. таб відрізняється у різних платформах. відповідно ваш код може не працювати для іншого розробника
Привіт, побачив помилку, 4 строка, має бути і.
——————————————————–
1 ‘i’ тепер рівне 0
2 Допоки ‘i’ є менше, ніж 10 робимо наступне:
3 Робимо ‘i’ на 1 більше, ніж воно зараз є.
4 Виводимо на екран значення ‘a’
———————————————————
дякую! поправив
І на завершення. В останньому прикладі з відступами.
Віталіку, скажіть, будь ласка, чому для змінних “і = 9” та “і = 7” друкується фраза
“and i <= 5" (в коді восьма стрічка).
На жаль, я не знаю, що таке ODD, та все ж чому для змінної "і = 5" друкується "this is ODD number" та "this is EVEN number, not ODD" одночасно?
Що це за "special number! :)" ?
Повністю вибачаюсь за вище наведений коментар. Мої зауваження зовсім не доречні і даний приклад чудово працює за відсутності 14-ї стрічки “print”. А 15-а взагалі не друкується Python 2.7.5 видає, що в мене неправильний синтаксис.
P.S. просто не зовсім зрозумів “elif” , вирішив, що він обов’язково виконується після “if”.
я двічі перевірив приклад, вивід дає правильний, все працює згідно плану 🙂
щодо слів англійською – щойно додав там під прикладом пояснення
також перевірив на python 2.7 – працює все ок
переглянь можливо під час копі-пасту або перенабору допустив помилку
Можливо, в нижче наведеному прикладі з “elif ” варто замінити “z” на “а”, бо не зрозуміло звідки взялась змінна “z”. Хоча дана програма буде працювати в обох випадках.
a = 4
if z > 50:
print ‘this is wrong!’
elif a < 8:
print 'this is right!'
Вношу поправки в попередній комент: даний приклад взагалі не працює на Python 2.7.5 він після всіляких матюків каже, що ‘z’ не визначений.
дійсно, знову зробив помарку, пофіксав! дякую!
Можливо, я помиляюсь але в прикладі з ‘else‘ варто б замінити слово “більшим ” на слово “меншим”:
‘k‘ є більшим ніж п’ять, тому виконується код що є під оператором ‘else‘, а код, що є під ‘if‘ – ніколи не буде виконуватися у даному випадку.
дякую за зауваження, виправив!
В прикладі наведеному цей оператор “!=” збиває з пантелику:) Я вирішив, що “і факторіал” має дорівнювати 0. Мені довго довелось уявляти як виглядатиме результат;) ,можливо, варто замінити оператор “!=” на альтернативний “”.
І, останнє, чому: print “x = “, х а не print “x = “, і
начебто в програмі іксу нічого не присвоювалось.
i = 10
while i != 0:
print i
i = i – 1
print “x = “, x
print “And of ‘while’ cycle’
це більше стилістичні зауваження, дійсно є два варіанти як написати “не рівне”, я особисто надаю перевагу варіанту “!=” ніж знакам менше/більше
чого print “x = “, x це для виводу, щоб показати на екран що на даний момент змінна x рівна певному значенню, виведений на екран результат не несе змісту синтаксису мови, типу x присвоються значення
В одному з прикладів коду:
i = 10
while i != 0:
print i
i = i – 1
print “x = “, x
print “And of ‘while’ cycle’
print “And of ‘while’ cycle’
варто замінити на
print “And of ‘while’ cycle”
і використання x у цьому випадку print “x = “, x
видає NameError: name ‘x’ is not defined
поправив