KATAS и вызовы (13 частей серии)
Описание задания
Изограмма – это слово, которое не имеет повторяющихся букв, последовательных или не подряд. Реализуйте функцию, которая определяет, содержит ли строка, которая содержит только буквы, представляет собой изограмму. Предположим, пустая строка – это изоляция. Игнорировать букв дело.
Isisogram ("дерматоглифы")
Возвращает правда
Isisogram («АБА»)
Возвращает ложь
Isisogram («лосью»)
Возвращает ложный
Задача решение
Тесты
Использование Pytest Framework Мы напишем тесты, чтобы покрыть следующие случаи:
- Делает
Типеррр
Поднять для неверного ввода - Сделайте нижний регистр, верхний регистр и смешанные строки корпуса, как и ожидалось?
- Что, если предоставляется пустая строка?
Эти условия приходится, тесты следующие:
import pytest; from isograms import is_isogram; # ./isograms.py def invalid_input_throws(): with pytest.raises(TypeError): is_isogram(1); def happy_path_tests(): assert is_isogram("Dermatoglyphics") == True; assert is_isogram("isogram") == True; assert is_isogram("aba") == False; assert is_isogram("moOse") == False; assert is_isogram("isIsogram") == False; assert is_isogram("") == True;
Реализация
Первоначально я пошел на простой подход, в результате чего я добавляю каждый символ в переменную кэш
Отказ Отсюда я петлю по строке и для каждого символа в строке я преобразую его в нижний регистр, и если это не в кэш, мы добавляем его, в противном случае, если оно уже в кэше, это не может быть изоляции и, следовательно, мы вернуть Ложь
Отказ Естественно, если контур заканчивается без возврата, мы возвращаем Правда
Поскольку он должен быть isoRaster. Реализация сначала была такой:
def is_isogram(string: str) -> bool: cache = {}; for char in string: lowerChar = char.lower(); if not lowerChar in cache: cache[lowerChar] = True; else: return False; return True;
Эта реализация в основном кода псевдо-код, но мы можем сделать лучше. Так как мы накрыли красные и зеленые части Красный, зеленый, рефтекторный цикл , настало время для рефакторов. Для этого я реализовал следующее:
def is_isogram(string: str) -> bool: characters = [char.lower() for char in string]; uniqueCharacters = set(characters); return True if len(characters) == len(uniqueCharacters) else False;
Эта реализация делает точно такой же, как первая версия, но в половине выложена кода. Я также думаю, что это немного более читаемый лично. Короче говоря, мы создаем персонажи
Массив состоит из нижних оборудованных символов в входной строке. Далее мы преобразуем массив на набор, если вы никогда не использовали набор раньше, он в основном просто коллекция или уникальные значения и в этом случае, это означает, что если наш массив имеет дублирующие значения, они будут удалены. Наконец, мы делаем именно в качестве последней строки функции: если персонажи
Массив такая же длина, как UniqueChisters
установить, то это должно быть изограм и мы должны вернуть Правда
Отказ В противном случае верните Ложь
Потому что это не может быть изограмма в первую очередь.
Выводы
Python – это язык, у меня есть отношения любви/ненависти, но одна вещь, которую я люблю в том, что это выразительный язык. Я особенно люблю то, как вы можете писать условные условные, такие как тот, который мы имеем в рекакторе, которые настолько читаются человеком, что ее почти глупо. На оборотной стороне модульная система и несогласованность деталей реализации языков несколько разыскивают мне, но в целом это мощный язык с хорошим сообществом.
Задача под рукой была довольно проста для разрешения, но мне понравилось завершение, тем не менее, особенно когда у меня было шанс посмотреть в Библиотека Timeit для тестов времени исполнения И мог видеть некоторую изменчивость в скорости на каждом прогоне, но почти во всех случаях оба реализация были довольно близко, обычно 7 секунд до 8 секунд, чтобы запускать каждую версию 1000,0000 раз.
Увидимся в следующем!
KATAS и вызовы (13 частей серии)
Оригинал: “https://dev.to/jamesrweb/kata-isograms-pkg”