DevIO | IT | GameDev
31 subscribers
9 photos
3 videos
1 file
18 links
Привет! Я разработчик, а это мой авторский канал про АйТи и разработку.

Автор: Панкрашов Дмитрий
Сайт: https://dev-io.ru
Download Telegram
CodeWars #1

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

Например, CodeWars. Выбираете язык, сложность, и вперед. Есть еще LeetCode, HackerRank.

Когда-то я решал задачки на CodeWars, но потом надоело. Возможно, было бы неплохо снова к этому вернуться, чтобы заставить мозг поработать.

На сегодня предлагаю решение одной из задач.

Задача: Написать функцию, которая принимает массив из слов и склеивает их вместе в предложение, возвращая его. Нет необходимости проверять правильность строк со словами, очищать их, или добавлять пунктуацию, но вы должны добавить пробелы между словами. Будьте осторожны, пробелов в начале и конце предложения быть не должно!

Решение:
Самым банальным решением для такого сценария было бы написать цикл, однако в питоне у строки есть метод join(), который может принять в качестве аргумента список, и "склеить" элементы между собой, используя строку, на которой join был вызван.

",".join([1,2,3]) # 1,2,3


Используем это. По-хорошему, мы должны проверить, что переданный нам аргумент является списком, и что он не пуст.

Для этого, во-первых, используем функцию isinstance(), она принимает два аргумента. Первый - объект какого-то типа, второй - тип, на соответствие которому мы хотим проверить объект. Функция вернет True если тип совпадет, и False, если нет. Также мы проверим, что список не пустой. В Python пустой список автоматически приводим к False, что исключает необходимость проверять на пустоту путём сравнения длины списка с нулём.

Итоговая функция на картинке к посту.

#codewars #python
👍1
CodeWars #2

Продолжаем решать задачи с CodeWars.

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

Например:

Дан список [34, 15, 88, 2], мы должны вернуть 2.
Дан список [34, -345, -1, 100], мы должны вернуть -345.
Список на пустоту можно не проверять.

В стандартной библиотеке Python предусмотрены различные функции, в том числе математические. В частности есть функции min() и max() для поиска минимального и максимального значения в списке. Функцией min() мы и воспользуемся. Наше решение будет простым, и лаконичным.

def find_smallest_int(arr):
return min(arr)

#codewars #python
👍1
Python для троллинга Java\C#\PHP разработчиков

Как известно, объектно-ориентированное прогаммирование, позволяет создавать объекты, вступающие друг с другом в отношения родитель-наследник.

Например:

class Cat:
pass

class BlackCat(Cat):
pass


Здесть класс BlackCat будет наследником по отношению к классу Cat. Зачем это нужно? Во-первых, на основе наследования легко работать с дополнением. Нам не нужно полностью копировать класс Cat, чтобы добавить в него что-то новое. Мы можем наследоваться от него.

В языках со строгой системой типов вы уже на этапе компиляции получите ошибку, если передадите объект не того типа в метод или функцию. Python же язык с достаточно специфическим отношением к типобезопасности, и, хотя тайп-хинты (возможность указать, что вот в эту функцию вот этим аргументом передайте, пожалуйста, вот такой вот тип) существуют, ничто не мешает творить непотребства.

В частности, в Python, для проверки является ли некоторый наследником по отношению к другому типу, можно использовать функцию issubclass(). Она принимает два аргумента - проверяемый на родство тип, и предполагаемый родитель.

Пример 1:

class Cat:
pass

class Dog:
pass

issubclass(Dog, Cat) # False - Собака не наследует кошку


Пример 2:

class Cat:
pass

class Dog(Cat):
pass

issubclass(Dog, Cat) # True - собака воспитана кошками


Собственно в Python есть возможность переопределить это поведение с помощью специального метода subclasshook, реализуемого в родительском классе.

Пример 3:

from abc import ABC

class Cat(ABC):
def __subclasshook__(cls, *agrs):
print(cls)
return True

class Dog:
pass


issubclass(Dog, Cat) # True
issubclass(int, Cat) # True - видели когда-нибудь целочисленных кошек?


Спасибо, Гвидо, что дал нам возможность жирно потроллить джавистов!

#python
😁2
CodeWars #3

