Хранение хеша и соли
Для хранения можно использовать методы JSON, SQL, CSV и даже простой текстовый файл. Убедитесь, что пароль нигде не сохранен, ведь в этом состоит главная цель — избежать необходимость сохранения действующего пароля в исходном виде.
Если вы ограничены только одним местом для хранения, можете добавить соль и пароль вместе и потом сохранить их. Можно будет разделить их во время чтения, когда вам будет известна длина соли и ключа.
Подписывайтесь на канал 👉@pythonofff
Для хранения можно использовать методы JSON, SQL, CSV и даже простой текстовый файл. Убедитесь, что пароль нигде не сохранен, ведь в этом состоит главная цель — избежать необходимость сохранения действующего пароля в исходном виде.
Если вы ограничены только одним местом для хранения, можете добавить соль и пароль вместе и потом сохранить их. Можно будет разделить их во время чтения, когда вам будет известна длина соли и ключа.
Подписывайтесь на канал 👉@pythonofff
👍3
Функции высшего порядка в Python
Функции высшего порядка в Python позволяют улучшить структуру кода, делая его более понятным и гибким. Они позволяют передавать функции как аргументы в другие функции и возвращать функции как результат выполнения другой функции. Такой подход делает код более модульным и упрощает его поддержку и расширение.
Пример использования функций высшего порядка — это создание функции, которая принимает другую функцию в качестве аргумента. Например, мы можем создать функцию, которая принимает функцию для преобразования элементов списка. Затем мы можем передать эту функцию в качестве аргумента и применить ее к каждому элементу списка. Это позволяет нам легко изменять способ преобразования элементов без изменения основного кода.
В данном примере мы создали функцию
Использование функций высшего порядка также позволяет нам писать более компактный и элегантный код. Мы можем передавать анонимные функции (lambda-функции) в качестве аргументов, что делает код более читаемым и понятным. Кроме того, функции высшего порядка позволяют нам использовать функциональный подход к программированию, что может быть полезно при работе с большими объемами данных.
Подписывайтесь на канал 👉@pythonofff
Функции высшего порядка в Python позволяют улучшить структуру кода, делая его более понятным и гибким. Они позволяют передавать функции как аргументы в другие функции и возвращать функции как результат выполнения другой функции. Такой подход делает код более модульным и упрощает его поддержку и расширение.
Пример использования функций высшего порядка — это создание функции, которая принимает другую функцию в качестве аргумента. Например, мы можем создать функцию, которая принимает функцию для преобразования элементов списка. Затем мы можем передать эту функцию в качестве аргумента и применить ее к каждому элементу списка. Это позволяет нам легко изменять способ преобразования элементов без изменения основного кода.
def apply_function_to_list(func, lst):
return [func(x) for x in lst]
def square(x):
return x * x
numbers = [1, 2, 3, 4, 5]
squared_numbers = apply_function_to_list(square, numbers)
print(squared_numbers) # Output: [1, 4, 9, 16, 25]
В данном примере мы создали функцию
apply_function_to_list
, которая принимает функцию (в данном случае square) и список чисел. Функция apply_function_to_list
применяет переданную функцию к каждому элементу списка и возвращает новый список с результатами преобразования. Таким образом, мы можем легко изменять функцию, которая применяется к элементам списка, не изменяя основной код.Использование функций высшего порядка также позволяет нам писать более компактный и элегантный код. Мы можем передавать анонимные функции (lambda-функции) в качестве аргументов, что делает код более читаемым и понятным. Кроме того, функции высшего порядка позволяют нам использовать функциональный подход к программированию, что может быть полезно при работе с большими объемами данных.
Подписывайтесь на канал 👉@pythonofff
👍3
Хеширование паролей Python
Для Python 3.x
Здесь пароли будут хешироваться для последующего сохранения в базе данных.
Тут мы будем использовать salt. salt является случайной последовательностью, добавленной к строке пароля перед использованием хеш-функции.
salt используется для предотвращения перебора по словарю (dictionary attack) и атак радужной таблицы (rainbow tables attacks).
Подписывайтесь на канал 👉@pythonofff
Для Python 3.x
Здесь пароли будут хешироваться для последующего сохранения в базе данных.
Тут мы будем использовать salt. salt является случайной последовательностью, добавленной к строке пароля перед использованием хеш-функции.
salt используется для предотвращения перебора по словарю (dictionary attack) и атак радужной таблицы (rainbow tables attacks).
Подписывайтесь на канал 👉@pythonofff
👍4
Как убрать табуляцию в python?
Вы можете использовать метод строки .replace()
lineWithTabulation = "\tLine with tabulation"
print(lineWithTabulation)
lineWithoutTabulation = lineWithTabulation.replace('\t', '')
print(lineWithoutTabulation)
# Вывод :
# Line with tabulation
# Line with tabulation
Подписывайтесь на канал 👉@pythonofff
Вы можете использовать метод строки .replace()
lineWithTabulation = "\tLine with tabulation"
print(lineWithTabulation)
lineWithoutTabulation = lineWithTabulation.replace('\t', '')
print(lineWithoutTabulation)
# Вывод :
# Line with tabulation
# Line with tabulation
Подписывайтесь на канал 👉@pythonofff
Python Requests анализ запроса
При составлении запроса стоит иметь в виду, что перед его фактической отправкой на целевой сервер библиотека requests выполняет определенную подготовку. Подготовка запроса включает в себя такие вещи, как проверка заголовков и сериализация содержимого JSON.
Если открыть .request, можно просмотреть PreparedRequest.
Проверка PreparedRequest открывает доступ ко всей информации о выполняемом запросе. Это может быть пейлоад, URL, заголовки, аутентификация и многое другое.
Подписывайтесь на канал 👉@pythonofff
При составлении запроса стоит иметь в виду, что перед его фактической отправкой на целевой сервер библиотека requests выполняет определенную подготовку. Подготовка запроса включает в себя такие вещи, как проверка заголовков и сериализация содержимого JSON.
Если открыть .request, можно просмотреть PreparedRequest.
Проверка PreparedRequest открывает доступ ко всей информации о выполняемом запросе. Это может быть пейлоад, URL, заголовки, аутентификация и многое другое.
Подписывайтесь на канал 👉@pythonofff
👍2
Использование time.sleep() в threading
Python Logging Cookbook является хорошим примером использования time.sleep(). Модуль логирования logging является потоко-безопасным, поэтому в данном примере он будет полезнее, чем операторы print().
Здесь для создания двух потоков используется модуль Python threading. Также создается объект входа, что будет вводить threadName в stdout. Затем начинаются оба потока и инициируется цикл для каждого входа из главного потока. Для фиксирования пользователя используется KeyboardInterrupt при нажатии ^Ctrl+C.
Подписывайтесь на канал 👉@pythonofff
Python Logging Cookbook является хорошим примером использования time.sleep(). Модуль логирования logging является потоко-безопасным, поэтому в данном примере он будет полезнее, чем операторы print().
Здесь для создания двух потоков используется модуль Python threading. Также создается объект входа, что будет вводить threadName в stdout. Затем начинаются оба потока и инициируется цикл для каждого входа из главного потока. Для фиксирования пользователя используется KeyboardInterrupt при нажатии ^Ctrl+C.
Подписывайтесь на канал 👉@pythonofff
Создаём свой контекстный менеджер
Привет, в четверг на канале вышел небольшой пост про контекстные менеджеры. Сейчас разберём, как их можно реализовать.
В любом контекстном менеджере должны быть определены методы __enter__ и __exit__. В качестве примера создадим подобие уже существующего open.
Метод __enter__ вызывается автоматически и возвращает объект файла. После того, как блок with заканчивается, также вызывается метод __exit__, который закрывает файл.
А более подробно мы рассказываем про эту тему в нашем курсе по продвинутым темам.
Подписывайтесь на канал 👉@pythonofff
Привет, в четверг на канале вышел небольшой пост про контекстные менеджеры. Сейчас разберём, как их можно реализовать.
В любом контекстном менеджере должны быть определены методы __enter__ и __exit__. В качестве примера создадим подобие уже существующего open.
Метод __enter__ вызывается автоматически и возвращает объект файла. После того, как блок with заканчивается, также вызывается метод __exit__, который закрывает файл.
А более подробно мы рассказываем про эту тему в нашем курсе по продвинутым темам.
Подписывайтесь на канал 👉@pythonofff
❤1👍1🔥1
Кэширование функций
Кэширование может сэкономить время, когда связанная с вводом или выводом функция периодически вызывается с одинаковыми аргументами. Раньше приходилось создавать свою реализацию, но в Python 3.2+ появился декоратор lru_cache, который позволяет нам быстро кэшировать и вскрывать возвращаемые значения функции.
Давайте реализуем калькулятор чисел Фибоначчи с использованием кэша. Советую попробовать запустить любую рекурсивную функцию с кэшированием и без него, прирост в скорости замечается сразу.
Подписывайтесь на канал 👉@pythonofff
Кэширование может сэкономить время, когда связанная с вводом или выводом функция периодически вызывается с одинаковыми аргументами. Раньше приходилось создавать свою реализацию, но в Python 3.2+ появился декоратор lru_cache, который позволяет нам быстро кэшировать и вскрывать возвращаемые значения функции.
Давайте реализуем калькулятор чисел Фибоначчи с использованием кэша. Советую попробовать запустить любую рекурсивную функцию с кэшированием и без него, прирост в скорости замечается сразу.
Подписывайтесь на канал 👉@pythonofff
👍2
Библиотека Numpy
При создании массивом мы получаем тип ndarray.
Рассмотрим наиболее часты атрибуты (не методы!) применимые к массивам:
ndim - число измерений (чаще их называют "оси") массива.
shape - размеры массива, его форма. Это кортеж натуральных чисел, показывающий длину массива по каждой оси. Для матрицы из n строк и m столбов, shape будет (n,m). Число элементов кортежа shape равно ndim.
size - количество элементов массива. Очевидно, равно произведению всех элементов атрибута shape.
dtype - объект, описывающий тип элементов массива
itemsize - размер каждого элемента массива в байтах.
data - буфер, содержащий фактические элементы массива. Обычно мы не используем этот атрибут, так как обращаться к элементам массива проще всего с помощью индексов.
Подписывайтесь на канал 👉@pythonofff
При создании массивом мы получаем тип ndarray.
Рассмотрим наиболее часты атрибуты (не методы!) применимые к массивам:
ndim - число измерений (чаще их называют "оси") массива.
shape - размеры массива, его форма. Это кортеж натуральных чисел, показывающий длину массива по каждой оси. Для матрицы из n строк и m столбов, shape будет (n,m). Число элементов кортежа shape равно ndim.
size - количество элементов массива. Очевидно, равно произведению всех элементов атрибута shape.
dtype - объект, описывающий тип элементов массива
itemsize - размер каждого элемента массива в байтах.
data - буфер, содержащий фактические элементы массива. Обычно мы не используем этот атрибут, так как обращаться к элементам массива проще всего с помощью индексов.
Подписывайтесь на канал 👉@pythonofff
👍3
Блок else в циклах.
Блок else в циклах for и while — это конструкция, которая позволяет выполнить определенный блок кода только в случае, если цикл завершился без использования оператора break. В цикле while условие проверяется перед каждой итерацией, и если оно истинно, то выполняется тело цикла. Цикл выполняется до тех пор, пока условие не станет ложным. В случае цикла for, он проходит по элементам последовательности (например, списку) и выполняет указанный блок кода для каждого элемента.
Давайте рассмотрим пример использования блока else в цикле for. Предположим, у нас есть функция find_needle, которая принимает на вход список haystack и элемент needle, и ищет needle в haystack. Мы хотим вывести сообщение, если элемент needle не найден в haystack. Для этого мы можем использовать цикл for для прохода по элементам haystack и проверки на равенство с needle. Если элемент найден, мы выводим сообщение и прерываем цикл с помощью оператора break. Если цикл завершается без прерывания, то выполняется блок else.
В данном примере, если элемент needle найден в haystack, то будет выведено сообщение «Needle found!». Если же элемент needle не найден, то будет выполнен блок else и выведено сообщение «Needle not found in haystack.». Это позволяет нам выполнить определенные действия в зависимости от результата поиска элемента в списке.
Таким образом, блок else в циклах for и while предоставляет удобный способ выполнения действий, которые должны произойти только в случае, если цикл завершился успешно, без дополнительных проверок условий. Это помогает улучшить читаемость и структуру кода, делая его более понятным и эффективным.
Подписывайтесь на канал 👉@pythonofff
Блок else в циклах for и while — это конструкция, которая позволяет выполнить определенный блок кода только в случае, если цикл завершился без использования оператора break. В цикле while условие проверяется перед каждой итерацией, и если оно истинно, то выполняется тело цикла. Цикл выполняется до тех пор, пока условие не станет ложным. В случае цикла for, он проходит по элементам последовательности (например, списку) и выполняет указанный блок кода для каждого элемента.
Давайте рассмотрим пример использования блока else в цикле for. Предположим, у нас есть функция find_needle, которая принимает на вход список haystack и элемент needle, и ищет needle в haystack. Мы хотим вывести сообщение, если элемент needle не найден в haystack. Для этого мы можем использовать цикл for для прохода по элементам haystack и проверки на равенство с needle. Если элемент найден, мы выводим сообщение и прерываем цикл с помощью оператора break. Если цикл завершается без прерывания, то выполняется блок else.
def find_needle(haystack, needle):
for item in haystack:
if item == needle:
print("Needle found!")
break
else:
print("Needle not found in haystack.")
В данном примере, если элемент needle найден в haystack, то будет выведено сообщение «Needle found!». Если же элемент needle не найден, то будет выполнен блок else и выведено сообщение «Needle not found in haystack.». Это позволяет нам выполнить определенные действия в зависимости от результата поиска элемента в списке.
Таким образом, блок else в циклах for и while предоставляет удобный способ выполнения действий, которые должны произойти только в случае, если цикл завершился успешно, без дополнительных проверок условий. Это помогает улучшить читаемость и структуру кода, делая его более понятным и эффективным.
Подписывайтесь на канал 👉@pythonofff
👍4
😎 Хотите стать Python-разработчиком и начать успешную карьеру в IT? Время действовать!
🐍 Python — самый востребованный язык. На курсе вы изучите синтаксис, фреймворки Django и FastAPI, научитесь работать с базами данных и создадите портфолио, которое привлекает топовые команды.
🚀 Программа составлена практикующими экспертами, а выпускники OTUS высоко ценятся среди ведущих компаний. Обучение с нуля до Junior-разработчика за 6 месяцев!
➡️ Старт уже близко — успейте занять место в группе! Узнать больше и получить скидку до 15% по промокоду PythonBasic_5 : https://vk.cc/cHTGuf
🐍 Python — самый востребованный язык. На курсе вы изучите синтаксис, фреймворки Django и FastAPI, научитесь работать с базами данных и создадите портфолио, которое привлекает топовые команды.
🚀 Программа составлена практикующими экспертами, а выпускники OTUS высоко ценятся среди ведущих компаний. Обучение с нуля до Junior-разработчика за 6 месяцев!
➡️ Старт уже близко — успейте занять место в группе! Узнать больше и получить скидку до 15% по промокоду PythonBasic_5 : https://vk.cc/cHTGuf
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Срок действия промокода до 30.01.2025
👍1
Как удалить пустые строки в списке на python?
array = ['Stephen King', '', 'J. K. Rowling', '', 'Oliver Bowden']
filtred_array = list(filter(None, array))
print(filtred_array)
# Вывод : ['Stephen King', 'J. K. Rowling', 'Oliver Bowden']
Подписывайтесь на канал 👉@pythonofff
array = ['Stephen King', '', 'J. K. Rowling', '', 'Oliver Bowden']
filtred_array = list(filter(None, array))
print(filtred_array)
# Вывод : ['Stephen King', 'J. K. Rowling', 'Oliver Bowden']
Подписывайтесь на канал 👉@pythonofff
👍4
Продвинутая работа со списками
При работе со списками крайне полезно знать как правильно формировать срезы списка. В приложениях, активно использующих группы данных - срезы незаменимый инструмент.
В общей форме формирования среза выглядит следующим образом:
list[start:end:step]
Комбинации параметров помогут достичь необходимого результата.
Подписывайтесь на канал 👉@pythonofff
При работе со списками крайне полезно знать как правильно формировать срезы списка. В приложениях, активно использующих группы данных - срезы незаменимый инструмент.
В общей форме формирования среза выглядит следующим образом:
list[start:end:step]
Комбинации параметров помогут достичь необходимого результата.
Подписывайтесь на канал 👉@pythonofff
👍3❤1🎉1
all и any
Полезные функции, которые помогут узнать есть ли определенные значения в объекте.
all возвращает True, если все объекты равны True или удовлетворяют условию.
any в свою очередь делает то же самое, но возвращает True, если хотя бы один равен True.
Теперь нет необходимости перебирать списки, достаточно использовать данные функции.
Подписывайтесь на канал 👉@pythonofff
Полезные функции, которые помогут узнать есть ли определенные значения в объекте.
all возвращает True, если все объекты равны True или удовлетворяют условию.
any в свою очередь делает то же самое, но возвращает True, если хотя бы один равен True.
Теперь нет необходимости перебирать списки, достаточно использовать данные функции.
Подписывайтесь на канал 👉@pythonofff
👍4❤2
Примеры использования модуля os в Python
os.chdir() и os.getcwd()
Функция os.chdir позволяет нам вносить изменения в каталоге, который мы в данный момент используем в сессии.
Если вам нужно знать, какой путь вы в данный момент используете, для этой нужно вызвать os.getcwd(). Указанный код демонстрирует нам, что мы открыли директорию по умолчанию в Пайтоне, после запуска данного кода в IDLE.
После этого мы изменили папки, при помощи os.chdir().
Подписывайтесь на канал 👉@pythonofff
os.chdir() и os.getcwd()
Функция os.chdir позволяет нам вносить изменения в каталоге, который мы в данный момент используем в сессии.
Если вам нужно знать, какой путь вы в данный момент используете, для этой нужно вызвать os.getcwd(). Указанный код демонстрирует нам, что мы открыли директорию по умолчанию в Пайтоне, после запуска данного кода в IDLE.
После этого мы изменили папки, при помощи os.chdir().
Подписывайтесь на канал 👉@pythonofff
Создание функций на основе других с "замороженными" параметрами
Привет, сегодня поговорим про очень важную функцию partial из пакета functools. Более подробно мы рассказываем про это в курсе, но сейчас дадим краткое описание работы.
Данная функция принимает в качестве первого аргумента любую другую функцию, а дальше параметры, которые будут автоматически переданы в эту функцию при вызове уже новой функции, которую вернёт partial.
Например, можем создать функцию, которая умножает два числа, а потом "заморозить" один аргумент, как на картинке.
Подписывайтесь на канал 👉@pythonofff
Привет, сегодня поговорим про очень важную функцию partial из пакета functools. Более подробно мы рассказываем про это в курсе, но сейчас дадим краткое описание работы.
Данная функция принимает в качестве первого аргумента любую другую функцию, а дальше параметры, которые будут автоматически переданы в эту функцию при вызове уже новой функции, которую вернёт partial.
Например, можем создать функцию, которая умножает два числа, а потом "заморозить" один аргумент, как на картинке.
Подписывайтесь на канал 👉@pythonofff
👍3
Как обрабатывать исключения?
Обработка исключений в Пайтон – это очень просто. Потратим немного времени и напишем несколько примеров, которые их вызовут. Мы начнем с одной из самых элементарных проблем: деление на ноль.
Если мы обратимся к урокам элементарной математики, то вспомним, что на ноль делить нельзя. В Пайтоне данная операция вызовет ошибку, как мы можем видеть в примере выше. Чтобы поймать ошибку, мы завернем операцию в оператор try/except.
Подписывайтесь на канал 👉@pythonofff
Обработка исключений в Пайтон – это очень просто. Потратим немного времени и напишем несколько примеров, которые их вызовут. Мы начнем с одной из самых элементарных проблем: деление на ноль.
Если мы обратимся к урокам элементарной математики, то вспомним, что на ноль делить нельзя. В Пайтоне данная операция вызовет ошибку, как мы можем видеть в примере выше. Чтобы поймать ошибку, мы завернем операцию в оператор try/except.
Подписывайтесь на канал 👉@pythonofff
❤2
Функция itertools.cycle
Напоминаю, что у нас всё ещё идёт набор на курс, который начинается уже в этот понедельник. А сейчас покажу вам кое-что интересное из курса.
В лекции, посвященной итераторам и генераторам, мы также показываем полезные функции из пакета itertools. К примеру, метод cycle из последовательности ['red', 'white', 'blue'] генерирует повторяющуюся бесконечную.
А далее, например, можно воспользоваться islice. Он возвращает конечный итератор из любой большой или даже бесконечной последовательности.
Подписывайтесь на канал 👉@pythonofff
Напоминаю, что у нас всё ещё идёт набор на курс, который начинается уже в этот понедельник. А сейчас покажу вам кое-что интересное из курса.
В лекции, посвященной итераторам и генераторам, мы также показываем полезные функции из пакета itertools. К примеру, метод cycle из последовательности ['red', 'white', 'blue'] генерирует повторяющуюся бесконечную.
А далее, например, можно воспользоваться islice. Он возвращает конечный итератор из любой большой или даже бесконечной последовательности.
Подписывайтесь на канал 👉@pythonofff
👍2
Класс collections.deque
Класс deque реализует двухконечную очередь, которая поддерживает добавление и удаление элементов с обоих концов в течение О(1) времени.
Объекты deque представлены в виде двусвязных списков, что дает им превосходную производительность для входящих и выходящих элементов, но при этом у него плохая производительность O(n) при работе со случайно принимаемыми элементами в середине очереди.
В связи с тем, что deque поддерживает вставку и удаление элементов одинаково хорошо, они могут поддерживать и очереди и стеки collections.deque это отличное решение, если вы ищите структуру данных очереди в Python в стандартной библиотеке.
Подписывайтесь на канал 👉@pythonofff
Класс deque реализует двухконечную очередь, которая поддерживает добавление и удаление элементов с обоих концов в течение О(1) времени.
Объекты deque представлены в виде двусвязных списков, что дает им превосходную производительность для входящих и выходящих элементов, но при этом у него плохая производительность O(n) при работе со случайно принимаемыми элементами в середине очереди.
В связи с тем, что deque поддерживает вставку и удаление элементов одинаково хорошо, они могут поддерживать и очереди и стеки collections.deque это отличное решение, если вы ищите структуру данных очереди в Python в стандартной библиотеке.
Подписывайтесь на канал 👉@pythonofff
❤2
Простая обрезка изображения в Pillow
Обозначим область обрезки изображения с помощью кортежа box=(left, upper, right, lower).
Верхней левой координате соответствует (x, y) = (left, upper), а нижней правой — (x, y) = (right, lower). Область, которую нужно обрезать — left <= x <right и upper <= y <lower, а пиксели x = right и y = lower не включаются.
Не забудьте, что box используется вместе со скобками ().
Подписывайтесь на канал 👉@pythonofff
Обозначим область обрезки изображения с помощью кортежа box=(left, upper, right, lower).
Верхней левой координате соответствует (x, y) = (left, upper), а нижней правой — (x, y) = (right, lower). Область, которую нужно обрезать — left <= x <right и upper <= y <lower, а пиксели x = right и y = lower не включаются.
Не забудьте, что box используется вместе со скобками ().
Подписывайтесь на канал 👉@pythonofff
👍3