Это свершилось!
Известный профессор Стэнфордского университета Олег Бакей сделал канал для программистов.
Там он рассказывает о неочевидных вещах в изучении программирования и дает уникальную информацию.
Кладезь знаний тут: @codecademy
Известный профессор Стэнфордского университета Олег Бакей сделал канал для программистов.
Там он рассказывает о неочевидных вещах в изучении программирования и дает уникальную информацию.
Кладезь знаний тут: @codecademy
np.sort/np.argsort
Функция NumPy np.sort намного эффективнее, чем встроенные функции сортировки. Она используется для возвращения отсортированной версии массива без изменения ввода. Функция argsort вместо этого возвращает индексы отсортированных элементов. Первый элемент дает индекс наименьшего элемента, второе значение дает индекс второго наименьшего элемента и так далее. Затем эти индексы можно использовать для построения отсортированного массива, если это необходимо.
#практика
Функция NumPy np.sort намного эффективнее, чем встроенные функции сортировки. Она используется для возвращения отсортированной версии массива без изменения ввода. Функция argsort вместо этого возвращает индексы отсортированных элементов. Первый элемент дает индекс наименьшего элемента, второе значение дает индекс второго наименьшего элемента и так далее. Затем эти индексы можно использовать для построения отсортированного массива, если это необходимо.
#практика
Bisect: поиск
bisect(haystack, needle) выполняет бинарный поиск needle в haystack. Он должен быть отсортированной последовательностью, чтобы найти позицию, в которую можно вставить needle, сохраняя при этом haystack в возрастающем порядке. Другими словами, все элементы, появляющиеся до этой позиции, меньше или равны needle. Ты можешь использовать результат bisect(haystack, needle) в качестве индексного аргумента для haystack.insert(index, needle). Однако использование insort выполняет оба шага и работает быстрее.
#практика
bisect(haystack, needle) выполняет бинарный поиск needle в haystack. Он должен быть отсортированной последовательностью, чтобы найти позицию, в которую можно вставить needle, сохраняя при этом haystack в возрастающем порядке. Другими словами, все элементы, появляющиеся до этой позиции, меньше или равны needle. Ты можешь использовать результат bisect(haystack, needle) в качестве индексного аргумента для haystack.insert(index, needle). Однако использование insort выполняет оба шага и работает быстрее.
#практика
Bisect.insort
Сортировка – затратный процесс. Если у тебя есть отсортированная последовательность, лучше оставить ее такой. Для этого можно использовать bisect.insort. insort(seq, item) вставляет item в seq, чтобы сохранить последовательность в порядке возрастания. Как и bisect, insort принимает необязательные аргументы lo, hi, чтобы ограничить поиск подпоследовательностью. Существует также вариант insort left, который использует bisect left для поиска точек вставки.
#практика
Сортировка – затратный процесс. Если у тебя есть отсортированная последовательность, лучше оставить ее такой. Для этого можно использовать bisect.insort. insort(seq, item) вставляет item в seq, чтобы сохранить последовательность в порядке возрастания. Как и bisect, insort принимает необязательные аргументы lo, hi, чтобы ограничить поиск подпоследовательностью. Существует также вариант insort left, который использует bisect left для поиска точек вставки.
#практика
Функция super
Функция super() в Python делает наследование классов более управляемым и расширяемым. Функция возвращает временный объект, который позволяет ссылаться на родительский класс по ключевому слову super. Другими словами, super() позволяет тебе создавать классы, которые легко расширяют функциональность ранее созданных классов без повторной реализации их функциональности.
#практика
Функция super() в Python делает наследование классов более управляемым и расширяемым. Функция возвращает временный объект, который позволяет ссылаться на родительский класс по ключевому слову super. Другими словами, super() позволяет тебе создавать классы, которые легко расширяют функциональность ранее созданных классов без повторной реализации их функциональности.
#практика
Memoryview
Когда ты выполняешь какое-либо действие над объектом, Python должен создать копию объекта. Если у тебя большие данные для работы, ты будешь создавать копии огромных кусков данных, которые практически бесполезны. Используя протокол буфера, можно предоставить другому объекту доступ для использования/изменения больших данных без их копирования. Это позволяет программе использовать меньше памяти и увеличивает скорость выполнения.
#практика
Когда ты выполняешь какое-либо действие над объектом, Python должен создать копию объекта. Если у тебя большие данные для работы, ты будешь создавать копии огромных кусков данных, которые практически бесполезны. Используя протокол буфера, можно предоставить другому объекту доступ для использования/изменения больших данных без их копирования. Это позволяет программе использовать меньше памяти и увеличивает скорость выполнения.
#практика
divmod
Метод divmod() принимает два числа и возвращает пару чисел (кортеж), состоящую из их частного и остатка. Можно использовать как целые числа, так и с плавающей запятой. При использовании комплексных чисел выдаст ошибку. В таком случае нужно предварительно перевести в число с плавающей запятой, если возможно.
#практика
Метод divmod() принимает два числа и возвращает пару чисел (кортеж), состоящую из их частного и остатка. Можно использовать как целые числа, так и с плавающей запятой. При использовании комплексных чисел выдаст ошибку. В таком случае нужно предварительно перевести в число с плавающей запятой, если возможно.
#практика
reversed()
Функция reversed() возвращает обратный итератор данной последовательности. Это то же самое, что и метод iter(), но в обратном порядке. Последовательность может быть списком, кортежем, набором или словарем. Обрати внимание, reversed() выдает символы непосредственно из исходной строки. Другими словами, он не создает новую перевернутую строку, а считывает символы в обратном направлении из существующей. Такое поведение довольно эффективно с точки зрения потребления памяти и может стать фундаментальным преимуществом в некоторых ситуациях.
#практика
Функция reversed() возвращает обратный итератор данной последовательности. Это то же самое, что и метод iter(), но в обратном порядке. Последовательность может быть списком, кортежем, набором или словарем. Обрати внимание, reversed() выдает символы непосредственно из исходной строки. Другими словами, он не создает новую перевернутую строку, а считывает символы в обратном направлении из существующей. Такое поведение довольно эффективно с точки зрения потребления памяти и может стать фундаментальным преимуществом в некоторых ситуациях.
#практика
frozenset
Функция frozenset() возвращает неизменяемый объект frozenset, инициализированный элементами из заданного итерируемого объекта. Хотя элементы набора можно изменить в любое время, элементы фиксированного набора остаются неизменными после создания. Благодаря этому frozensets могут использоваться как ключи в dict или как элементы другого набора. Как и наборы, он не упорядочен.
#практика
Функция frozenset() возвращает неизменяемый объект frozenset, инициализированный элементами из заданного итерируемого объекта. Хотя элементы набора можно изменить в любое время, элементы фиксированного набора остаются неизменными после создания. Благодаря этому frozensets могут использоваться как ключи в dict или как элементы другого набора. Как и наборы, он не упорядочен.
#практика
np.partition
Иногда нас не интересует сортировка всего массива. Например, просто нужно найти K наименьших значений в массиве. NumPy позволяет это сделать с помощью np.partition. np.partition принимает массив и число K. Результатом является новый массив с наименьшими значениями K слева от элемента и оставшимися значениями справа. Внутри двух разделов элементы имеют произвольный порядок. Аналогично мы можем разбить по произвольной оси многомерный массив.
#практика
Иногда нас не интересует сортировка всего массива. Например, просто нужно найти K наименьших значений в массиве. NumPy позволяет это сделать с помощью np.partition. np.partition принимает массив и число K. Результатом является новый массив с наименьшими значениями K слева от элемента и оставшимися значениями справа. Внутри двух разделов элементы имеют произвольный порядок. Аналогично мы можем разбить по произвольной оси многомерный массив.
#практика
Скачивание видео с Youtube
С помощью библиотеки pytube ты можешь скачать видео с Youtube. Предварительно библиотеку надо установить с помощью pip install pytube. В данном примере продемонстрировано, как это можно реализовать. Дополнительно мы создали простой интерфейс с помощью tkinter.
#практика
С помощью библиотеки pytube ты можешь скачать видео с Youtube. Предварительно библиотеку надо установить с помощью pip install pytube. В данном примере продемонстрировано, как это можно реализовать. Дополнительно мы создали простой интерфейс с помощью tkinter.
#практика
defaultdict
Стандартная библиотека Python предоставляет collections - модуль, реализующий специализированные типы контейнеров. Одним из них является тип defaultdict. Это альтернатива dict, специально разработанная, чтобы помочь тебе с отсутствующими ключами. В данном примере мы передаем список в .default factory при создании словаря. Затем используем def dict, как обычный словарь. Обрати внимание, когда мы пытаемся получить доступ или изменить значение, сопоставленное с несуществующим ключом, словарь присваивает ему значение по умолчанию, полученное в результате вызова list().
#практика
Стандартная библиотека Python предоставляет collections - модуль, реализующий специализированные типы контейнеров. Одним из них является тип defaultdict. Это альтернатива dict, специально разработанная, чтобы помочь тебе с отсутствующими ключами. В данном примере мы передаем список в .default factory при создании словаря. Затем используем def dict, как обычный словарь. Обрати внимание, когда мы пытаемся получить доступ или изменить значение, сопоставленное с несуществующим ключом, словарь присваивает ему значение по умолчанию, полученное в результате вызова list().
#практика
popleft/appendleft
Наиболее важное различие между deque и list заключается в том, что первый позволяет выполнять эффективные операции добавления и извлечения на обоих концах последовательности. Класс deque реализует специальные методы .popleft() и .appendleft(), которые работают непосредственно с левым концом последовательности. Эти методы специфичны для deque, и ты не найдешь их в list.
#практика
Наиболее важное различие между deque и list заключается в том, что первый позволяет выполнять эффективные операции добавления и извлечения на обоих концах последовательности. Класс deque реализует специальные методы .popleft() и .appendleft(), которые работают непосредственно с левым концом последовательности. Эти методы специфичны для deque, и ты не найдешь их в list.
#практика
pop в deque
Как и list, deque также предоставляет методы .append() и .pop() для работы с правым концом последовательности. Однако .pop() ведет себя по-другому. Как видно в примере, .pop() удаляет и возвращает последнее значение в очереди. Метод не принимает индекс в качестве аргумента, поэтому ты не можешь использовать его для удаления произвольных элементов из ваших очередей. Ты можешь использовать его только для удаления и возврата самого правого элемента.
#практика
Как и list, deque также предоставляет методы .append() и .pop() для работы с правым концом последовательности. Однако .pop() ведет себя по-другому. Как видно в примере, .pop() удаляет и возвращает последнее значение в очереди. Метод не принимает индекс в качестве аргумента, поэтому ты не можешь использовать его для удаления произвольных элементов из ваших очередей. Ты можешь использовать его только для удаления и возврата самого правого элемента.
#практика
Defaultdict: группировка
Обычно тип Python defaultdict используется для группировки.В первом примере мы создаем defaultdict с именем dd и передаем список в .default factory. Обрати внимание, что даже если ключ не определен, тыможете добавлять к нему значения, не получая ошибки KeyError. Это связано с тем, что dd автоматически вызывает .default factory для создания значения по умолчанию для отсутствующего ключа. Ты можешь использовать defaultdict вместе со списком, чтобы сгруппировать элементы в последовательности или коллекции. Во втором примере создается defaultdict с именем dep dd и используется цикл for для перебора списка dep. Оператор dep dd[department].append(employee) создает ключи для отделов, инициализирует их пустым списком, а затем добавляет сотрудников к каждому отделу.
#практика
Обычно тип Python defaultdict используется для группировки.В первом примере мы создаем defaultdict с именем dd и передаем список в .default factory. Обрати внимание, что даже если ключ не определен, тыможете добавлять к нему значения, не получая ошибки KeyError. Это связано с тем, что dd автоматически вызывает .default factory для создания значения по умолчанию для отсутствующего ключа. Ты можешь использовать defaultdict вместе со списком, чтобы сгруппировать элементы в последовательности или коллекции. Во втором примере создается defaultdict с именем dep dd и используется цикл for для перебора списка dep. Оператор dep dd[department].append(employee) создает ключи для отделов, инициализирует их пустым списком, а затем добавляет сотрудников к каждому отделу.
#практика
Преобразование текста в речь
В Python доступно несколько API для преобразования текста в речь. Одним из таких API является Google Text to Speech API, широко известный как gTTS API. gTTS — это очень простой в использовании инструмент, который преобразует введенный текст в звук. Его можно сохранить в виде файла mp3.
#практика
В Python доступно несколько API для преобразования текста в речь. Одним из таких API является Google Text to Speech API, широко известный как gTTS API. gTTS — это очень простой в использовании инструмент, который преобразует введенный текст в звук. Его можно сохранить в виде файла mp3.
#практика
deque против list
deque делает добавление и извлечение элементов из любого конца легкими и эффективными операциями. Все благодаря тому, что нужно обновлять только указатели. Эти операции также предсказуемы с точки зрения производительности, потому что нет необходимости перераспределять память и перемещать существующие элементы для приема новых. Добавление и извлечение элементов из левого конца обычного списка требует сдвига всех элементов. Кроме того, добавление элементов в правый конец списка часто требует, чтобы Python перераспределял память и копировал текущие элементы в новое место в памяти. После этого он может добавлять новые элементы. Данный код демонстрирует разницу во времени между deque и list.
#практика
deque делает добавление и извлечение элементов из любого конца легкими и эффективными операциями. Все благодаря тому, что нужно обновлять только указатели. Эти операции также предсказуемы с точки зрения производительности, потому что нет необходимости перераспределять память и перемещать существующие элементы для приема новых. Добавление и извлечение элементов из левого конца обычного списка требует сдвига всех элементов. Кроме того, добавление элементов в правый конец списка часто требует, чтобы Python перераспределял память и копировал текущие элементы в новое место в памяти. После этого он может добавлять новые элементы. Данный код демонстрирует разницу во времени между deque и list.
#практика
Обмен данными между потоками
deque также полезен, когда ты кодируешь многопоточные приложения. Ты можешь безопасно добавлять и удалять данные с обоих концов потока одновременно из отдельных потоков без риска повреждения данных или других связанных с этим проблем. В данном примере product() принимает queue и size в качестве аргументов. Затем он использует random.randint() в цикле while для непрерывного создания случайных чисел и сохранения их в глобальном deque с именем shared queue. Вспомогательная функция wait seconds()возвращает случайное значение времени ожидания между заданным диапазоном секунд, mins и maxs. В Consume() ты вызываешь .popleft() внутри цикла для систематического извлечения и удаления данных из shared queue. Затем обворачиваешь вызов .popleft() в try except, чтобы обрабатывать те случаи, когда общая очередь пуста. Последние две строки в сценарии создают и запускают отдельные потоки для одновременного выполнения функций produce() и consume().
#практика
deque также полезен, когда ты кодируешь многопоточные приложения. Ты можешь безопасно добавлять и удалять данные с обоих концов потока одновременно из отдельных потоков без риска повреждения данных или других связанных с этим проблем. В данном примере product() принимает queue и size в качестве аргументов. Затем он использует random.randint() в цикле while для непрерывного создания случайных чисел и сохранения их в глобальном deque с именем shared queue. Вспомогательная функция wait seconds()возвращает случайное значение времени ожидания между заданным диапазоном секунд, mins и maxs. В Consume() ты вызываешь .popleft() внутри цикла для систематического извлечения и удаления данных из shared queue. Затем обворачиваешь вызов .popleft() в try except, чтобы обрабатывать те случаи, когда общая очередь пуста. Последние две строки в сценарии создают и запускают отдельные потоки для одновременного выполнения функций produce() и consume().
#практика
time.sleep
Функция time.sleep используется для добавления задержки в выполнение программы. Ты можешь использовать эту функцию, чтобы остановить выполнение программы на заданное время в секундах. Обрати внимание, time.sleep фактически останавливает выполнение только текущего потока, а не всей программы.
#практика
Функция time.sleep используется для добавления задержки в выполнение программы. Ты можешь использовать эту функцию, чтобы остановить выполнение программы на заданное время в секундах. Обрати внимание, time.sleep фактически останавливает выполнение только текущего потока, а не всей программы.
#практика
Создание изображений
Ты можешь создавать изображения с нуля, используя NumPy и Pillow. В данном примере мы создаем три изображения. Они создаются из каждого массива NumPy и в режим «L», который представляет оттенки серого. Теперь ты можешь объединить эти три отдельных изображения в одно изображение RGB, используя Image.merge(). Первый аргумент в Image.merge() — это режим вывода изображения. Второй аргумент — это последовательность с отдельными одноканальными изображениями.
#практика
Ты можешь создавать изображения с нуля, используя NumPy и Pillow. В данном примере мы создаем три изображения. Они создаются из каждого массива NumPy и в режим «L», который представляет оттенки серого. Теперь ты можешь объединить эти три отдельных изображения в одно изображение RGB, используя Image.merge(). Первый аргумент в Image.merge() — это режим вывода изображения. Второй аргумент — это последовательность с отдельными одноканальными изображениями.
#практика