По-прежнему актуальны споры о фактической пользе таких веб-сайтов по Python-программированию, как Codewars или Leetcode, и их роли в развитии профессиональных навыков разработчиков. Но несмотря на это, многие все равно прибегают к их помощи для подготовки к собеседованиям, улучшения своего мастерства и/или просто забавы ради. Так или иначе, но этим ресурсам определенно найдется место в жизни любого программиста Python или специалиста по данным.
В этой статье вам предлагается максимально эффективный подход к проработке вопросов по Python-программированию. Мы сформулируем относительно простую задачу, разработаем план с применением псевдокода и решим ее разными способами, начиная с самого простого.
Формулировка задачи
Задача: написать функцию, принимающую одно целочисленное значение и возвращающую сумму целых чисел от 0 до этого значения включительно. При использовании нецелочисленного значения функция должна возвращать 0.
Итак, при передаче функции числа 5 она вернет сумму целых чисел от 0 до 5 или (0+1+2+3+4+5), которая равняется 15. Если передаваемое значение относится к другому типу, отличному от целого числа, такому как строка или число с плавающей точкой и т. д., функция вернет 0.
Разработка плана
На первом этапе необходимо решить задачу, используя псевдокод. Он позволит спланировать действия без оглядки на синтаксис.
Попробуем что-нибудь в таком роде:
def add(num):
# если num целое число, то
# складываем числа от 0 до num и возвращаем сумму
# если num не является целым числом, то возвращаем 0
Sample inputs/outputs:
# input: 5, output: 15
# input: 'and', output: 0
Мы определили функцию add
, принимающую значение num
. Внутри нее в виде комментариев схематично прописываются шаги. Если передаваемое функции значение является целым числом, то мы складываем числа от 0 до этого значения включительно и затем возвращаем сумму. Если же оно не принадлежит к типу целых чисел — просто возвращаем 0. После этого прописываем несколько примеров конкретных входных данных для получения желаемого вывода.
Распишем подробнее следующий шаг псевдокода:
# складываем числа от 0 до num и возвращаем сумму
Это можно сделать несколькими способами. Как будет выглядеть псевдокод, если мы попробуем выполнить этот шаг с помощью цикла for
?
def add(num):
# если num целое число, то
# создаем переменную sum и присваиваем ей значение 0
# используем цикл for и перебираем числа от 0 до num
# обновляем значение sum, добавляя к нему num
# возвращаем sum
# если num не является целым числом, то возвращаем 0
Теперь постараемся справиться с задачей на основе разработанного плана!
Цикл for
С помощью цикла for
задача решается следующим образом:
def add(num):
# если num целое число, то
if type(num) == int:
# создаем переменную sum и присваиваем ей значение 0
sum = 0
# используем цикл for и перебираем числа от 0 до num
for x in range(num+1):
# обновляем значение sum
sum += x
# возвращаем sum
return sum
# если num не является целым числом, то возвращаем 0 else:
return 0
Проанализируем этот код.
Сначала с помощью функции type
проверяем, является ли передаваемое значение num
целым числом.
if type(num) == int:
Если тип — целое число, создаем переменную sum
и присваиваем ей значение 0.
sum = 0
Затем с помощью цикла for
и функции range
перебираем целые числа от 0 до входного значения. Обратите внимание, что функция range
создает одноименный итерируемый объект, который начинается с 0 (если не указано конкретное начальное значение) и переходит к числу, меньшему, чем завершающее цикл значение (поскольку оно единственно возможное). Следовательно, к этому значению нужно прибавить 1 (num+1), так как требуется сложить все целые числа от 0 до num
включительно.
range
(start, stop[, step])
Функция range
создает итерируемый объект range
, что позволяет перебирать в нем элементы в цикле for
, прибавляя каждое число или x
к переменнойsum
.
for x in range(num+1):
sum += x
По завершению итераций функция возвращает sum
.
return sum
И наконец, если передаваемое функции значение не является целым числом, возвращаем 0.
else:
return 0
Вариант кода без комментариев.
def add(num):
if type(num) == int:
sum = 0
for x in range(num+1):
sum += x
return sum
else:
return 0
Протестировав функцию add
, получаем правильные результаты.
add(5)
# 15
add('and')
# 0
Избранный способ отлично справляется с данной задачей по программированию. Код выполняет свое назначение, легко читаем и работает должным образом. Но, предприняв попытку найти другие варианты достижения поставленной цели, мы извлечем для себя больше пользы, поскольку освежим знания Python и прокачаем навыки решения проблемных ситуаций. Эти приемы могут быть более или менее пайтонические, но в любом случае это интересный и полезный опыт поиска разных подходов к одной и той же задаче.
Итак, приступаем к новому способу решения.
Функция reduce
Функция reduce
принимает итерируемый объект и приводит его к единичному суммарному значению. У нее может быть 3 аргумента, два из которых являются обязательными: функция с 2 аргументами и итерируемый объект.
Вместо цикла for
воспользуемся reduce
для нахождения суммы итерируемого объекта и решения поставленной задачи.
from functools import reducedef
add(num):
if type(num) == int:
return reduce(lambda x,y: x+y, range(num+1))else:
return 0
Лямбда-функция служит в качестве аргумента, а объект range
используется как итерируемый объект. Reduce()
приводит range
к единичному суммарному значению sum
, которое мы возвращаем.
Тернарные операторы
С помощью тернарных операторов можно еще больше сократить код, оформив инструкцию if/else в одну строку следующим образом:
x if C else y
С — это условие, которое проверяется в первую очередь. Если оно True, то вычисляется x, иначе — y, после чего возвращаются соответствующие значения.
В коде это можно реализовать так:
def add(num):
return reduce(lambda x,y: x+y, range(num+1)) if type(num) == int else 0
Благодаря всем этим изменениям нам удалось сократить код внутри функции до одной строки. Возможно, это не самый читаемый и пайтонический способ решения, но тем не менее он способствует развитию навыков программирования за счет обдумывания разных подходов к одной и той же проблеме.
Далее разберем еще один способ.
Функция sum()
Он состоит в применении встроенной функции Python — sum()
. Она принимает итерируемый объект и возвращает сумму его элементов. Возможен вариант с передачей начального значения, если его первично требуется добавить к элементам.
sum(iterable, start)
Опробуем эту функцию в деле:
def add(num):
return sum(range(num+1)) if type(num) == int else 0
Вероятно, это самый лучший способ справиться с задачей, поскольку код одновременно и максимально компактный, и легко читаемый. Кроме того, можно не сомневаться в его отличной производительности.
Заключение
В данной статье мы продемонстрировали, что решение задачи по Python разными способами улучшает навыки программирования за счет пополнения копилки знаний. Сформулировав задачу, мы рассмотрели этапы ее решения. Сначала наметили последовательность действий с помощью псевдокода, после чего реализовали задуманное разными способами, используя сначала цикл for
, а затем функцию reduce
. Применение тернарных операторов позволило еще больше подсократить код и при этом сохранить его читаемость. И наконец, благодаря встроенной функции sum
наряду с тернарными операторами мы нашли наиболее лаконичный и пайтонический способ решения поставленной задачи.
Читайте также:
- 7 библиотек Python для вашего первого проекта по науке о данных
- 80 практических вопросов по Python для собеседования
- Насколько С++ быстрее Python
Читайте нас в Telegram, VK и Яндекс.Дзен
Перевод статьи Luay Matalka: Best Way to Solve Python Coding Question