Академия Кода – Telegram
Академия Кода
2K subscribers
673 photos
2 videos
2 files
50 links
Академия кода. Полезный контент по программированию. По всем вопросам @evgenycarter
Download Telegram
Нахождение наиболее частых элементов списка

Если необходимо найти несколько наиболее часто повторяющихся значений, лучше воспользоваться счетчиком Counter из библиотеки collections.

Метод Counter.most_common(x) возвращает x кортежей, в которых первое значение – элемент, а второе – количество его повторений.

#python

Подписывайтесь на канал 👉@cod_academy
2
Получаем срез из бесконечного генератора

Допустим, мы хотим получить какой-то конечный список элементов из бесконечного генератора. Что нам для этого понадобится?

Для начала создадим сам генератор fib, уже немного знакомый вам по посту, где мы использовали lru_cache, правда там была рекурсивная функция. Этот генератор позволяет (за неимением другого слова) "генерировать" числа из последовательности Фибоначчи.

Чтобы получить желаемый срез, импортируем модуль itertools, в котором уже есть удобная функция islice, позволяющая осуществить срез генератора fib.

#python

Подписывайтесь на канал 👉@cod_academy
Резервирование памяти

Некоторые Java-приложения очень требовательны к ресурсам и могут работать медленно. Для повышения производительности можно выделять Java-машине больше оперативной памяти.

• Xms – минимальный пул выделения памяти;
• Xmx – максимальный пул выделения памяти;
• XX:PermSize – начальный размер, который будет выделен при запуске JVM;
• XX:MaxPermSize – максимальный размер, который может быть выделен при запуске JVM.

#java

Подписывайтесь на канал 👉@cod_academy
Кортеж — tuple

Как и pair, tuple — коллекция значений различных типов данных конкретного размера.

В некоторых случаях вместо tuple удобнее использовать std::array. Это обычный массив с некоторыми функциями стандартной библиотеки C++, который был добавлен в C++11.

#cpp

Подписывайтесь на канал 👉@cod_academy
Эффективный трюк, чтобы узнать, является ли число степенью двойки

Обычный метод деления имеет сложность O(logN), но эту задачу можно решить со сложностью O(v), где v — количество цифр числа в двоичной форме.

#java

Подписывайтесь на канал 👉@cod_academy
Функция zip

Функция zip создаёт итератор, который комбинирует элементы нескольких списков. Это позволяет осуществлять параллельный обход списков в циклах for или, например, выполнять параллельную сортировку.

#python

Подписывайтесь на канал 👉@cod_academy
👍1
Работа с ошибками

Отлов багов – это, возможно, самая трудоемкая составляющая процесса разработки на Java. Трассировка стека позволяет отследить, в каком именно месте проекта было выброшено исключение.

#java

Подписывайтесь на канал 👉@cod_academy
👍1
Перегрузка операторов

Ключевое слово operator позволяет изменить работу конкретного оператора с экземплярами класса. Это дает оператору дополнительное значение — "перегружает" его. Компилятор различает разные значения оператора, проверяя типы его операндов.

В примере оператор + перегружается для сложения двух комплексных чисел.

#cpp

Подписывайтесь на канал 👉@cod_academy
Конструктор по умолчанию в Java

Как и C++, Java автоматически создает конструктор по умолчанию, если нет конструктора по умолчанию или параметризованного конструктора, написанного программистом. А также как и в C++ конструктор по умолчанию автоматически вызывает родительский конструктор по умолчанию.

Но, в отличие от C++, конструктор по умолчанию в Java инициализирует члены класса значениями по умолчанию (числовые значения инициализируются как 0, логические значения инициализируются как false, а ссылки инициализируются как null).

#java

Подписывайтесь на канал 👉@cod_academy
Функция reduce

Модуль functools позволяет хорошо раскрыть функциональные возможности Python. Например, в functools есть интересная функция reduce, которая позволяет «сжимать» данные, применяя последовательно функцию и запоминая результат.

Таким образом, в примере выше reduce умножает 1 на 2, затем результат этого умножения на 3 и так далее.

#python

Подписывайтесь на канал 👉@cod_academy
Алгоритм accumulate

Возвращает сумму всех значений, лежащих в диапазоне между [first, last) с переменной init.

#cpp

Подписывайтесь на канал 👉@cod_academy
Что за зверь "Matcher"?

Класс Java Matcher (java.util.regex.Matcher) создан для поиска некоторого множества вхождений регулярного выражения в одном тексте и поиска по одному шаблону в разных текстах. Класс Java Matcher имеет много полезных методов.

Например:

• boolean matches(): вернет значение true при совпадении строки с шаблоном.
• boolean find(): вернет значение true при обнаружении подстроки, совпадающей с шаблоном, и перейдет к ней.
• int start(): вернет значение индекса соответствия.
• int end(): вернет значение индекса последующего соответствия.
• String replaceAll(String str): вернет значение измененной строки подстрокой str.

Другие методы Matcher можно найти в официальной документации.

