Мова Програмування : PYTHON
УМОВНІ ОПЕРАТОРИ ТА ЦИКЛИ В PYTHON
ЗАНЯТТЯ 3
Кращий і найбільш швидкий спосіб навчитися програмувати - це почати, змінюючи деякі існуючі прості програми і поступово зрозуміти, як все це працює. Розглянемо код з використанням умовних операторів та циклів.
Вкладки і відступи
Програмісти мають певний стиль викладання свого коду, щоб зробити його простішим для розуміння. В C для Arduino, блоки коду всередині функції або оголошення if роблять з відступом, щоб ви могли побачити, які рядки коду належать даній команді або функції. В Python це не є питанням особистих забаганок, бо Python наполягає на цьому.
В Python, немає { або }, щоб показати початок і кінець блоку коду, ви повинні використовувати відступи, щоб показати, які рядки повинні бути разом. Так, наприклад, виглядає фрагмент коду для керування сигналами на виводах Raspberry Pi (RPi):
В Python, немає { або }, щоб показати початок і кінець блоку коду, ви повинні використовувати відступи, щоб показати, які рядки повинні бути разом. Так, наприклад, виглядає фрагмент коду для керування сигналами на виводах Raspberry Pi (RPi):
while True :
GPIO.output(control_pin, False)
time.sleep(5)
GPIO.output(control_pin, True)
time.sleep(2)
print("Finished")
GPIO.output(control_pin, False)
time.sleep(5)
GPIO.output(control_pin, True)
time.sleep(2)
print("Finished")
Це цикл while (подібно до while в C для Arduino). У даному випадку умова True. Значення True завжди True, тому цикл триватиме вічно. В кінці першого рядка є двокрапка (:). Відступ вказує, що далі буде йти блок коду. Таким чином, відступ в Python є тим самим, що в C для Arduino, але немає маркера закриття.
Рядки всередині блоку повинні мати однаковий відступ з наведеним вище рядком. Поки ви послідовні, не має значення, скільки пробілів (чи символів табуляції) використали для відступу в коді. Більшість програмістів, як правило, використовують чотири пробіли для кожного рівня відступу, або один символ табуляції, але рекомендується користуватися чимось одним.
Оскільки код з відступом перетворюється в блок, то, відповідно, блоком називають один або кілька поруч розміщених рядків з однаковим відступом. Відступ організує код не лише візуально, але і логічно: блок - єдина конструктивна одиниця.
Замість маркера в кінці блоку ви просто перестаєте робити відступи коду. Таким чином, в попередньому прикладі остання команда print вже поза циклом. Оскільки цикл while триває вічно, то цей останній рядок насправді ніколи не отримає можливості для запуску.
Рядки всередині блоку повинні мати однаковий відступ з наведеним вище рядком. Поки ви послідовні, не має значення, скільки пробілів (чи символів табуляції) використали для відступу в коді. Більшість програмістів, як правило, використовують чотири пробіли для кожного рівня відступу, або один символ табуляції, але рекомендується користуватися чимось одним.
Оскільки код з відступом перетворюється в блок, то, відповідно, блоком називають один або кілька поруч розміщених рядків з однаковим відступом. Відступ організує код не лише візуально, але і логічно: блок - єдина конструктивна одиниця.
Замість маркера в кінці блоку ви просто перестаєте робити відступи коду. Таким чином, в попередньому прикладі остання команда print вже поза циклом. Оскільки цикл while триває вічно, то цей останній рядок насправді ніколи не отримає можливості для запуску.
Ще раз про змінні
Змінні в Python такі, як і в C для Arduino, але відрізняються тим, що коли ви вперше використовуєте змінну, вам не треба вказувати є це int чи float, або ще щось. Ви просто привласнюєте їй значення і немає нічого незвичного в тому , що ця змінна спочатку буде цілим числом, а потім, після переприсвоєння - рядком. Наприклад, наведений нижче код є абсолютно законним, але не дуже розумним:
a = 123.45
a = "message"
a = "message"
До речі, при призначенні рядкових змінних, ви можете використовувати як подвійні лапки (як в попередньому прикладі), так і одинарні.
Умовні конструкції з if
Python має структури if і else такі самі, як і в C для Arduino, але використовує двокрапку і відступи для позначення блоків коду всередині оголошення if:
if x > 10 :
print("x is big!")
else:
print("x is small")
print("x is big!")
else:
print("x is small")
Приклад програми:
# Пароль
# Демонструє використання конструкції if
print ('Ласкаво просимо до нас в "System Security Inc.". ')
print ('-- Security (Безпека) - наше друге ім’я\n')
password = input ("Введіть пароль: ")
if password == "secret":
print ("Дocтyп відкритий")
input ("\n\nHaтисни Enter, щоб вийти.")
# Демонструє використання конструкції if
print ('Ласкаво просимо до нас в "System Security Inc.". ')
print ('-- Security (Безпека) - наше друге ім’я\n')
password = input ("Введіть пароль: ")
if password == "secret":
print ("Дocтyп відкритий")
input ("\n\nHaтисни Enter, щоб вийти.")
Таблиця 3.1. Оператори порівняння
Можна порівнювати рядки: реэульта порівняння буде базуватися на алфавітному порядку. Так, наприклад, «апельсин» < «блоха» поверне True, тому що за алфавітом «апельсин» стоїть раніше «блоха» (ближче до початку словника).
Не можна порівнювати ціле число і рядок. Спробуйте перевірити умову 10 > «п’ять».
Не можна порівнювати ціле число і рядок. Спробуйте перевірити умову 10 > «п’ять».
Умовні конструкції if та else
# Пароль
# Демонструє використання конструкції if
print ('Ласкаво просимо до нас в "System Security Inc.". ')
print ('-- Security (Безпека) - наше друге ім’я\n')
password = input ("Введіть пароль: ")
if password == "secret":
print ("Дocтyп відкритий")
else:
print ("Дocтyп закритий")
input ("\n\nHaтисни Enter, щоб вийти.")
# Демонструє використання конструкції if
print ('Ласкаво просимо до нас в "System Security Inc.". ')
print ('-- Security (Безпека) - наше друге ім’я\n')
password = input ("Введіть пароль: ")
if password == "secret":
print ("Дocтyп відкритий")
else:
print ("Дocтyп закритий")
input ("\n\nHaтисни Enter, щоб вийти.")
Умова еlse повинна бути всередині того ж блоку, що і попередня конструкція з умовою if, тобто відступи для if і для еlse повинні бути однаковими. Візуально вони повинні бути на одному вертикальному рівні.
Як тільки в конструкції if з умовою elif чергова умова буде істинною, програма виконає відповідний блок коду і перейде до наступного виразу. Таким чином, якщо навіть істинні кілька умов, то виконується все рівно максимум один блок коду.
Не варто забувати про описані особливості в конструкціях, де одночасно може виконуватися кілька умов. Тоді підлягає виконанню перший в черзі блок з істинною умовою.
Таблиця 3.2. Оператори розгалуження – коротке резюме
Як тільки в конструкції if з умовою elif чергова умова буде істинною, програма виконає відповідний блок коду і перейде до наступного виразу. Таким чином, якщо навіть істинні кілька умов, то виконується все рівно максимум один блок коду.
Не варто забувати про описані особливості в конструкціях, де одночасно може виконуватися кілька умов. Тоді підлягає виконанню перший в черзі блок з істинною умовою.
Таблиця 3.2. Оператори розгалуження – коротке резюме
Створення циклів з використанням while
# Симулятор здачі заліку
#Демонструє роботу циклу while
print ("\tЛаскаво просимо в програму 'Здача заліку в КПІ'\n")
print ("Імітується розмова викладача і студента.")
print ("Спробуйте зупинити цей кошмар здачі заліку.\n")
response = ""
while response != "Добре, прийду на перескладання":
response = input ("Поясніть, чому так?\n")
print ("ОК, добре підготуйся.")
input ("\n\nHaтисни Enter, щоб вийти.")
#Демонструє роботу циклу while
print ("\tЛаскаво просимо в програму 'Здача заліку в КПІ'\n")
print ("Імітується розмова викладача і студента.")
print ("Спробуйте зупинити цей кошмар здачі заліку.\n")
response = ""
while response != "Добре, прийду на перескладання":
response = input ("Поясніть, чому так?\n")
print ("ОК, добре підготуйся.")
input ("\n\nHaтисни Enter, щоб вийти.")
Контроль над циклом whilе здійснює змінна керування. Це змінна, яка фігурує в умові: її співставляють з деяким значенням або значеннями. Змінну керування треба ініціалізувати. Як правило, ініціалізація виконується безпосередньо перед початком циклу:
response = ""
В нашому випадку, змінну керування response прирівняли до пустого рядка "". Можна було б зробити початковим значенням response будь-яке слово і програма працювала б так само.
Переконайтеся, що умова циклу whilе спочатку хибна. В іншому випадку, тіло циклу ніколи не буде виконане.
Ще один приклад безкінечного циклу:
Переконайтеся, що умова циклу whilе спочатку хибна. В іншому випадку, тіло циклу ніколи не буде виконане.
Ще один приклад безкінечного циклу:
counter = 0
while counter <= 10
print (counter)
while counter <= 10
print (counter)
Запам’ятайте: виконання циклічного коду повинно змінювати (хоча б в деяких випадках) значення змінної керування. В іншому випадку ви отримаєте цикл без кінця.
Знову безкінечний цикл:
# Приклад логічної помилки в циклі
# Демонструє цикл без кінця, який так ненавидять програмісти
print ("Студент зайшов в магазин, щоб зробити покупки на всі свої гроші \n")
cash = 10
purchases = 0
purchase_price = 3
while cash != 0:
purchases += 1
cash -= purchase_price
print ("От він вже поклав в корзину один товар, " \
"але, витратив ", purchase_price, "гривень. \n")
print ("Наш студент зробив ", purchases, "покупок.")
print ("Нарешті! Всі гроші «викинуті».")
input ("\n\nHaтисни Enter, щоб вийти.")
# Приклад логічної помилки в циклі
# Демонструє цикл без кінця, який так ненавидять програмісти
print ("Студент зайшов в магазин, щоб зробити покупки на всі свої гроші \n")
cash = 10
purchases = 0
purchase_price = 3
while cash != 0:
purchases += 1
cash -= purchase_price
print ("От він вже поклав в корзину один товар, " \
"але, витратив ", purchase_price, "гривень. \n")
print ("Наш студент зробив ", purchases, "покупок.")
print ("Нарешті! Всі гроші «викинуті».")
input ("\n\nHaтисни Enter, щоб вийти.")
Безкінечний цикл зупиняємо через натискання Ctr + C, а потім виконуємо ручне трасування та виправляємо помилку.
Значення як умова
# Метрдотель
# Демонструє умовну інтерпретацію значень
print ("Ласкаво просимо в Шато-де-Перекусити!")
print ("Здається, сьогодні ввечері у нас немає вільного столика.\n")
money = int(input("Cкільки гривень ви можете дати метрдотелю на чай? "))
if money:
print ("Вибачаюсь, мені зараз повідомили, що є один вільний столик. \
Сюди, будь ласка.")
else:
print ("Присядьте, будьте такі ласкаві. Доведеться почекати.")
input ("\n\nHaтисни Enter, щоб вийти.")
# Демонструє умовну інтерпретацію значень
print ("Ласкаво просимо в Шато-де-Перекусити!")
print ("Здається, сьогодні ввечері у нас немає вільного столика.\n")
money = int(input("Cкільки гривень ви можете дати метрдотелю на чай? "))
if money:
print ("Вибачаюсь, мені зараз повідомили, що є один вільний столик. \
Сюди, будь ласка.")
else:
print ("Присядьте, будьте такі ласкаві. Доведеться почекати.")
input ("\n\nHaтисни Enter, щоб вийти.")
Використання команд break і continue
# Привередливий цикл
# Демонструє роботу команд break і continue
count = 0
while True:
count += 1
# завершити цикл, якщо count приймає значення більше 10
if count > 10 :
break
# пропустити 5
if count == 5:
continue
print (count)
input ("\n\nHaтисни Enter, щоб вийти.")
# Демонструє роботу команд break і continue
count = 0
while True:
count += 1
# завершити цикл, якщо count приймає значення більше 10
if count > 10 :
break
# пропустити 5
if count == 5:
continue
print (count)
input ("\n\nHaтисни Enter, щоб вийти.")
В прикладі цикл організований умовою:
while True:
Це значить, що цикл буде продовжуватися доти, поки команда в самому тілі циклу не завершить його при якій-небуть умові.
Цикл for
В циклах з оператором for також циклічне виконання коду, але не на базі умови. В фундаменті циклу for лежить послідовність - впорядкована множина об’єктів.
На відміну від традиційної моделі, в мові Python цикл for має більшу гнучкість, тому що дозволяє організувати перебирання будь-якої послідовності.
Цикл for перебирає всі елементи послідовності один за одним і для кожного з них виконує фрагмент коду, який знаходиться в тілі циклу. Після досягнення кінця послідовності цикл завершується.
На відміну від традиційної моделі, в мові Python цикл for має більшу гнучкість, тому що дозволяє організувати перебирання будь-якої послідовності.
Цикл for перебирає всі елементи послідовності один за одним і для кожного з них виконує фрагмент коду, який знаходиться в тілі циклу. Після досягнення кінця послідовності цикл завершується.
# Літери із слова
# Демонструє застосування циклу for до рядка
word = input ("Введіть слово: ")
print("\nОт всі літери вашого слова одну за одною: ")
for letter in word :
print (letter)
input("\n\nHaтисни Enter, щоб вийти.")
# Демонструє застосування циклу for до рядка
word = input ("Введіть слово: ")
print("\nОт всі літери вашого слова одну за одною: ")
for letter in word :
print (letter)
input("\n\nHaтисни Enter, щоб вийти.")
Підрахунок за допомогою циклу for
# Підрахунок
# Демонструє використання функції range()
print("Порахуємо: ")
for i in range(10):
print (i, end=" ")
print("\n\nПерерахуємо кратні п’яти: ")
for i in range(0, 50, 5):
print (i, end=" ")
print("\n\nПoрахуємо в зворотному порядку: ")
for i in range(10, 0, -1):
print (i, end=" ")
input("\n\nHaтисни Enter, щоб вийти.\n")
# Демонструє використання функції range()
print("Порахуємо: ")
for i in range(10):
print (i, end=" ")
print("\n\nПерерахуємо кратні п’яти: ")
for i in range(0, 50, 5):
print (i, end=" ")
print("\n\nПoрахуємо в зворотному порядку: ")
for i in range(10, 0, -1):
print (i, end=" ")
input("\n\nHaтисни Enter, щоб вийти.\n")
Узагальнені змінні-лічильники для перебору чисел в циклах прийнято позначати i, j, k. Зазвичай імена змінних вибираються так, щоб із них була зрозуміла суть позначених даних. Тому будь-який досвідчений програміст, переглянувши ваш код, відразу зрозуміє, що змінна i, j або k - лічильник циклу.
Приклад. Щоб десять раз вивести на екран слово «Привіт!», досить написати два рядки коду:
Приклад. Щоб десять раз вивести на екран слово «Привіт!», досить написати два рядки коду:
for _ in range(10):
print ("Привіт! ")
print ("Привіт! ")
Програма «Аналізатор тексту»
# Аналізатор тексту
# Демонструє роботу функції len() і оператора in
message = input("Введіть текст: ")
print("\nДовжина введеного вами тексту складає: ", len(message))
print("\nНайчастіша приголосна, ‘т’, ")
if "т" in message:
print ("зустрічається у вашому тексті.")
else :
print("нe зустрічається у вашому тексті.")
input("\n\nHaтисни Enter, щоб вийти.")
# Демонструє роботу функції len() і оператора in
message = input("Введіть текст: ")
print("\nДовжина введеного вами тексту складає: ", len(message))
print("\nНайчастіша приголосна, ‘т’, ")
if "т" in message:
print ("зустрічається у вашому тексті.")
else :
print("нe зустрічається у вашому тексті.")
input("\n\nHaтисни Enter, щоб вийти.")
Оператор in можете застосовуватися всюди, де необхідно дізнатися, чи є членом послідовності який-небудь елемент. Достатньо написати ім’я змінної, яке має цей елемент, потім in та ім’я послідовності і отримаєте умову. Якщо елемент – член послідовності, то умова буде істинною, а якщо ні, то хибною.
За допомогою циклу for можна перебирати один за одним символи рядка. Це так званий послідовний доступ до елементів.
За допомогою циклу for можна перебирати один за одним символи рядка. Це так званий послідовний доступ до елементів.
Програма «Випадкові букви»
# Випадкові букви
# Демонструє індексацію рядків
import random
word = "індекс"
print("У змінній word зберігається слово: ", word, "\n")
high = len(word)
low = -len(word)
for i in range(10):
position = random.randrange(low, high)
print ("word[", position, "]\t", word[position])
input("\n\nHaтисни Enter, щоб вийти.")
# Демонструє індексацію рядків
import random
word = "індекс"
print("У змінній word зберігається слово: ", word, "\n")
high = len(word)
low = -len(word)
for i in range(10):
position = random.randrange(low, high)
print ("word[", position, "]\t", word[position])
input("\n\nHaтисни Enter, щоб вийти.")
Отримати доступ до окремого символу рядка дуже легко. Букву, яка знаходиться в змінній word в позиції 0, позначають просто word[0]. Це правильно і для будь-якої іншої позиції: досить замінити 0 відповідним числом.
Програма «Лише приголосні»
# Лише приголосні
# Демонструє, як створювати нові рядки з первинних за допомогою циклу for
message = input("Введіть текст: ")
new_message = ''
VOWELS = "аеiouаеєиоуіюя"
print()
for letter in message:
if letter.lower() not in VOWELS:
new_message += letter
print("Створений новий рядок: ", new_message)
print("\nОт ваш текст без голосних букв: ", new_message)
input("\n\nHaтисни Enter, щоб вийти.")
# Демонструє, як створювати нові рядки з первинних за допомогою циклу for
message = input("Введіть текст: ")
new_message = ''
VOWELS = "аеiouаеєиоуіюя"
print()
for letter in message:
if letter.lower() not in VOWELS:
new_message += letter
print("Створений новий рядок: ", new_message)
print("\nОт ваш текст без голосних букв: ", new_message)
input("\n\nHaтисни Enter, щоб вийти.")
Створення констант
Змінні з повністю прописних літер в іменах мають особливе значення. Вони називаються константам і посилаються на значення, які не планується змінювати (тобто на постійні величини).
Константи корисні для програміста з двох причин.
По-перше, вони роблять код зрозумілішим. Так, в наведеній програмі всюди, де треба звернутися до послідовності голосних букв, автор пише не "аеiоuаеєиоуіюя", а VOWELS. Якщо замість рядка користуватися ім’ям змінної, то зрозумілість програми виросте, адже, побачивши змінну, ви згадуєте, що вона значить, а який-небудь дивний рядок самим своїм виглядом може збентежити.
По-друге, константи економлять час набору і певним чином оберігають від описок, властивих повторному набору. Константи особливо корисні в тих випадках, коли вам доводиться мати справу з •довгими• значеннями, наприклад, з дуже великими числами і об’ємними рядками. Якщо одне і те ж незмінне значення зустрічається в коді в кількох місцях, то це привід створити константу.
Python дуже скрупульозний при роботі з рядками та символами. Інтерпретатор вважає, що "А" - не те ж саме, що "а". Оскільки константі VOWELS присвоєне рядкове значення, яке складається лише з букв в нижньому регістрі, варто переконатися, що оператор in співставляє зі зразком лише символи в нижньому регістрі. Для цього і потрібний запис letter.lower().
Наприклад, треба порівняти два рядкових значення: nаmе і winner, щоб побачити, чи співпадають вони; регістр неважливий. Тоді треба створити таку умову:
Константи корисні для програміста з двох причин.
По-перше, вони роблять код зрозумілішим. Так, в наведеній програмі всюди, де треба звернутися до послідовності голосних букв, автор пише не "аеiоuаеєиоуіюя", а VOWELS. Якщо замість рядка користуватися ім’ям змінної, то зрозумілість програми виросте, адже, побачивши змінну, ви згадуєте, що вона значить, а який-небудь дивний рядок самим своїм виглядом може збентежити.
По-друге, константи економлять час набору і певним чином оберігають від описок, властивих повторному набору. Константи особливо корисні в тих випадках, коли вам доводиться мати справу з •довгими• значеннями, наприклад, з дуже великими числами і об’ємними рядками. Якщо одне і те ж незмінне значення зустрічається в коді в кількох місцях, то це привід створити константу.
Python дуже скрупульозний при роботі з рядками та символами. Інтерпретатор вважає, що "А" - не те ж саме, що "а". Оскільки константі VOWELS присвоєне рядкове значення, яке складається лише з букв в нижньому регістрі, варто переконатися, що оператор in співставляє зі зразком лише символи в нижньому регістрі. Для цього і потрібний запис letter.lower().
Наприклад, треба порівняти два рядкових значення: nаmе і winner, щоб побачити, чи співпадають вони; регістр неважливий. Тоді треба створити таку умову:
name.lower() == winner.lower()
Ця умова істинна в усіх випадках, коли name і winner мають одну і ту ж послідовність букв, навіть і набраних в різних регістрах. Так, рядки "Вася" і "вася" з цієї точки зору співпадають. Те ж відноситься до рядків "ВАСЯ" і "вася", навіть для "ВаСя" і "вАсЯ".
Немає коментарів:
Дописати коментар