Урок 4 – Цикли і Умовні оператори

Це наш останній урок перед тим як ми почнемо працювати з вводом від користувача. Тобто наступні уроки будуть ще цікавішими…

Цикли

Отже, переходимо до циклів у Пітоні.

Вступ

Просто уявіть, що вам потрібно зробити так, щоб ваша програма виконала певно одну і ту ж саму дію 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 рівні відступів у даному прикладі:

  1. кожен рядок у першому рівні починається без пробілів. Це головний програма, основний код і він запускається завжди!
  2. кожен рядок на другому рівні починається з чотирьох відступів. Коли там є ‘if‘ оператор або оператор циклу на першому рівні, все що є на другому рівні після цього – буде частиною того умовного оператора або оператора циклу. Аж допоки наступний рядок не почнеться без відступів, тобто буде частиною першого рівня.
  3. Кожен рядок на третьому рівні починається відповідно з 8 пробілів. В даному прикладі третій рівень – це в основному тіло умовного оператора ‘if‘ та його колег: ‘elif‘ i ‘else‘.
  4. І це може продовжуватися безкінечно, поки мізки в людини що пише код не закіплять і перестане розуміти що вона пише 🙂 Насправді у всьому треба шукати золоту середину, якщо у вас виходить більше ніж 5-10 вкладень, значить щось не так, і швидше за все можна краще переписати код.

І на завершення…

Є ще інший оператор циклу в Пітоні – ‘for‘, але його ми розберемо у одному з наступних уроків, після того як вивчимо що таке списки.

А наразі, можу вас привітати з успішним завершенням непростого уроку про цикли та умовні вирази і оператори в Пітоні!

В наступному уроці ми з вами перейдемо до вивчення функцій, та роботи з вводом від користувача. Буде цікаво!

Прошу коментувати з вашими питаннями, а також запитами для покращення уроку. Буду радий допомогти!