Рассмотрите простой пример работы с Pattern и Matcher.

#java

Подписывайтесь на канал 👉@cod_academy
Вывод значения по умолчанию для отсутствующего ключа словаря
Обращение к несуществующему ключу словаря вызывает исключение. Избежать этого можно, вызывая метод get. В указанном случае метод выдает None (по умолчанию) или заданное значение аргумента.

#codeexample

d = {'a':1, 'b':2}
print(d.get('c'))
print(d.get('c', 3))
# На выходе:
None
3

При создании собственного типа данных на основе словарей обратите внимание на метод __missing__ для возвращения аргумента при отсутствии ключа:

class MyDict(dict):
def _missing_(self, key):
return key

D = MyDict(a=1, b=2)
print(D)
print(D['a'])
print(D['c'])
# На выходе:
{'a': 1, 'b': 2}
1
c

#python

Подписывайтесь на канал 👉@cod_academy
Макросы и функции

При первом знакомстве макросы могут показаться обычными вызовами функций. Конечно, у них немного странный синтаксис, но они «ведут себя» как обычные функции. Тогда в чём разница?

Макрос можно условно назвать функцией обработки и замены программного кода: после сборки программы макросы заменяются макроопределениями. На картинке показан код на Си.

#cpp

Подписывайтесь на канал 👉@cod_academy
🤨2
Статический вложенный класс в Java

Статический внутренний класс — это вложенный класс, который является статическим членом внешнего класса. Доступ к нему возможен без создания экземпляра внешнего класса с использованием других статических элементов. Как и статические члены, статический вложенный класс не имеет доступа к переменным экземпляра и методам внешнего класса. Синтаксис статического вложенного класса в Java выглядит следующим образом:

class MyOuter {
static class Nested_Demo {
}
}

Создание экземпляра статического вложенного класса немного отличается от экземпляра внутреннего класса.

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

#java

Подписывайтесь на канал 👉@cod_academy
Назначение функций по условию

Многие из вас знакомы с тернарным оператором, позволяющим записать простое условное выражение с if:

A = Y if X else Z

Интерпретатор выполняет выражение Y, если объект X – True, и Z, если X – False.

Но оказывается, тернарный оператор можно использовать не только для переменных, но и для функций.

#python

Подписывайтесь на канал 👉@cod_academy
Функция strrchr()

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

В примере кода на картинке мы используем функцию для того, чтобы найти порядковый номер символа в заданной строке.

#cpp

Подписывайтесь на канал 👉@cod_academy
Generics

Всегда старайтесь типизировать ваши коллекции, методы и классы. Это избавляет сразу от 2-х потенциальных проблем: приведение типов и ошибок выполнения. Также назначение таких коллекций легче воспринимать. Особенно часто этим пренебрегают мои американо-индусские коллеги. Если же ваша коллекция должна содержать обьекты разных типов — используйте <?>, а еще лучше <? extends someType> тогда зная общий класс/интерфейс для всех обьектов вам не прийдется делать приведение типов и применять оператор instanceOf.

#java

Подписывайтесь на канал 👉@cod_academy
Красивый вывод

Мы очень часто отлаживаем код и пользуемся функцией print. Вывод в одну строку не всегда удобен. К примеру, когда мы делаем запрос серверу и получаем огромный json.

Встроенный модуль pprint поможет нам навести красоту. С каждым новым вложением он делает дополнительный отступ и вывод всегда радует глаз.
Вот параметры, которые принимает pprint.pprint:

object - объект форматирования,
stream=None - поток форматированного вывода,
indent=1 - отступ последующего уровня вложенности,
width=80 - ширина экрана печати,
depth=None - показывать уровней вложенности,
compact=False - компактное форматирование,
sort_dicts=True - сортировка словаря перед форматированием,

Мы даже можем переопределить стандартную функцию print написав print = pprint.pprint

Выше приведен пример кода. Вы можете самостоятельно поэкспериментировать с модулем.

#python

Подписывайтесь на канал 👉@cod_academy
Шестнадцатеричный формат

За этим нет большой истории. Иногда нам нужно преобразовать строки в шестнадцатеричный формат, байты или символы. Начиная с Java 17 вы можете использовать класс HexFormat. Просто создайте экземпляр HexFormat, а затем вы можете отформатировать, например, входную таблицу byte в шестнадцатеричную строку. Вы также можете, например, преобразовать входную шестнадцатеричную строку в таблицу байтов, как показано выше.

#java

Подписывайтесь на канал 👉@cod_academy
1
Указатели с ключевыми словами const и volatile

Ключевые слова const и volatile изменяют то, как обрабатываются указатели. const указывает, что данные по указателю не могут быть изменены после инициализации; volatile указывает, что значение может быть изменено действиями, отличными от тех, которые указаны в пользовательском приложении.

volatile полезно для объявления объектов в общей памяти, к которым могут обращаться несколько процессов или для глобальных областей данных.

#cpp

Подписывайтесь на канал 👉@cod_academy