Цикли for

Огляд

Викладання: 10 хв
Вправи: 15 хв
Питання
  • Як змусити програму робити багато речей?

Цілі
  • Поясніть, для чого зазвичай використовуються цикли for.

  • Відстежуйте виконання простого (невкладеного) циклу та правильно вказуйте значення змінних у кожній ітерації.

  • Пишить цикли for, які використовують паттерн накопичувача для агрегування значень.

Цикл for виконує команди один раз для кожного значення в колекції.

for number in [2, 3, 5]:
    print(number)
print(2)
print(3)
print(5)
2
3
5

Цикл for складається з колекції, змінної циклу та тіла циклу.

for number in [2, 3, 5]:
    print(number)

Перший рядок циклу for має закінчуватися двокрапкою, а тіло циклу має бути з відступом.

for number in [2, 3, 5]:
print(number)
IndentationError: expected an indented block
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 для перебору послідовності чисел.

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

Класифікація помилок

Помилка відступу є синтаксичною чи помилкою виконання?

Рішення

IndentationError є синтаксичною помилкою. Неможливо запустити програми з синтаксичними помилками. Програма з помилкою виконання запускається, але за певних умов видається помилка.

Відстеження виконання

Створіть таблицю з номерами рядків, які виконуються під час виконання цієї програми, і значення змінних після виконання кожного рядка.

total = 0
for char in "tin":
    total = total + 1

Solution

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)

Виявлення помилок імен змінних

  1. Прочитайте наведений нижче код і спробуйте визначити, у чому полягають помилки без запуску програми.
  2. Запустіть код і прочитайте повідомлення про помилку. Як ви думаєте, який це тип NameError? Це рядок без лапок, змінна з орфографічною помилкою чи змінна, яка мала бути визначена, але не була визначена?
  3. Виправте помилку.
  4. Повторюйте кроки 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)

Виявлення помилок програми

  1. Прочитайте наведений нижче код і спробуйте визначити, у чому полягають помилки без запуску програми.
  2. Запустіть код і прочитайте повідомлення про помилку. Який тип помилки?
  3. Виправте помилку.
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 для перебору послідовності чисел.

  • Патерн накопичувача перетворює багато значень в одне.