итерация

  1. 5,1 Обновление переменных
  2. 5,2 В то время как заявление
  3. 5,3 Бесконечные петли
  4. 5,4 «Бесконечные петли» и разрыв
  5. 5,5 Завершение итераций продолжением
  6. 5,6 Определенные циклы, использующиеся для
  7. 5,7 Петли
  8. 5.7.1 Подсчет и суммирование циклов
  9. 5.7.2 Максимальные и минимальные петли
  10. 5,8 отладка
  11. 5,9 глоссарий
  12. 5,10 упражнения

5,1 Обновление переменных

Распространенным шаблоном в операторах присваивания является оператор присваивания, который обновляет переменную, где новое значение переменной зависит от старого. x = x + 1 Это означает «получить текущее значение x, добавить единицу, а затем обновить x новым значением».
Если вы попытаетесь обновить переменную, которая не существует, вы получите ошибку, потому что Python оценивает правую сторону перед тем, как присвоить значение x: >>> x = x + 1 NameError: name 'x' не определено ранее Вы можете обновить переменную, вы должны инициализировать ее, обычно с помощью простого присваивания:
>>> x = 0 >>> x = x + 1 Обновление переменной путем добавления 1 называется приращением ; вычитание 1 называется декрементом .

5,2 В то время как заявление

Компьютеры часто используются для автоматизации повторяющихся задач. Повторять одинаковые или похожие задачи без ошибок - это то, что компьютеры делают хорошо, а люди - плохо. Поскольку итерация очень распространена, Python предоставляет несколько языковых возможностей, чтобы упростить ее.
Одной из форм итерации в Python является оператор while. Вот простая программа, которая отсчитывает от пяти до «Blastoff!». n = 5, а n> 0: вывести n n = n-1, вывести «Blastoff!» Вы можете почти прочитать заявление while, как если бы оно было английским. Это означает: «Пока n больше 0, отобразите значение n, а затем уменьшите значение n на 1. Когда вы доберетесь до 0, выйдите из оператора while и отобразите слово Blastoff!»

Более формально, вот последовательность выполнения оператора while:

  1. Оцените состояние, получая True или False.
  2. Если условие ложно, выйдите из оператора while и продолжите выполнение со следующего оператора.
  3. Если условие истинно, выполнить тело и затем вернуться к шагу 1.

Этот тип потока называется циклом, потому что третий шаг возвращается к вершине. Каждый раз, когда мы выполняем тело цикла, мы называем это итерацией . Для вышеприведенного цикла мы бы сказали: «У него было пять итераций», что означает, что тело цикла было выполнено пять раз.

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

5,3 Бесконечные петли

Бесконечный источник удовольствия для программистов - это наблюдение, что указание на шампунь "Lather, rinse, repeat" является бесконечным циклом, потому что нет переменной итерации, сообщающей вам, сколько раз выполнить цикл.

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

5,4 «Бесконечные петли» и разрыв

