Це наш останній урок перед тим як ми почнемо працювати з вводом від користувача. Тобто наступні уроки будуть ще цікавішими…
Цикли
Отже, переходимо до циклів у Пітоні.
Вступ
Просто уявіть, що вам потрібно зробити так, щоб ваша програма виконала певно одну і ту ж саму дію 20 разів. Що ви у цьому випадку будете робити? Звичайно ви можете скопіювати один і то й же ж кусок коду 20 разів, і мати важко-читабельний код, вже не кажучи про її швидкість. Або натомість ви можете сказати комп’ютеру, щоб він повторював той самий кусочок коду між точкою А і точкою Б допоки ви самі не зупините його. У цьому випадку ми назвемо такий підхід циклом.
Цикл “while”
У наступному прикладі ви можете бачити цикл під назвою “while“:
Як ця програмка працює? Давайте пройдемось по ній тепер українською рядок в рядок:
А тепер давайте спробуємо відтворити процес нашого коду комп’ютером. Тобто що він думає про кожен рядочок нашої програми:
То ж, коли ви лише вивчаєте цикли, пробуйте думати про них у тому напрямку як описано вище, щоб краще зрозуміти їхню суть і те як інтерпретатор обробляє їх. Тепер загальна структура і деякі моменти циклу ‘while‘:
І накінець розробу циклу ‘while‘ приклад. Спробуйте в голові продумати те, як ‘пітон’ буде обробляти даний цикл і що в кінцевому результаті ви отримаєте на екрані після виконання даного прикладу. Якщо зовсім важко – тоді просто передрукуйте у свій файл і запустіть. Тоді спробуйте проаналізувати, чому вивід програми саме такий.
Пам’ятаєте, щоб написати свою програму, достатньо створити новий файл (у IDLE або текстовому редакторі на вибір), ввести код програми, і тоді запустити даний файл (пітон модуль) пітон інтерпретатором. Якщо виникаються труднощі – будь-ласка зверніться до наших попередніх уроків Інсталяція Пітона і Програми у Файлах.
Булеанівські (логічні) вирази (Булеан… що це?!?)
В попередній секції ми розглянули оператор циклу ‘while‘. Мабуть у вас виникло питання, а що це за такі вирази, що йдуть одразу за ключовим словом ‘while‘ і закінчуються двома крапками ‘:’ . Це логічні (або ще їх називають булеанівські) вирази.
Це математичний вираз. Для тих, хто не пам’ятає, або і ніколи не знав, коротко: логічний вираз означає певне питання, на яке можна відповісти лише з допомогою слів ТАК (True) або НІ (False).
Наприклад, якщо ви хочете сказати, що ви одного росту з вашим сусідом, тоді ваш логічний вираз був би:
І цей вираз був би правдивим (True). Якщо ж ви нижчий за вашого сусіда, тоді ви б сказали:
І цей вираз також був би правдивим. Проте, якщо б ви сказали, що:
Тоді результат даного виразу був би Хибним (False, ще можна сказати Негативним, Фальшивим, Неправдивим).
Так само працює наш цикл ‘while‘ з даним йому логічним виразом. Якщо логічний вираз є правдивим (True), лише тоді тіло цикла виконується. Знаючи це, тепер пройдемось по усіх існуючих логічних операторах (це символи, що представляють певну дію) у Пітоні, які використовуютсья у логічних виразах. Більшість дій ви уже знаєте зі шкільного курсу математики:
Оператор | Його Значення |
---|---|
< | менше ніж |
<= | менше ніж, або рівне |
> | більше ніж |
>= | більше ніж, або рівне |
!= | не рівне |
<> | не рівне (альтернативне позначення) |
== | дорівнює |
Зверніть увагу, не плутайте оператор ‘=‘ з оператором ‘==‘. ‘=‘ – присвоює значення змінній зліва від нього значення те, що є справа. А оператор ‘==‘ каже чи значення ліворуч дорівнює значенню праворуч, таким чином вертає True або False.
Умовні оператори
Ок, виглядає ніби ми більш-менш розібралися з ‘while‘ циклом. Якщо є питання, або щось не достатньо дедально пояснено у даному уроці – будь-ласка коментуйте зі скаргами, і я обов’язково оновлю урок, і відповім на кожен комент!
Тепер, рухаємось далі – до умовних операторів.
Умовні оператори використовуються там, де потрібно запускати частину коду лише при певних умовах, а не завжди. Вони якимось чином подібні до ‘while‘ циклу, який ми щойно проходили з вами. Адже тіло даного циклу запускається лише коли умова циклу задовольняється (тобто є правдивою, True). Проте, тіло умовного оператора запускається лише один раз. От і вся різниця
Найбільш поширеним умовним оператором у більшості мов програмування є оператор ‘if‘. І одразу до прикладу:
Це досить простий приклад, у якому ми скористалися змінною ‘x’. Їй спочатку присвоїли значення 1. А потім подивилися чи дійсно вона рівна 1, і якщо таки рівна, аж тоді роздрукували її значення на екран. Тобто оператор ‘if‘ у даному випадку просто перевірив чи значення змінної x рівне 1.
А тепер розглянемо загальну структуру побудови оператора ‘if‘:
Ще давайте розберем трохи складніший випадок з оператором ‘if‘ + цикл ‘while‘:
Виглядає не так просто? Ми ускладнили цей приклад тим, що використали умовний оператор ‘if‘ всередині циклу ‘while‘. Як бачимо, цикл буде запускати своє тіло 20 разів (n <= 20). Але рядочок ‘print i‘ не кожен раз запускається, а лише коли задовільняється умова оператора всередині, якого він знаходиться (i % 2 == 0). Пам’ятаєте, що означеє операція % ? Так, правильно, остача від ділення. Тобто, якщо остача від ділення значення змінної ‘i‘ на 2 є нуль (а це як ми знаємо з математики, означає що значенням буде парне число), лише тоді значення змінної ‘i‘ буде виведено на екран.
Тобто даний кусок коду друкує усі парні числа від 1 до 20. Тепер звучить просто?
‘else’ та ‘elif’ – Коли це не є Правдивим (True) виразом
Є багато варіантів використання ‘if‘ оператора. Але, що робити коли умова даного оператора є Хибною (False), тіло оператора відповідно не виконується, але ви хочете робити щось інше у цьому випадку?
Для таких випадків ми маємо доповнення до умовного оператору ‘else‘ та ‘elif‘.
‘else‘ просто каже комп’ютеру, що робити у випадку коли умова оператора ‘if‘ не задовольняється. Наприклад:
‘k‘ є меншим ніж п’ять, тому виконується код що є під оператором ‘else‘, а код, що є під ‘if‘ – ніколи не буде виконуватися у даному випадку.
Тепер ‘elif‘. Цей оператор є просто скороченнням для того щоб сказати ‘else if‘. Тобто він виконується не лише коли умова головного ‘if‘ оператора не задовольняється, але ще й коли його власна умова (так, elif повенен мати власну умову, логічний вираз, навідміну від оператора ‘else‘) задовольняється. Наприклад:
Зрозуміло, що ‘if‘ умова поверне False, тому Пітон піде дивитися, що ж там з ‘elif‘. Він перевірить умову ‘elif‘ (a < 8), яка у даному випадку задовольняється (є правдива), тому тіло оператора ‘elif‘ виконається!
Зверніть увагу, що як ‘if‘, так і ‘else‘ та ‘elif‘, мають своє власне тіло, код під ними що починається з відступів. Все що без відступів, вже не є частиною даних операторів.
Ще один приклад. Тепер з використанням усіх трьох операторів одночасно!
Тобто ми можемо мати скільки завгодно ‘elif‘ операторів. Але лише один ‘if‘, і не більше одного ‘else‘ оператора. Оператори виконується в порядку їх використання. Також ‘else‘ мусить бути в самому кінці як показано у прикладі зверху, після ‘if’ i ‘elif‘.
Також зверніть увагу, після кожного логічного виразу ми маємо двокрапку ‘:‘. Він є обов’язковим для того, щоб дати знати інтерпретатору що це кінець умови оператора і далі за ним слідує початок тіла умовного оператора (або оператора циклу).
Відступи
Ще раз хочу наголосити, що код який запускається якщо умови є задоволені (True), Повинен Починатися з Відступів. Це означає, що якщо ви хочете щоб Пітон запускав наступні 5 рядочків коду всередині ‘while’ циклу, ви повинні ставити певну (однакову, зазвичай 4 пробіли) кількість пробілів на початку кожного з тих 5 рядочків коду.
Загалом це хороша практика у кожній мові програмування ставити пробіли у вкладених блоках для покращення читабельності. Але в Пітоні це не просто для покращення вигляду коду, в Пітоні це обов’язкова умова і частина синтаксису мови.
Глянемо на наступний трохи більший приклад з відступами:
У даному прикладі є два важливих слова англійською мовою. 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
поправив