И вот вам история из практики преподавания.
Однажды студент пожаловался, что не может написать рабочую функцию. Попросив код, с лёгкостью запустил его в своей IDE. У меня работает. 🤔 Спустя почти час переписки со студентом, танцев с бубном вокруг проверок интерпретатора, IDE, переменных окружения, версий и прочих безумных гипотез, причина была найдена. Ответ на картинке. 😉
#истории #lifehack
Однажды студент пожаловался, что не может написать рабочую функцию. Попросив код, с лёгкостью запустил его в своей IDE. У меня работает. 🤔 Спустя почти час переписки со студентом, танцев с бубном вокруг проверок интерпретатора, IDE, переменных окружения, версий и прочих безумных гипотез, причина была найдена. Ответ на картинке. 😉
#истории #lifehack
😁4
Целую неделю ждал хотя бы 10 реакций 🤯. Не дождался. Этот пост посвящается девятку интересующихся. 🫡
Что же такое ast.literal_eval ? Если просто и коротко, то это функция для превращения строки str в другой питоновский тип данных.
Смотрите пример, чтобы всё понять:
Как видно из примера, функция literal_evel сама подбирает нужный тип для конвертации содержимого строки. Круто!
⚠Внимание!
literal_eval удобно использовать, даже если вы не уверены в данных. Выполнить
Для самых любопытных, напомню.🤓
В Python есть модуль pickle. Он умеет мариновать питоновские типы в виде байт-файла. О нём писал тут и тут.
А ещё в Python есть модуль json. Он тоже умеет превращать строк в данные и наоборот. Про него я тут не писал. 🙃
#познавательно #lifehack
Что же такое ast.literal_eval ? Если просто и коротко, то это функция для превращения строки str в другой питоновский тип данных.
Смотрите пример, чтобы всё понять:
import ast
# Возвращает None
result = ast.literal_eval('None')
print(result) # None
print(type(result)) # <class 'NoneType'>
# Возвращает список
result = ast.literal_eval('[1, 2, 3]')
print(result) # [1, 2, 3]
print(type(result)) # <class 'list'>
# Возвращает словарь
result = ast.literal_eval('{"key": "value"}')
print(result) # {'key': 'value'}
print(type(result)) # <class 'dict'>
Как видно из примера, функция literal_evel сама подбирает нужный тип для конвертации содержимого строки. Круто!
⚠Внимание!
literal_eval удобно использовать, даже если вы не уверены в данных. Выполнить
rm -rf / функция не сможет. Но будьте готовы отлавливать ошибки, если данные не поддаются преобразованию:result = ast.literal_eval('a = 42') # SyntaxError: invalid syntax
result = ast.literal_eval('Hi') # ValueError: malformed node or string on line 1: <ast.Name object at 0x7969dde980>Для самых любопытных, напомню.
В Python есть модуль pickle. Он умеет мариновать питоновские типы в виде байт-файла. О нём писал тут и тут.
А ещё в Python есть модуль json. Он тоже умеет превращать строк в данные и наоборот. Про него я тут не писал. 🙃
#познавательно #lifehack
Please open Telegram to view this post
VIEW IN TELEGRAM
3👍16✍3🔥3❤1🤔1
Эволюция строки кода
В одном из проектов надо было разделить две переменных нацело. И в первой версии код выглядел как
Проект развивался. И понадобился остаток от деления. Он использовался дальше по коду. Выбор пал на вариант 2, как более короткий:
Любой проект не стоит на месте, эволюционирует. Понадобилось округлять остаток от деления в большую сторону. Но функция divmod так вписалась в проект, что решено было использоватьсякостыль маленькую хитрость с преобразованием типов:
Да и остаток от деления всё так же нужен дальше по коду.😉
Познавательная минутка🤓
Если вам нужно округлить вещественное число до целого в большую сторону, Python рекомендует использовать функцию ceil из модуля math стандартной библиотеки:
✍️ - беру на вооружение
🤯 - как это работает?
#познавательно #lifehack #python3k #python
В одном из проектов надо было разделить две переменных нацело. И в первой версии код выглядел как
частное = делимое // делитель:div = divisible // divisor
Проект развивался. И понадобился остаток от деления. Он использовался дальше по коду. Выбор пал на вариант 2, как более короткий:
# Вариант 1
div = divisible // divisor
mod = divisible % divisor
# Вариант 2
div, mod = divmod(divisible, divisor)
Любой проект не стоит на месте, эволюционирует. Понадобилось округлять остаток от деления в большую сторону. Но функция divmod так вписалась в проект, что решено было использоваться
div, mod = divmod(divisible, divisor)
div += int(bool(mod))
Да и остаток от деления всё так же нужен дальше по коду.
Познавательная минутка
Если вам нужно округлить вещественное число до целого в большую сторону, Python рекомендует использовать функцию ceil из модуля math стандартной библиотеки:
import math
div = math.ceil(divisible // divisor)
✍️ - беру на вооружение
🤯 - как это работает?
#познавательно #lifehack #python3k #python
Please open Telegram to view this post
VIEW IN TELEGRAM
5✍9🤯6👍5
Хэштеги канала в алфавитном порядке. Закрепил.
#алгоритмы
#БД
#видео
#графы
#истории
#многопоточность
#ООП
#познавательно
#структуры_данных
#юмор
#bash
#crontab
#intro
#lifehack
#PEP8
#python
#python3k
#SQLAlchemy
Python3k Python3kMax
#алгоритмы
#БД
#видео
#графы
#истории
#многопоточность
#ООП
#познавательно
#структуры_данных
#юмор
#bash
#crontab
#intro
#lifehack
#PEP8
#python
#python3k
#SQLAlchemy
Python3k Python3kMax
👍4🔥1
Маленькая привычка, которая решает большие проблемы
Вы когда-нибудь слышали про флаги?
🏴☠- это пиратский флаг;
🏁 а это финишный флаг;
Познавательная минутка🤓
В программировании флаг - это переменная, которая может принимать только два значения: True или False.
Главная задача флага - показать, что что-то изменилось и что нужно на это отреагировать.
Так что за маленькая привычка из заголовка? Давать переменным-флагам имена, которые начинаются с
- пользователь выиграл -
- письмо отправлено -
- идёт обработка большого массива данных и процесс не должен брать новые задачи. Он занят, он
К таким именам быстро привыкаешь. Скорость написания и отладки кода повышается. А значит появляется время насладиться чашечкой кофе.
✍️ - беру на вооружение
🤯 - как это работает?
👍 - is_thanks
#познавательно #lifehack #python3k #python
Вы когда-нибудь слышали про флаги?
🏴☠- это пиратский флаг;
🏁 а это финишный флаг;
True и False - пара, создающая логический флаг в программе.Познавательная минутка
В программировании флаг - это переменная, которая может принимать только два значения: True или False.
Главная задача флага - показать, что что-то изменилось и что нужно на это отреагировать.
Так что за маленькая привычка из заголовка? Давать переменным-флагам имена, которые начинаются с
is_:- пользователь выиграл -
is_win- письмо отправлено -
is_send_email- идёт обработка большого массива данных и процесс не должен брать новые задачи. Он занят, он
is_working_nowК таким именам быстро привыкаешь. Скорость написания и отладки кода повышается. А значит появляется время насладиться чашечкой кофе.
✍️ - беру на вооружение
🤯 - как это работает?
👍 - is_thanks
#познавательно #lifehack #python3k #python
Please open Telegram to view this post
VIEW IN TELEGRAM
👍18✍9🤯2
Принимаем решение в словаре
Что обычно делают, если надо проверить условие? Конечно же используют конструкцию if.
Типичный пример:
Настолько просто, что в комментариях не нуждается.
А теперь избавимся от конструкции if else. Для этого перенесём логику принятия решения в словарь:
Как вам такая версия? Если раньше не пользовался, выглядит непривычно. Но может среди читателей есть те, кто готов поделится своими более крутыми версиями переноса логики в словарь? Пишите в комментариях.
✍️ - беру на вооружение
🤯 - как это работает?
🎄 - с Новым годом и Рождеством
#познавательно #lifehack #python3k #python
Что обычно делают, если надо проверить условие? Конечно же используют конструкцию if.
Типичный пример:
a = 42
b = 73
if a > b:
print("Первое больше")
else:
print("Первое не больше")
Настолько просто, что в комментариях не нуждается.
А теперь избавимся от конструкции if else. Для этого перенесём логику принятия решения в словарь:
a = 42
b = 73
choice = {
True: "Первое больше",
False: "Первое не больше",
}
print(choice[a > b])
Как вам такая версия? Если раньше не пользовался, выглядит непривычно. Но может среди читателей есть те, кто готов поделится своими более крутыми версиями переноса логики в словарь? Пишите в комментариях.
✍️ - беру на вооружение
🤯 - как это работает?
🎄 - с Новым годом и Рождеством
#познавательно #lifehack #python3k #python
2✍16🎄8🤯7🔥2🤬1🏆1
Использование символа подчёркивания
Обратил внимание, что новички, которые только познакомились с переменной
Хорошо: Использование
Символ подчёркивания
Здесь переменная
Познавательная минутка🤓
Символ
Плохо: Использование
Если же символ
Этот плохой код, потому что переменная
Использование символа подчёркивания
✍️ - беру на вооружение
🤯 - как это работает?
👍 -
#познавательно #lifehack #python3k #python
_ в циклах for: паттерны и антипаттерныОбратил внимание, что новички, которые только познакомились с переменной
_, начинают использовать её где нужно и где не нужно. Рассмотрим два варианта применения символа _ в контексте цикла for.Хорошо: Использование
_ только для управления цикломСимвол подчёркивания
_ применяется в качестве имени переменной-итератора, если её значение не требуется явно использовать внутри тела цикла. Это позволяет подчеркнуть, что данная переменная несёт исключительно служебную функцию и не должна участвовать в дальнейшей обработке данных. Например:data = [1, 2, 3]
for _ in range(len(data)):
print("Повторение без использования значения")
Здесь переменная
_ используется только для того, чтобы выполнить определённое количество итераций, но она нигде более не упоминается в теле цикла. Этот подход является общепринятым и считается хорошим стилем программирования, поскольку он ясно показывает намерение разработчика и минимизирует риск случайного изменения или повторного использования переменной.Познавательная минутка
Символ
_ широко признан в сообществе Python как обозначение "переменной-пустышки".Плохо: Использование
_ внутри циклаЕсли же символ
_ используется не только для управления циклом, но также задействуется в теле цикла для каких-либо операций, это может привести к путанице и ошибкам. Рассмотрим следующий пример:data = [10, 20, 30]
total = 0
for _ in data:
total += _
print(total)
Этот плохой код, потому что переменная
_ здесь используется и в теле цикла. Такой подход нарушает соглашение об использовании _ . Правильно было бы использовать i или даже item вместо _.Использование символа подчёркивания
_ в циклах for может быть полезным инструментом. Правильное использование улучшает ясность и эффективность кода, тогда как злоупотребление может привести к трудностям в отладке и поддержке программного обеспечения.✍️ - беру на вооружение
🤯 - как это работает?
👍 -
for _ in data:#познавательно #lifehack #python3k #python
Please open Telegram to view this post
VIEW IN TELEGRAM
1✍13👍7❤1🤯1🤣1🏆1
Альтернатива if-elif-else / match-case из далёкого прошлого
Этот приём я узнал лет пять назад.
Ага! Пять. На календарь посмотри, star-пёр. 2026 на дворе. Ты этот приём узнал лет 15-20 назад.🤓
Итак, есть большой, просто огромный if.
Что делать, когда один if-elif-else занимает сотни строк кода?🤔
Самый простой и логичный вариант - перенести логику в функции.
Как видите, код поделился на отдельные блоки-функции, а полотно if-elif-else стало компактным.
Эй! Хватит полотен. Переходи к своему секретному приёму.🤓
Итак, секрет в словаре.
Ключ - значение, с которым сравниваем data.
Значение - функция-обработчик. И конечно же функцию в словарь передаём, а не вызываем.
Теперь мы совершенно избавились от if-elif-else. Вместо него словарь funcs со всеми вариантами ветлвелния.
Вместо вызова у нас метод
Кстати, две последние строки можно записать в одну, вот так:
✍️ - беру на вооружение
🤯 - как это работает?
🎄 - неужели праздники всё?
#python3k #lifehack
Python3k
Этот приём я узнал лет пять назад.
Ага! Пять. На календарь посмотри, star-пёр. 2026 на дворе. Ты этот приём узнал лет 15-20 назад.
Итак, есть большой, просто огромный if.
if data == "one":
# много строк кода
...
elif data == "two":
# ещё больше строк кода
...
elif data = "three"
# кода меньше не становится
...
else:
# тут не очень много кода, строк 15-20
...
Что делать, когда один if-elif-else занимает сотни строк кода?
Самый простой и логичный вариант - перенести логику в функции.
def func_one():
# много строк кода, но в отдельной функции
...
def func_two():
# ещё больше строк кода, но в функции не так страшно
...
def func_three():
# кода меньше не становится, но визуально он разбит на более мелки блоки
...
def func_else():
# тут не очень много кода
...
if data == "one":
func_one()
elif data == "two":
func_two()
elif data == "three"
func_three()
else:
func_else()
Как видите, код поделился на отдельные блоки-функции, а полотно if-elif-else стало компактным.
Эй! Хватит полотен. Переходи к своему секретному приёму.
Итак, секрет в словаре.
Ключ - значение, с которым сравниваем data.
Значение - функция-обработчик. И конечно же функцию в словарь передаём, а не вызываем.
def func_one():
...
def func_two():
...
def func_three():
...
def func_else():
...
funcs = {
"one": func_one,
"two": func_two,
"three": func_three,
}
func = funcs.get(data, func_else)
func()
Теперь мы совершенно избавились от if-elif-else. Вместо него словарь funcs со всеми вариантами ветлвелния.
Вместо вызова у нас метод
.get(data). В него же помещаем ветку else.Кстати, две последние строки можно записать в одну, вот так:
funcs.get(data, func_else)()
✍️ - беру на вооружение
🤯 - как это работает?
#python3k #lifehack
Python3k
Please open Telegram to view this post
VIEW IN TELEGRAM
✍13🎄9🤯6
В продолжение идеи про словарь функций
Начало тут
Так можно не просто сравнивать
Познавательная минутка🤓
lambda функция в Python является анонимной. Это значит, что перед lambda не ставят знак равно.
Такой код считается плохим тоном в Python☝️
В словаре функций lambda становится ключём словаря, но без присваивания переменной. Она (lambda) остаётся анонимной, Гвидо доволен, коллеги делятся печеньками.
✍️ - беру на вооружение
🤯 - как это работает?
👨💻 - дедлайн, айтишник торжествует
#python3k #lifehack
Python3k
Начало тут
def handle_negative():
print("Обработка отрицательных значений")
...
def handle_zero():
print("Обработка нуля")
...
def handle_positive_less_than_ten():
print("Обработка положительных чисел меньше десяти")
...
def handle_greater_or_equal_to_ten():
print("Обработка чисел больше или равных десяти")
...
condition_func_map = {
lambda x: x < 0: handle_negative,
lambda x: x == 0: handle_zero,
lambda x: 0 < x < 10: handle_positive_less_than_ten,
lambda x: x >= 10: handle_greater_or_equal_to_ten
}
def process_data(data):
for condition, handler in condition_func_map.items():
if condition(data):
return handler()
Так можно не просто сравнивать
data с фиксированными значениями. Теперь это if-elif-else внутри ключей словаря.Познавательная минутка
lambda функция в Python является анонимной. Это значит, что перед lambda не ставят знак равно.
my_func = lambda x: x ** 2Такой код считается плохим тоном в Python
В словаре функций lambda становится ключём словаря, но без присваивания переменной. Она (lambda) остаётся анонимной, Гвидо доволен, коллеги делятся печеньками.
✍️ - беру на вооружение
🤯 - как это работает?
👨💻 - дедлайн, айтишник торжествует
#python3k #lifehack
Python3k
Please open Telegram to view this post
VIEW IN TELEGRAM
✍5🤯3👨💻1
Redis хорош, но...
Ничего не имею против хранения данный в ОЗУ при помощи Redis. Быстрый доступ, копия на диске, очереди и прочие плюшки.
Но что же вы иногда творите, коллеги?😱
Если программе нужен набор ключ-значение и этот набор не выходит за пределы вашего однопроцессного однопоточного приложения, используйте словарь.
Всем спасибо, я высказался и восстанавливаюсь от постигшего меня шока.
✍️ - беру на вооружение
🤯 - как это работает?
👨💻 - мы не ищем лёгкий путей
#python3k #lifehack
Python3k Python3kMax
Ничего не имею против хранения данный в ОЗУ при помощи Redis. Быстрый доступ, копия на диске, очереди и прочие плюшки.
Но что же вы иногда творите, коллеги?
Если программе нужен набор ключ-значение и этот набор не выходит за пределы вашего однопроцессного однопоточного приложения, используйте словарь.
Всем спасибо, я высказался и восстанавливаюсь от постигшего меня шока.
✍️ - беру на вооружение
🤯 - как это работает?
👨💻 - мы не ищем лёгкий путей
#python3k #lifehack
Python3k Python3kMax
Please open Telegram to view this post
VIEW IN TELEGRAM
👨💻6✍3💯2🤯1👀1
Магические числа
Нравится волшебство? А вот и зря. Магические числа - антипаттерн в программировании.
Вместо того, чтобы делать срез до -38, надо явно сказать что это за число.
Тут должен начаться спор. Может быть хранить в константе положительное число, а в срезе указывать константу с минусом?
Но мы не будем ругаться. Мы пойдём дальше. И сразу код:
Что тут произошло?
Одна из стандартных функций slice многими забыта и не используется от слова совсем. С помощью неё создали срез-заготовку. И он поможет нам избежать магических чисел и добавить понятности в то, что именно мы вырезаем из текста.
✍️ - беру на вооружение
🤯 - как это работает?
👨💻 - вся моя магия внутри ИИ
#python3k #lifehack
Python3k Python3kMax
Нравится волшебство? А вот и зря. Магические числа - антипаттерн в программировании.
Вместо того, чтобы делать срез до -38, надо явно сказать что это за число.
STANDART_SUFFIX = -38
text = "Очень много текста. Прям очень. И он весь нужен для кода. Стандартное завершение любого текста."
useful_data = text[0:STANDART_SUFFIX]
Тут должен начаться спор. Может быть хранить в константе положительное число, а в срезе указывать константу с минусом?
Но мы не будем ругаться. Мы пойдём дальше. И сразу код:
without_suffix_slice = slice(0, -38)
text = "Очень много текста. Прям очень. И он весь нужен для кода. Стандартное завершение любого текста."
useful_data = text[without_suffix_slice]
Что тут произошло?
Одна из стандартных функций slice многими забыта и не используется от слова совсем. С помощью неё создали срез-заготовку. И он поможет нам избежать магических чисел и добавить понятности в то, что именно мы вырезаем из текста.
✍️ - беру на вооружение
🤯 - как это работает?
👨💻 - вся моя магия внутри ИИ
#python3k #lifehack
Python3k Python3kMax
✍7🤯2👨💻1