Лучший алгоритм решения задач по программированию на Python

По-прежнему актуальны споры о фактической пользе таких веб-сайтов по 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 наряду с тернарными операторами мы нашли наиболее лаконичный и пайтонический способ решения поставленной задачи. 

Читайте также:

Читайте нас в Telegram, VK и Яндекс.Дзен


Перевод статьи Luay Matalka: Best Way to Solve Python Coding Question

Предыдущая статья10 UX-трендов для мобильных приложений в 2021 году
Следующая статьяПочему стоит избегать динамических ссылок