Циклы for и while. Цикл for
Скачать 0.54 Mb.
|
Читабельность кодаСледует помнить, что наш код должен легко читаться другими программистами. Чтобы этого достичь, следует придерживаться стандарта PEP 8. Обращайте внимание на следующие моменты: отступы и пробелы: используйте 4 пробела на один уровень отступа и никогда не смешивайте символы табуляции и пробелы; названия переменных: используйте говорящие названия для переменных (total, counter, product) и следуйте стилю lower_case_with_underscores (слова из маленьких букв с подчеркиваниями); пустые строки: дополнительные отступы пустыми строками могут быть изредка полезны для выделения группы логически связанных частей программы: инициализация переменных, основной алгоритм, завершающая проверка и т.д.; комментарии: комментарии должны являться законченными предложениями. И помните, комментарии, которые противоречат коду, хуже, чем отсутствие комментариев. Всегда исправляйте комментарии, если меняете код! О стандарте PEP 8 на русском языке можно почитать тут. ПримечанияПримечание 1. Хорошие статьи о ревью кода можно почитать на хабре: статья 1, статья 2, статья 3. Примечание 2. Программные ошибки, часто называют багами 🦟 Примечание 3. Все программисты создают баги, особенно в начале своего карьерного пути. Это норма 😀 Примеры Пример 1. Требовалось написать программу, которая выводит символ А 10 раз. Вы ревьювите следующий код: print('A') print('A') print('A') print('A') print('A') print('A') print('A') print('A') print('A') print('A') Что вы о нем скажете? Правильно ли он работает? Как его улучшить? Ревью. Приведенный код выполняет поставленную задачу, однако его можно улучшить. Поскольку действия в строках одинаковые, то можно использовать цикл. Поскольку мы знаем количество повторений (итераций), то нам подходит цикл for: for _ in range(10): print('A') Пример 2. Требовалось написать программу которая должна вывести все числа от 1 до 100 кратные 7. Вы ревьювите следующий код: i = 1 while i < 101: if i % 7 == 0: print(i) i += 1 Что вы о нем скажете? Правильно ли он работает? Как его улучшить? Ревью. Приведенный код содержит достаточно распространенную ошибку: неверно поставленный отступ. Поскольку управление циклом while происходит при помощи переменной i, то ее необходимо инкрементировать (увеличивать) каждую итерацию. В приведенном коде она инкрементируется только если выполняется условие i % 7 == 0, которое ложно для начального значения i = 1. Таким образом, получаем бесконечный цикл. Для исправления ошибки необходимо удалить отступ у строки i += 1: i = 1 while i < 101: if i % 7 == 0: print(i) i += 1 В данном случае лучше использовать цикл for с шагом, равным 7. Это позволит сделать код более наглядным и сократит время выполнения программы, так как нет необходимости просматривать и проверять все числа на делимость на 7: for i in range(7, 101, 7): print(i) Пример 3. Требовалось написать программу которая выводит все числа от 100 до 1 в порядке убывания. Вы ревьювите следующий код: for i in range(1, 100): print(101 - i) Что вы о нем скажете? Правильно ли он работает? Как его улучшить? Ревью. Приведенный код содержит достаточно распространенную ошибку: неправильная правая граница цикла for. Следует помнить, что правая граница в цикле for всегда не включительна. Таким образом, для исправления ошибки необходимо заменить число 100 на 101: for i in range(1, 101): print(101 - i) В данном случае лучше использовать цикл for с шагом, равным -1: for i in range(100, 0, -1): print(i) Пример 4. Требовалось написать программу которая находит сумму всех нечетных чисел от 1 до 1000. Вы ревьювите следующий код: a = 1 for i in range(1, 1000): if i % 2 == 1: a = a + 1 print(a) Что вы о нем скажете? Правильно ли он работает? Как его улучшить? Ревью. Приведенный код содержит достаточно распространенные ошибки: неправильная начальная инициализация переменной a; неправильная правая граница цикла for; неправильно записанная операция накапливания значения суммы. a = 0 for i in range(1, 1001): if i % 2 == 1: a = a + i print(a) Для улучшения читабельности кода изменим название переменной a на total и используем расширенный оператор присваивания: total = 0 for i in range(1, 1001, 2): total += i print(total) Пример 5. Требовалось написать программу которая вычисляет факториал числа. Вы ревьювите следующий код: n = input() a = 0 for i in range(n): a = a * i print(a) Что вы о нем скажете? Правильно ли он работает? Как его улучшить? Ревью. Приведенный код содержит достаточно распространенные ошибки: отсутствие преобразования строки текста в целое число; неправильная начальная инициализация переменной a; неправильная работа с границами итерирования: переменная i принимает значения от 0 до n - 1. n = int(input()) a = 1 for i in range(1, n + 1): a = a * i print(a) Для улучшения читабельности кода, изменим название переменной a на factorial и используем расширенный оператор присваивания: n = int(input()) factorial = 1 for i in range(1, n + 1): factorial *= i print(factorial) В модуле math есть функция factorial(), которая вычисляет факториал числа. Поэтому вместо реализации своей версии, куда правильнее и удобнее воспользоваться уже готовой. |