Решаем следующую задачу: нужно подсчитать количество гласных в строке, которая нам дана в качестве аргумента. Считаем, что символы a, e, i, o, u это гласные. Входная строка будет состоять из символов в нижнем регистре (это важно, потому что в некоторых случаях требуется данные привести к какому-то виду) и пробелов.

Задача достаточно простая - берем список гласных, идем циклом по строке (да-да, по строкам в Python можно ходить циклом, на каждой итерации мы получаем следующий символ), проверяем входит ли очередной символ в список искомых. Если да - инкрементируем счетчик.

def get_count(sentence):
# Список гласных букв
vowels = ["a", "e", "i", "o", "u"]

# Счетчик, инициализируем нулём
count = 0

# Цикл по строке, допустим для строки `hello` тело цикла выполнится пять раз
# На каждой итерации в переменной letter будет буква из строки
# Сначала h, потом e, потом l, и т.д.
for letter in sentence:
# Оператор in проверяет вхождение элемента letter в список vowels
# Если элемент присутствует - тело if выполнится
if letter in vowels:
# Инкрементируем (увеличиваем на 1) наш счетчик
count += 1

# Возвращаем значение счетчика
return count


А можно ли лаконичнее? Да!

def get_count(inputStr):
return len([x for x in inputStr if x in 'aeoiu'])


Здесь использован так называемый list comprehension - специальный синтаксис, который позволяет в одну строчку кода описать создание последовательности. Базово, он состоит из выражения
[x for x in inputStr]


Здесь x - это переменная цикла, которая заполняется значением из последовательности inputStr. На выходе у такого выражения будет список из всех элементов, что были в inputStr. По ходу пьесы x можно модифицировать.

digits = [1,2,3,4]

# Квадраты чисел в digits, операция ** (две звездочки) - возведение в степень
squares = [x**2 for x in digits]


Соответственно, как и в теле цикла, в list comprehension можно дописывать условие, чтобы отбраковать те элементы, которые нам не нужны. Делается это с помощью if.

digits = [1,2,3,4]

# Квадраты чисел в digits, операция ** (две звездочки) - возведение в степень
# В блоке if мы отбираем x только если он четный (% - остаток от деления, если он равен нулю - берем)
squares = [x**2 for x in digits if x % 2 == 0]


Таким образом, выражение из второго примера даст нам список символов, которые точно входят в интересующий нас диапазон (aeoiu).

[x for x in inputStr if x in 'aeoiu']


Остается взять его длину с помощью функции len(), и вернуть. Кстати, знаете, почему значение, возвращенное функцией len() не проверяется на равенство с нулём, а просто возвращается как есть? Дело, опять же, в системе типов. Ноль приводится к False для целых чисел, все остальное - к True. Да и сами константы True и False в Python это целые числа. True = 1, False = 0. Поэтому выражение 1 + True будет равно 2.

#codewars #python
👍1
Codewars #4

Создайте функцию, которая вернет сумму двух наименьших неотрицательных чисел из предоставленного списка, в котором будут минимум 4 элемента. Гарантируется, что в массиве будут только целые положительные числа.

Пример: для списка [19, 5, 42, 2, 77] функция вернет 7 (5 + 2).

Итак, у нас есть функция:
def sum_two_smallest_numbers(numbers):
pass


И мы точно знаем, что numbers - это список. Но мы не знаем какие два элемента будут наименьшими. Кроме того непонятно будут ли повторения - но так, как в примере их не было, не будем принимать их во внимание. Решение "в лоб" - перебор с помощью циклов.

first_num = 0
second_num = 0
for i in numbers:
if not first_num:
first_num = i

if first_num < i:
first_num = i

for i in numbers:
if not second_num:
second_num = i

if second_num >= first_num and second_num < i:
second_num = i


Примерно так, в первом цикле мы берем первый элемент, и далее сравниваем его со всеми последующими. Если мы видим, что следующий элемент меньше предыдущего - то берем уже его. Для поиска второго элемента делаем то же самое, только сравниваем еще и с первым. Способ рабочий, но громоздкий и долгий.

Есть решение лучше - сортировка! Отсортируем список по возрастанию и просто вернем сумму двух первых элементов!

def sum_two_smallest_numbers(numbers):
numbers = sorted(numbers)
return numbers[0] + numbers[1]

#codewars #python
👍1