Иногда вы не знаете, что пора заканчивать цикл, пока вы не пройдете половину тела. В этом случае вы можете специально написать бесконечный цикл, а затем использовать оператор break, чтобы выйти из цикла.
Этот цикл, очевидно, является бесконечным циклом, потому что логическое выражение в операторе while - это просто логическая константа True: n = 10, а True: print n, n = n - 1 print 'Done!' Если вы допустите ошибку и запустите этот код, вы быстро узнаете, как остановить запущенный процесс Python в вашей системе, или узнаете, где находится кнопка отключения питания на вашем компьютере. Эта программа будет работать вечно или до тех пор, пока не разрядится ваша батарея, потому что логическое выражение в верхней части цикла всегда истинно в силу того факта, что выражение является постоянным значением True.
Хотя это нефункциональный бесконечный цикл, мы все же можем использовать этот шаблон для создания полезных циклов, если мы аккуратно добавляем код в тело цикла, чтобы явно выйти из цикла, используя break, когда мы достигли условия выхода.
Например, предположим, что вы хотите принимать данные от пользователя, пока они не введут «done». Вы можете написать: while True: line = raw_input ('>'), если line == 'done': прервать печать строки print 'Done!' Условие цикла - True, что всегда верно, поэтому цикл выполняется несколько раз, пока не будет достигнут оператор break.
Каждый раз, когда это происходит, он предлагает пользователю угловую скобку. Если пользователь вводит команду done, оператор break выходит из цикла. В противном случае программа повторяет все, что пользователь вводит, и возвращается к началу цикла. Вот пример прогона:> привет там привет там> готово закончено> готово Готово! Этот способ записи циклов while является обычным, потому что вы можете проверить условие в любом месте цикла (не только сверху), и вы можете выразить условие остановки положительно («остановите, когда это произойдет»), а не отрицательно («продолжайте до тех пор, пока случается. ").

5,5 Завершение итераций продолжением

Иногда вы находитесь в итерации цикла и хотите завершить текущую итерацию и сразу перейти к следующей итерации. В этом случае вы можете использовать оператор continue для перехода к следующей итерации без завершения тела цикла для текущей итерации.
Вот пример цикла, который копирует свои входные данные до тех пор, пока пользователь не введет «done», но обрабатывает строки, начинающиеся с символа хеш-функции, как строки, которые не нужно печатать (вроде как комментарии Python). в то время как True: line = raw_input ('>'), если line [0] == '#': продолжить, если line == 'done': прервать печать строки print 'Done!' Вот пример запуска этой новой программы с добавлением продолжения. > привет там привет там> # не печатайте это> распечатайте это! распечатай это! > Готово Готово! Все строки печатаются, кроме той, которая начинается со знака хеша, потому что, когда выполняется continue, он завершает текущую итерацию и возвращается к оператору while, чтобы начать следующую итерацию, пропуская оператор печати.

5,6 Определенные циклы, использующиеся для

Иногда мы хотим перебрать ряд вещей, таких как список слов, строки в файле или список чисел. Когда у нас есть список вещей для прохождения цикла, мы можем создать определенный цикл, используя оператор for. Мы называем оператор while неопределенным циклом, потому что он просто зацикливается до тех пор, пока какое-то условие не станет ложным, тогда как цикл for проходит через известный набор элементов, поэтому он проходит столько итераций, сколько есть элементов в наборе.
Синтаксис цикла for аналогичен циклу while, в котором есть оператор for и тело цикла: friends = ['Joseph', 'Glenn', 'Sally'] для друга в друзьях: print 'Happy New Year: "Друг, печать" Готово! В терминах Python переменная friends - это список 1 из трех строк, и цикл for проходит по списку и выполняет тело один раз для каждой из трех строк в списке, что приводит к следующему выводу: С Новым годом: Джозеф С Новым годом: Гленн С Новым годом: Салли Готово! Перевод этого цикла for на английский язык не такой прямой, как while, но если вы думаете о друзьях как о наборе , он выглядит так: «Выполните инструкции в теле цикла for один раз для каждого друга в наборе с именем friends. ».
Глядя на цикл for, for и in являются зарезервированными ключевыми словами Python, а friend и friends являются переменными.
для друга в друзьях :
печать «С новым годом», друг
В частности, друг является итерационной переменной для цикла for. Переменная friend изменяется для каждой итерации цикла и управляет завершением цикла for. Переменная итерации последовательно проходит через три строки, хранящиеся в переменной друзей.

5,7 Петли

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

Мы будем использовать список чисел, чтобы продемонстрировать концепции и конструкцию этих шаблонов цикла.

5.7.1 Подсчет и суммирование циклов

Например, чтобы подсчитать количество элементов в списке, мы должны написать следующее для цикла: count = 0 для itervar в [3, 41, 12, 9, 74, 15]: count = count + 1 print 'Count: ', count Мы устанавливаем переменную count в ноль перед началом цикла, затем мы записываем цикл for для запуска списка чисел. Наша итерационная переменная называется itervar, и, хотя мы не используем itervar в цикле, она контролирует цикл и заставляет тело цикла выполняться один раз для каждого из значений в списке.
В теле цикла мы добавляем единицу к текущему значению count для каждого из значений в списке. Во время выполнения цикла значение count - это число значений, которые мы видели «до сих пор».
Как только цикл завершается, значением count является общее количество элементов. Общее число «падает на колени» в конце цикла. Мы строим цикл так, чтобы у нас было то, что мы хотим, когда цикл завершится.
Другой аналогичный цикл, который вычисляет сумму набора чисел, выглядит следующим образом: total = 0 для itervar в [3, 41, 12, 9, 74, 15]: total = total + itervar print 'Total:', total В этом Цикл мы используем переменную итерации . Вместо простого добавления единицы к счетчику, как в предыдущем цикле, мы добавляем фактическое число (3, 41, 12 и т. Д.) К промежуточному итогу во время каждой итерации цикла. Если вы думаете о переменной total, она содержит «промежуточную сумму значений до сих пор». Таким образом, перед началом цикла итоговое значение равно нулю, потому что мы еще не видели никаких значений, во время итогового значения цикла - это промежуточное итоговое значение, а в конце итогового значения цикла - общее итоговое значение всех значений в списке.
По мере выполнения цикла total накапливает сумму элементов; переменная, используемая таким образом, иногда называется аккумулятором .
Ни цикл подсчета, ни цикл суммирования не особенно полезны на практике, поскольку существуют встроенные функции len () и sum (), которые вычисляют количество элементов в списке и общее количество элементов в списке соответственно.

5.7.2 Максимальные и минимальные петли

Чтобы найти наибольшее значение в списке или последовательности, мы строим следующий цикл: large = None. Print 'Before:', самый большой для itervar в [3, 41, 12, 9, 74, 15]: если самым большим является None или itervar > наибольший: наибольший = itervar print 'Цикл:', итервар, наибольший вывод 'Наибольшее:', наибольший При выполнении программы вывод будет следующим: До: Нет Цикл: 3 3 Цикл: 41 41 Цикл: 12 41 Цикл: 9 41 Цикл: 74 74 Цикл: 15 74 Наибольший: 74 Наибольшую переменную лучше всего рассматривать как «наибольшее значение, которое мы видели до сих пор». Перед циклом мы устанавливаем наибольшее значение для константы None. None - это специальное постоянное значение, которое мы можем сохранить в переменной, чтобы пометить переменную как «пустую».
Перед началом цикла самое большое значение, которое мы видели, это None, поскольку мы еще не видели никаких значений. Во время выполнения цикла, если самым большим является None, то мы принимаем первое значение, которое мы видим как самое большое на данный момент. Вы можете увидеть в первой итерации, когда значение itervar равно 3, так как самым большим является None, мы сразу же установили самое большое равным 3.
После первой итерации самое большое больше не равно None, поэтому вторая часть составного логического выражения, которая проверяет itervar> Самый большой, запускается только тогда, когда мы видим значение, которое больше, чем «самое большое на данный момент». Когда мы видим новое «еще большее» значение, мы принимаем это новое значение за самое большое. В выводе программы вы можете видеть, что наибольший прогресс составляет от 3 до 41 до 74.
В конце цикла мы отсканировали все значения, и самая большая переменная теперь содержит самое большое значение в списке.
Чтобы вычислить наименьшее число, код очень похож с одним небольшим изменением: smalllest = Нет. Выведите «Before:», наименьшее для itervar в [3, 41, 12, 9, 74, 15]: если наименьшее - None или itervar < наименьший: наименьший = itervar print 'Loop:', itervar, наименьший отпечаток 'Smallest:', наименьший Опять наименьший - это "наименьший пока" до, во время и после выполнения цикла. Когда цикл завершен, наименьшее содержит минимальное значение в списке.
Как и при подсчете и суммировании, встроенные функции max () и min () делают ненужной запись этих точных циклов.
Ниже приведена простая версия встроенной функции Python min (): def min (значения): наименьшее = Нет для значения в значениях: если наименьшее - это Нет или значение <наименьшее: наименьшее = значение возвращает наименьшее В версии функции Наименьший код, мы удалили все операторы печати так, чтобы они были эквивалентны функции min, которая уже встроена в Python.

5,8 отладка

Когда вы начнете писать большие программы, вы можете потратить больше времени на отладку. Чем больше кода, тем больше шансов совершить ошибку и больше мест для ошибок.

Один из способов сократить время отладки - это «отладка путем деления пополам». Например, если в вашей программе 100 строк, и вы проверяете их по одной, это займет 100 шагов.
Вместо этого попробуйте разбить проблему пополам. Посмотрите на середину программы или рядом с ней, для промежуточного значения, которое вы можете проверить. Добавьте оператор печати (или что-то еще, что имеет проверяемый эффект) и запустите программу.
Если проверка средней точки неверна, проблема должна быть в первой половине программы. Если это правильно, проблема во второй половине.
Каждый раз, когда вы выполняете такую ​​проверку, вы вдвое сокращаете количество строк, которые вы должны искать. После шести шагов (что намного меньше 100) вы получите одну или две строки кода, по крайней мере, в теории.
На практике не всегда понятно, что такое «середина программы», и не всегда возможно это проверить. Не имеет смысла считать линии и находить точную середину. Вместо этого подумайте о местах в программе, где могут быть ошибки, и местах, где легко поставить чек. Затем выберите место, где, по вашему мнению, шансы примерно одинаковы с ошибкой до или после проверки.

5,9 глоссарий

аккумулятор:

переменная, используемая в цикле для суммирования или накопления результата.
counter: переменная, используемая в цикле для подсчета того, сколько раз что-то происходило. Мы инициализируем счетчик на ноль, а затем увеличиваем его каждый раз, когда хотим что-то «посчитать».
декремент: обновление, которое уменьшает значение переменной.
initialize: присваивание, которое дает начальное значение переменной, которая будет обновлена.
инкремент: обновление, которое увеличивает значение переменной (часто на единицу).
бесконечный цикл: цикл, в котором условие завершения никогда не выполняется или для которого нет условия завершения.
итерация: повторное выполнение набора операторов с использованием либо рекурсивного вызова функции, либо цикла.

5,10 упражнения


Упражнение 1Напишите программу, которая многократно читает цифры, пока пользователь не введет «готово».Как только введено «выполнено», распечатайте сумму, количество и среднее число.Если пользователь вводит что-либо, кроме числа, определите его ошибку, используя try and кроме, распечатайте сообщение об ошибке и перейдите к следующему номеру.Введите число: 4 Введите число: 5 Введите число: неверные данные Неверный ввод Введите число: 7 Введите число: выполнено 16 3 5.33333333333

Упражнение 2 Напишите другую программу, которая запрашивает список чисел, как указано выше, и в конце выводит как максимальное, так и минимальное число вместо среднего.


1

Мы рассмотрим списки более подробно в следующей главе Мы рассмотрим списки более подробно в следующей главе