Цикли for
Огляд
Викладання: 10 хв
Вправи: 15 хвПитання
Як змусити програму робити багато речей?
Цілі
Поясніть, для чого зазвичай використовуються цикли for.
Відстежуйте виконання простого (невкладеного) циклу та правильно вказуйте значення змінних у кожній ітерації.
Пишить цикли for, які використовують паттерн накопичувача для агрегування значень.
Цикл for виконує команди один раз для кожного значення в колекції.
- Виконувати обчислення для значень у списку одне за іншим
так само неприємно, як працювати з
pressure_001,pressure_002і так далі. - Цикл for повідомляє Python що треба виконати деякі оператори один раз для кожного значення в списку, рядку символів, або якісь іншій колекції.
- “для кожного елемента в цій групі виконайте ці операції”
for number in [2, 3, 5]:
print(number)
- Цей цикл
forє еквівалентним наступному:
print(2)
print(3)
print(5)
- І результат циклу
forє таким:
2
3
5
Цикл for складається з колекції, змінної циклу та тіла циклу.
for number in [2, 3, 5]:
print(number)
- Колекція
[2, 3, 5]є тим, на чому виконується цикл. - Тіло циклу,
print(number), визначає, що робити для кожного значення в колекції. - Змінна циклу,
number, змінюється для кожної ітерації циклу.- “Актуальне”.
Перший рядок циклу for має закінчуватися двокрапкою, а тіло циклу має бути з відступом.
- Двокрапка в кінці першого рядка вказує на початок блоку операторів.
- Python використовує відступ, а не
{}абоbegin/end, щоб показати вкладеність.- Будь-який послідовний відступ є допустимим, але майже усі використовують чотири пробіли.
for number in [2, 3, 5]:
print(number)
IndentationError: expected an indented block
- Відступи у Python завжди важливі.
firstName = "Jon"
lastName = "Smith"
File "<ipython-input-7-f65f2962bf9c>", line 2
lastName = "Smith"
^
IndentationError: unexpected indent
- Цю помилку можна виправити, видаливши зайві пробіли на початку другого рядка.
Змінні циклу можна називати як завгодно.
- Як і всі інші змінні, змінні циклу:
- Створюються коли потрібно.
- Не несуть смислового навантаження: їхні імена можуть бути будь-якими.
for kitten in [2, 3, 5]:
print(kitten)
Тіло циклу може містити багато операторів.
- Але жоден цикл не повинен мати довжину більше кількох рядків.
- Людям важко запам’ятати великі фрагменти коду.
primes = [2, 3, 5]
for p in primes:
squared = p ** 2
cubed = p ** 3
print(p, squared, cubed)
2 4 8
3 9 27
5 25 125
Використовуйте range для перебору послідовності чисел.
- Вбудована функція
rangeстворює послідовність чисел.- Це не список: числа виготовляються на замовлення щоб зробити цикл у великих діапазонах більш ефективним.
range(N)- це числа 0..N-1- Точно допустимі індекси списку або рядка символів довжиною N
print('a range is not a list: range(0, 3)')
for number in range(0, 3):
print(number)
a range is not a list: range(0, 3)
0
1
2
Патерн накопичувача перетворює багато значень в одне.
- Загальний паттерн у програмах:
- Ініціалізуйте накопичувальну змінну нулем, порожнім рядком або порожнім списком.
- Оновіть змінну значеннями з колекції.
# Знайдіть суму перших 10 цілих чисел.
total = 0
for number in range(10):
total = total + (number + 1)
print(total)
55
- Прочитайте
total = total + (number + 1)наступним чином:- Додати 1 до поточного значення змінної циклу
number. - Додати це до поточного значення накопичувальної змінної
total. - Призначити це
total, замінивши поточне значення.
- Додати 1 до поточного значення змінної циклу
- Ми маємо додавати
number + 1, тому щоrangeпродукує 0..9, а не 1..10.
Класифікація помилок
Помилка відступу є синтаксичною чи помилкою виконання?
Рішення
IndentationError є синтаксичною помилкою. Неможливо запустити програми з синтаксичними помилками. Програма з помилкою виконання запускається, але за певних умов видається помилка.
Відстеження виконання
Створіть таблицю з номерами рядків, які виконуються під час виконання цієї програми, і значення змінних після виконання кожного рядка.
total = 0 for char in "tin": total = total + 1Solution
Line no Variables 1 total = 0 2 total = 0 char = ‘t’ 3 total = 1 char = ‘t’ 2 total = 1 char = ‘i’ 3 total = 2 char = ‘i’ 2 total = 2 char = ‘n’ 3 total = 3 char = ‘n’
Перевертання рядка
Заповніть порожні місця в програмі нижче, щоб вона друкувала “nit” (зворотний вихідний рядок символів “tin”).
original = "tin" result = ____ for char in original: result = ____ print(result)Рішення
original = "tin" result = "" for char in original: result = char + result print(result)
Практика накопичення.
Заповніть пропуски в кожній із наведених нижче програм, щоб отримати вказаний результат
# Загальна довжина рядків у списку: ["red", "green", "blue"] => 12 total = 0 for word in ["red", "green", "blue"]: ____ = ____ + len(word) print(total)Рішення
total = 0 for word in ["red", "green", "blue"]: total = total + len(word) print(total)# Список довжин слів: ["red", "green", "blue"] => [3, 5, 4] lengths = ____ for word in ["red", "green", "blue"]: lengths.____(____) print(lengths)Рішення
lengths = [] for word in ["red", "green", "blue"]: lengths.append(len(word)) print(lengths)# Concatenate all words: ["red", "green", "blue"] => "redgreenblue" words = ["red", "green", "blue"] result = ____ for ____ in ____: ____ print(result)Рішення
words = ["red", "green", "blue"] result = "" for word in words: result = result + word print(result)# Створіть акронім: ["red", "green", "blue"] => "RGB" # Напишіть всю прграмуРішення
acronym = "" for word in ["red", "green", "blue"]: acronym = acronym + word[0].upper() print(acronym)
Кумулятивна сума
Змініть порядок і належним чином розставте рядки коду нижче щоб в результаті отримати список із сукупною сумою даних. Результатом має бути
[1, 3, 5, 10].cumulative.append(sum) for number in data: cumulative = [] sum += number sum = 0 print(cumulative) data = [1,2,2,5]Рішення
sum = 0 data = [1,2,2,5] cumulative = [] for number in data: sum += number cumulative.append(sum) print(cumulative)
Виявлення помилок імен змінних
- Прочитайте наведений нижче код і спробуйте визначити, у чому полягають помилки без запуску програми.
- Запустіть код і прочитайте повідомлення про помилку. Як ви думаєте, який це тип
NameError? Це рядок без лапок, змінна з орфографічною помилкою чи змінна, яка мала бути визначена, але не була визначена?- Виправте помилку.
- Повторюйте кроки 2 і 3, доки не виправите всі помилки.
for number in range(10): # use a if the number is a multiple of 3, otherwise use b if (Number % 3) == 0: message = message + a else: message = message + "b" print(message)Рішення
TЗмінну
messageпотрібно ініціалізувати, а назви змінних Python чутливі до регістру:numberіNumberпосилаються на різні змінні.message = "" for number in range(10): # use a if the number is a multiple of 3, otherwise use b if (number % 3) == 0: message = message + "a" else: message = message + "b" print(message)
Виявлення помилок програми
- Прочитайте наведений нижче код і спробуйте визначити, у чому полягають помилки без запуску програми.
- Запустіть код і прочитайте повідомлення про помилку. Який тип помилки?
- Виправте помилку.
seasons = ['Spring', 'Summer', 'Fall', 'Winter'] print('My favorite season is ', seasons[4])Рішення
Цей список складається з 4 елементів, а індекс для доступу до останнього елемента в списку – «3».
seasons = ['Spring', 'Summer', 'Fall', 'Winter'] print('My favorite season is ', seasons[3])
Ключові моменти
Цикл for виконує команди один раз для кожного значення в колекції.
Цикл
forскладається з колекції, змінної циклу та тіла.Перший рядок циклу
forмає закінчуватися двокрапкою, а тіло має бути з відступом.Відступи завжди важливі в Python.
Змінні циклу можна називати як завгодно (але настійно рекомендується мати значущу назву для змінної циклу).
Тіло циклу може містити багато операторів.
Використовуйте
rangeдля перебору послідовності чисел.Патерн накопичувача перетворює багато значень в одне.