Part 4

Определенная итерация

Цикл while можно использовать, чтобы пройти по элементам списка, так же как мы использовали циклы while для прохода по строкам. Следующая программа выводит элементы списка, каждый на отдельной строке:

my_list = [3, 2, 4, 5, 2]

index = 0
while index < len(my_list):
    print(my_list[index])
    index += 1
Пример вывода

3 2 4 5 2

Это, конечно, работает, но это довольно сложный способ прохода по списку, потому что нужно использовать вспомогательную переменную index, чтобы помнить, на каком элементе списка вы находитесь. К счастью, Python предлагает более интуитивный способ прохода по спискам, строкам и другим похожим структурам.

Цикл for

Когда вы хотите пройти по некоторой готовой коллекции элементов, цикл Python for сделает это за вас. Например, цикл может пройти по всем элементам списка от первого до последнего.

При использовании цикла while программа заранее не "знает", сколько итераций выполнит цикл. Он повторяется, пока условие не станет ложным или пока из цикла не выйдут другим способом. Поэтому это относится к неопределенной итерации. В цикле for количество итераций определяется при настройке цикла, поэтому это относится к определенной итерации.

Идея в том, что цикл for берет элементы коллекции один за другим и выполняет одни и те же действия для каждого. Программисту не нужно беспокоиться о том, какой элемент обрабатывается в какой момент. Синтаксис цикла for выглядит так:

for <variable> in <collection>:
    <block>

Цикл for берет элемент из коллекции, присваивает его переменной, обрабатывает блок кода и переходит к следующему элементу. Когда все элементы коллекции обработаны, выполнение программы продолжается со строки после цикла.

Iterating through a list

Следующая программа выводит все элементы списка с помощью цикла for:

my_list = [3, 2, 4, 5, 2]

for item in my_list:
    print(item)
Пример вывода

3 2 4 5 2

По сравнению с примером в начале этого раздела, структура намного проще для понимания. Цикл for делает прямой проход по коллекции элементов очень простым.

Тот же принцип применим к символам в строке:

name = input("Please type in your name: ")

for character in name:
    print(character)
Пример вывода

Please type in your name: Grace G r a c e

Loading

Функция range

Часто вы знаете, сколько раз хотите повторить определенный фрагмент кода. Например, вы можете захотеть пройти по всем числам от 1 до 100. Функция range, подключенная к циклу for, сделает это за вас.

Есть несколько разных способов вызвать функцию range. Самый простой способ - передать функции только один аргумент, который обозначает конечную точку диапазона. Сама конечная точка исключается, как и со срезами строк. Другими словами, вызов функции range(n) предоставляет циклу диапазон от 0 до n-1:

for i in range(5):
    print(i)
Пример вывода

0 1 2 3 4

С двумя аргументами функция вернет диапазон между двумя числами. Функция range(a,b) предоставляет диапазон, начинающийся с a и заканчивающийся на b-1:

for i in range(3, 7):
    print(i)
Пример вывода

3 4 5 6

Наконец, третьим аргументом можно также указать размер шага, который диапазон делает между значениями. Вызов функции range(a, b, c) предоставляет диапазон, начинающийся с a, заканчивающийся на b-1 и изменяющийся на c на каждом шаге:

for i in range(1, 9, 2):
    print(i)
Пример вывода

1 3 5 7

Шаг также может быть отрицательным. Тогда диапазон будет идти в обратном порядке. Обратите внимание, что первые два аргумента здесь тоже поменяны местами:

for i in range(6, 2, -1):
    print(i)
Пример вывода

6 5 4 3

Loading

Из диапазона в список

Функция range возвращает объект диапазона, который во многом ведет себя как список, но на самом деле списком не является. Если попробовать вывести значение, которое возвращает функция, вы увидите только описание объекта диапазона:

numbers = range(2, 7)
print(numbers)
Пример вывода

range(2, 7)

Функция list преобразует диапазон в список. Список будет содержать все значения, которые есть в диапазоне. Курс Advanced Course in Programming, следующий за этим курсом, подробнее осветит эту тему.

numbers = list(range(2, 7))
print(numbers)
Пример вывода

[2, 3, 4, 5, 6]

Напоминание о требованиях автоматических тестов

До сих пор, когда упражнения просили вас писать функции, шаблоны выглядели так:

# Write your solution here
# You can test your function by calling it within the following block
if __name__ == "__main__":
    sentence = "it was a dark and stormy python"
    print(first_word(sentence))
    print(second_word(sentence))
    print(last_word(sentence))

С этого момента в шаблонах больше не будет напоминаний использовать блок if __name__ == "__main__". Однако автоматические тесты все равно будут требовать его использования, поэтому вам придется добавлять блок самостоятельно, когда вы тестируете функцию внутри главной функции своей программы.

Обратите внимание: некоторые упражнения, например упражнение Palindromes, которое будет в этом разделе, ожидают, что вы также напишете код, вызывающий написанную функцию. Этот код не следует помещать внутрь блока if __name__ == "__main__". Автоматические тесты не выполняют код внутри этого блока, поэтому ваше решение не будет полным, если вы поместите туда вызовы функций.

Loading
Loading
Loading
Loading

В этих упражнениях мы будем использовать списки как аргументы и возвращаемые значения. Это рассматривалось в предыдущем разделе, если вам нужно освежить это в памяти.

Loading
Loading
Loading

Поиск лучшего или худшего элемента в списке

Очень распространенная задача программирования - найти лучший или худший элемент в списке по некоторому критерию. Простое решение - использовать вспомогательную переменную, чтобы "помнить", какой из уже обработанных элементов был наиболее подходящим. Этот временный лучший выбор затем по очереди сравнивается с каждым элементом, и в конце итерации переменная содержит лучший элемент из всех.

Черновик, который пока не совсем компилируется:

best = initial_value # The initial value depends on the situation
for item in my_list:
    if item is better than best:
        best = item

# We now have the best one figured out!

Детали итогового кода программы зависят от типа элементов в списке, а также от критерия выбора лучшего (или худшего) элемента. Иногда может понадобиться больше одной вспомогательной переменной.

Немного потренируем этот метод.

Loading
Loading
Loading
Вы дошли до конца этого раздела! Перейти к следующему разделу:

Текущие баллы можно посмотреть в синем индикаторе в правом нижнем углу страницы.