Получаем срез из бесконечного генератора
Допустим, мы хотим получить какой-то конечный список элементов из бесконечного генератора. Что нам для этого понадобится?
Для начала создадим сам генератор fib, уже немного знакомый вам по посту, где мы использовали lru_cache, правда там была рекурсивная функция. Этот генератор позволяет (за неимением другого слова) "генерировать" числа из последовательности Фибоначчи.
Чтобы получить желаемый срез, импортируем модуль itertools, в котором уже есть удобная функция islice, позволяющая осуществить срез генератора fib.
#python
Подписывайтесь на канал 👉@cod_academy
Допустим, мы хотим получить какой-то конечный список элементов из бесконечного генератора. Что нам для этого понадобится?
Для начала создадим сам генератор fib, уже немного знакомый вам по посту, где мы использовали lru_cache, правда там была рекурсивная функция. Этот генератор позволяет (за неимением другого слова) "генерировать" числа из последовательности Фибоначчи.
Чтобы получить желаемый срез, импортируем модуль itertools, в котором уже есть удобная функция islice, позволяющая осуществить срез генератора fib.
#python
Подписывайтесь на канал 👉@cod_academy
Резервирование памяти
Некоторые Java-приложения очень требовательны к ресурсам и могут работать медленно. Для повышения производительности можно выделять Java-машине больше оперативной памяти.
• Xms – минимальный пул выделения памяти;
• Xmx – максимальный пул выделения памяти;
• XX:PermSize – начальный размер, который будет выделен при запуске JVM;
• XX:MaxPermSize – максимальный размер, который может быть выделен при запуске JVM.
#java
Подписывайтесь на канал 👉@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
Как и pair, tuple — коллекция значений различных типов данных конкретного размера.
В некоторых случаях вместо tuple удобнее использовать std::array. Это обычный массив с некоторыми функциями стандартной библиотеки C++, который был добавлен в C++11.
#cpp
Подписывайтесь на канал 👉@cod_academy
Эффективный трюк, чтобы узнать, является ли число степенью двойки
Обычный метод деления имеет сложность O(logN), но эту задачу можно решить со сложностью O(v), где v — количество цифр числа в двоичной форме.
#java
Подписывайтесь на канал 👉@cod_academy
Обычный метод деления имеет сложность O(logN), но эту задачу можно решить со сложностью O(v), где v — количество цифр числа в двоичной форме.
#java
Подписывайтесь на канал 👉@cod_academy
Функция zip
Функция zip создаёт итератор, который комбинирует элементы нескольких списков. Это позволяет осуществлять параллельный обход списков в циклах for или, например, выполнять параллельную сортировку.
#python
Подписывайтесь на канал 👉@cod_academy
Функция zip создаёт итератор, который комбинирует элементы нескольких списков. Это позволяет осуществлять параллельный обход списков в циклах for или, например, выполнять параллельную сортировку.
#python
Подписывайтесь на канал 👉@cod_academy
👍1
Работа с ошибками
Отлов багов – это, возможно, самая трудоемкая составляющая процесса разработки на Java. Трассировка стека позволяет отследить, в каком именно месте проекта было выброшено исключение.
#java
Подписывайтесь на канал 👉@cod_academy
Отлов багов – это, возможно, самая трудоемкая составляющая процесса разработки на Java. Трассировка стека позволяет отследить, в каком именно месте проекта было выброшено исключение.
#java
Подписывайтесь на канал 👉@cod_academy
👍1
Перегрузка операторов
Ключевое слово operator позволяет изменить работу конкретного оператора с экземплярами класса. Это дает оператору дополнительное значение — "перегружает" его. Компилятор различает разные значения оператора, проверяя типы его операндов.
В примере оператор + перегружается для сложения двух комплексных чисел.
#cpp
Подписывайтесь на канал 👉@cod_academy
Ключевое слово operator позволяет изменить работу конкретного оператора с экземплярами класса. Это дает оператору дополнительное значение — "перегружает" его. Компилятор различает разные значения оператора, проверяя типы его операндов.
В примере оператор + перегружается для сложения двух комплексных чисел.
#cpp
Подписывайтесь на канал 👉@cod_academy
Конструктор по умолчанию в Java
Как и C++, Java автоматически создает конструктор по умолчанию, если нет конструктора по умолчанию или параметризованного конструктора, написанного программистом. А также как и в C++ конструктор по умолчанию автоматически вызывает родительский конструктор по умолчанию.
Но, в отличие от C++, конструктор по умолчанию в Java инициализирует члены класса значениями по умолчанию (числовые значения инициализируются как 0, логические значения инициализируются как false, а ссылки инициализируются как null).
#java
Подписывайтесь на канал 👉@cod_academy
Как и C++, Java автоматически создает конструктор по умолчанию, если нет конструктора по умолчанию или параметризованного конструктора, написанного программистом. А также как и в C++ конструктор по умолчанию автоматически вызывает родительский конструктор по умолчанию.
Но, в отличие от C++, конструктор по умолчанию в Java инициализирует члены класса значениями по умолчанию (числовые значения инициализируются как 0, логические значения инициализируются как false, а ссылки инициализируются как null).
#java
Подписывайтесь на канал 👉@cod_academy
Функция reduce
Модуль functools позволяет хорошо раскрыть функциональные возможности Python. Например, в functools есть интересная функция reduce, которая позволяет «сжимать» данные, применяя последовательно функцию и запоминая результат.
Таким образом, в примере выше reduce умножает 1 на 2, затем результат этого умножения на 3 и так далее.
#python
Подписывайтесь на канал 👉@cod_academy
Модуль functools позволяет хорошо раскрыть функциональные возможности Python. Например, в functools есть интересная функция reduce, которая позволяет «сжимать» данные, применяя последовательно функцию и запоминая результат.
Таким образом, в примере выше reduce умножает 1 на 2, затем результат этого умножения на 3 и так далее.
#python
Подписывайтесь на канал 👉@cod_academy
Алгоритм accumulate
Возвращает сумму всех значений, лежащих в диапазоне между [first, last) с переменной init.
#cpp
Подписывайтесь на канал 👉@cod_academy
Возвращает сумму всех значений, лежащих в диапазоне между [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
Класс 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
Обращение к несуществующему ключу словаря вызывает исключение. Избежать этого можно, вызывая метод 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
При первом знакомстве макросы могут показаться обычными вызовами функций. Конечно, у них немного странный синтаксис, но они «ведут себя» как обычные функции. Тогда в чём разница?
Макрос можно условно назвать функцией обработки и замены программного кода: после сборки программы макросы заменяются макроопределениями. На картинке показан код на Си.
#cpp
Подписывайтесь на канал 👉@cod_academy
🤨2
Статический вложенный класс в Java
Статический внутренний класс — это вложенный класс, который является статическим членом внешнего класса. Доступ к нему возможен без создания экземпляра внешнего класса с использованием других статических элементов. Как и статические члены, статический вложенный класс не имеет доступа к переменным экземпляра и методам внешнего класса. Синтаксис статического вложенного класса в Java выглядит следующим образом:
class MyOuter {
static class Nested_Demo {
}
}
Создание экземпляра статического вложенного класса немного отличается от экземпляра внутреннего класса.
Следующая программа показывает, как использовать статические вложенные классы.
#java
Подписывайтесь на канал 👉@cod_academy
Статический внутренний класс — это вложенный класс, который является статическим членом внешнего класса. Доступ к нему возможен без создания экземпляра внешнего класса с использованием других статических элементов. Как и статические члены, статический вложенный класс не имеет доступа к переменным экземпляра и методам внешнего класса. Синтаксис статического вложенного класса в 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
Многие из вас знакомы с тернарным оператором, позволяющим записать простое условное выражение с if:
A = Y if X else Z
Интерпретатор выполняет выражение Y, если объект X – True, и Z, если X – False.
Но оказывается, тернарный оператор можно использовать не только для переменных, но и для функций.
#python
Подписывайтесь на канал 👉@cod_academy
Функция strrchr()
В C++ strrchr() - это предопределенная функция, используемая для обработки строк. Эта функция возвращает указатель на всю строку после последнего появления заданного символа. Символ, последнее вхождение которого мы хотим найти, передается в качестве второго аргумента функции, а строка, в которой мы должны найти этот символ, передается в качестве первого аргумента функции.
В примере кода на картинке мы используем функцию для того, чтобы найти порядковый номер символа в заданной строке.
#cpp
Подписывайтесь на канал 👉@cod_academy
В C++ strrchr() - это предопределенная функция, используемая для обработки строк. Эта функция возвращает указатель на всю строку после последнего появления заданного символа. Символ, последнее вхождение которого мы хотим найти, передается в качестве второго аргумента функции, а строка, в которой мы должны найти этот символ, передается в качестве первого аргумента функции.
В примере кода на картинке мы используем функцию для того, чтобы найти порядковый номер символа в заданной строке.
#cpp
Подписывайтесь на канал 👉@cod_academy
Generics
Всегда старайтесь типизировать ваши коллекции, методы и классы. Это избавляет сразу от 2-х потенциальных проблем: приведение типов и ошибок выполнения. Также назначение таких коллекций легче воспринимать. Особенно часто этим пренебрегают мои американо-индусские коллеги. Если же ваша коллекция должна содержать обьекты разных типов — используйте <?>, а еще лучше <? extends someType> тогда зная общий класс/интерфейс для всех обьектов вам не прийдется делать приведение типов и применять оператор instanceOf.
#java
Подписывайтесь на канал 👉@cod_academy
Всегда старайтесь типизировать ваши коллекции, методы и классы. Это избавляет сразу от 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
Мы очень часто отлаживаем код и пользуемся функцией 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
За этим нет большой истории. Иногда нам нужно преобразовать строки в шестнадцатеричный формат, байты или символы. Начиная с Java 17 вы можете использовать класс HexFormat. Просто создайте экземпляр HexFormat, а затем вы можете отформатировать, например, входную таблицу byte в шестнадцатеричную строку. Вы также можете, например, преобразовать входную шестнадцатеричную строку в таблицу байтов, как показано выше.
#java
Подписывайтесь на канал 👉@cod_academy
❤1
Указатели с ключевыми словами const и volatile
Ключевые слова const и volatile изменяют то, как обрабатываются указатели. const указывает, что данные по указателю не могут быть изменены после инициализации; volatile указывает, что значение может быть изменено действиями, отличными от тех, которые указаны в пользовательском приложении.
volatile полезно для объявления объектов в общей памяти, к которым могут обращаться несколько процессов или для глобальных областей данных.
#cpp
Подписывайтесь на канал 👉@cod_academy
Ключевые слова const и volatile изменяют то, как обрабатываются указатели. const указывает, что данные по указателю не могут быть изменены после инициализации; volatile указывает, что значение может быть изменено действиями, отличными от тех, которые указаны в пользовательском приложении.
volatile полезно для объявления объектов в общей памяти, к которым могут обращаться несколько процессов или для глобальных областей данных.
#cpp
Подписывайтесь на канал 👉@cod_academy
Функция map
Привет, крайне часто начинающие программисты изобретают велосипеды при работе с коллекциями. Избежать часть таких ситуаций поможет знание map.
На вход принимает два обязательных аргмумента: функция-обработчик и итерируемый объект. Суть map’a заключается в том, что он применяет переданную функцию к каждому элементу последовательности. А возвращает так называемый map-объект, который в дальнейшем можно конвертировать в обычный список и не только.
Обратите внимание, в примере на картинке мы не пишем скобки у функции add_five при вызове map – это означает то, что мы передаем объект функции, а не результат её выполнения.
#python
Подписывайтесь на канал 👉@cod_academy
Привет, крайне часто начинающие программисты изобретают велосипеды при работе с коллекциями. Избежать часть таких ситуаций поможет знание map.
На вход принимает два обязательных аргмумента: функция-обработчик и итерируемый объект. Суть map’a заключается в том, что он применяет переданную функцию к каждому элементу последовательности. А возвращает так называемый map-объект, который в дальнейшем можно конвертировать в обычный список и не только.
Обратите внимание, в примере на картинке мы не пишем скобки у функции add_five при вызове map – это означает то, что мы передаем объект функции, а не результат её выполнения.
#python
Подписывайтесь на канал 👉@cod_academy