Коментарі:

  1. Доброго вечора.
    Урок 4 має деякі опечатки:
    – розділ Умовні оператори – після четвертого прикладу – другий абзац:
    “скороченнням” – лишня буква “н”
    “повенен” – вірно: “повинен”
    – розділ Відступи – рядок починається з цифри “1”:
    “Це головний програма…” – вірно: “Це головна програма…”

    Відповісти
  2. “дедально” – детально, “будь-ласка” – будь ласка

    Відповісти
  3. Дайте пару задач для самостійної роботи. Бажано вкінці кожного уроку.

    Відповісти
  4. Мій Ріс > Ріст Мого Сусіда- Закралась помилочка. Дуже подобається курс. Все доступно. Хотілось би більше прикладного матеріалу і завдань для виконання.

    Відповісти
  5. Перш за все Дякую за надані уроки!
    Вони написані доступно але, що головне, заставляють думати і аналізувати.

    В даному уроці № 4, як на мене, не вистачає більш детальної інформації про умови операторів(повинна бути одна умова, чи можуть бути декілька? яким чином їх зв’язати між собою?)

    Поверхнево пройшовшись відповідями гугла знайшов згадку про “and”(чесно кажучи пробував &, &&, що не хотіло працювати)

    Можливо у майбутніх уроках буде висвітлено відповідь на дані питання, тому заздалегіть прошу вибачити.

    Чому було би непогано приділити увагу даному питанню саме у цьому уроці?
    Через останній приклад.
    Чесно кажучи, мені не подобалося, що програма на цифри 5, 3 і 1 видавала одинакову відповідь “i<=5", хотілося окремо "i = 5" і окремо "i<5", а зхалтурити написавши "elif i ==5:" було не цікаво, а мої поверхневі знання по С++ виявились занадто С-ішними як для пітона:)

    Відповісти
  6. доброго вечора!
    Чи є різниця що ми ставим після слова print? адже на перших уроках ми писали print “….” а зараз вже print ‘…’

    дякую!)

    Відповісти
    • Різниці між подвійними лапками “” чи ординарними ” , як такої немає. Тільки варто зауважити що по практиці краще притримуватись одного варіанту на весь проект. Про це здається вже згадувалось в попередніх уроках, якщо я не помиляюсь 🙂

  7. “Це головний програма, основний код…” орфографія

    Відповісти
  8. Щось я не дуже розумію у кодах строку i = i + 1. Її враховує ще до того, як виконується print? Хіба без цієї строки буде не такий самий результат при запуску?

    i = 1
    while i <= 20:
    if i % 2 == 0:
    print i
    i = i + 1
    print 'done…'

    Відповісти
    • щоб цикл не був вічним треба щоб “i” росло на одиницю при кожній наступній ітерації. от і збільшуємо його цим виразом i = i + 1

  9. “приклда з відступами” приклад …

    Відповісти
  10. забув додати важливий момент, в нашому випадку іменно “,” після змінної “х” створює пробіл.

    Відповісти
    • пробіл після коми ні на що не впливає. а той пробіл додатковий доставляє функція print, вона автоматично додає пробіл між кожним аргументом розділеним комою.

      тому в прикладі можна забрати пробіл після знаку рівності. що і зробив

  11. як для мене, то пробіл після “print ‘x = ‘, x ” – є зайвим! оскільки він додає зайвого непотрібного відступу.

    x = 1
    if x == 1:
    print ‘x =’, x

    якщо помиляюсь, поясніть будь-ласка для чого він потрібен?

    Відповісти
  12. Ой вибач, я мав на увазі як за допомогою оператора for переписати цей код
    Як переписати цей код
    i = 0
    while i < 10:
    i = i + 1
    print i

    Відповісти
  13. Як переписати цей код
    i = 0
    while i < 10:
    i = i + 1
    print i

    з оператором if ?
    Ніяк не виходить.

    Відповісти
    • писати код не буду, бо користі з того тобі буде мало.

      натомість дам підказку. скористайся функцією range для генерації списку по якому пробігатись

  14. Доброго дня. Дякую Вам за прекрасний курс, розбираються навіть філологи)))
    Скажіть, у мене в цьому прикладі видає помилку, неправильний синтаксис, в чому може бути справа?
    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 у мене))

  15. А можна замість 4-х пробілів використовувати один TAB?
    Принаймні, у Sublime Text 2 та інших редакторах такий варіант проходить і це набагато зручніше.

    Дякую!

    Відповісти
    • якщо налаштувати редактор щоб вставляв під час табу 4 пробіла то так. інакше – не рекомендовано. таб відрізняється у різних платформах. відповідно ваш код може не працювати для іншого розробника

  16. Привіт, побачив помилку, 4 строка, має бути і.
    ——————————————————–
    1 ‘i’ тепер рівне 0
    2 Допоки ‘i’ є менше, ніж 10 робимо наступне:
    3 Робимо ‘i’ на 1 більше, ніж воно зараз є.
    4 Виводимо на екран значення ‘a’
    ———————————————————

    Відповісти
  17. І на завершення. В останньому прикладі з відступами.
    Віталіку, скажіть, будь ласка, чому для змінних “і = 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 – працює все ок
      переглянь можливо під час копі-пасту або перенабору допустив помилку

  18. Можливо, в нижче наведеному прикладі з “elif ” варто замінити “z” на “а”, бо не зрозуміло звідки взялась змінна “z”. Хоча дана програма буде працювати в обох випадках.

    a = 4
    if z > 50:
    print ‘this is wrong!’
    elif a < 8:
    print 'this is right!'

    Відповісти
    • Вношу поправки в попередній комент: даний приклад взагалі не працює на Python 2.7.5 він після всіляких матюків каже, що ‘z’ не визначений.

    • дійсно, знову зробив помарку, пофіксав! дякую!

  19. Можливо, я помиляюсь але в прикладі з ‘else‘ варто б замінити слово “більшим ” на слово “меншим”:

    ‘k‘ є більшим ніж п’ять, тому виконується код що є під оператором ‘else‘, а код, що є під ‘if‘ – ніколи не буде виконуватися у даному випадку.

    Відповісти
  20. В прикладі наведеному цей оператор “!=” збиває з пантелику:) Я вирішив, що “і факторіал” має дорівнювати 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

Опублікувати коментар

Ваша e-mail адреса не оприлюднюватиметься.

Ви не робот? ;) *