Cool and Fun Python
518 subscribers
30 photos
8 videos
1 file
39 links
Крутой и весёлый Python. Случаи из практики и не только.
Download Telegram
​​И вот вам история из практики преподавания.
Однажды студент пожаловался, что не может написать рабочую функцию. Попросив код, с лёгкостью запустил его в своей IDE. У меня работает. 🤔 Спустя почти час переписки со студентом, танцев с бубном вокруг проверок интерпретатора, IDE, переменных окружения, версий и прочих безумных гипотез, причина была найдена. Ответ на картинке. 😉

#истории #lifehack
😁4
Целую неделю ждал хотя бы 10 реакций 🤯. Не дождался. Этот пост посвящается девятку интересующихся. 🫡

Что же такое 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👍163🔥31🤔1
Эволюция строки кода

В одном из проектов надо было разделить две переменных нацело. И в первой версии код выглядел как частное = делимое // делитель:
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
59🤯6👍5
Маленькая привычка, которая решает большие проблемы

Вы когда-нибудь слышали про флаги?
🏴‍☠- это пиратский флаг;
🏁 а это финишный флаг;
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
👍189🤯2
Принимаем решение в словаре

Что обычно делают, если надо проверить условие? Конечно же используют конструкцию 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
216🎄8🤯7🔥2🤬1🏆1
Использование символа подчёркивания _ в циклах 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
113👍71🤯1🤣1🏆1
Альтернатива if-elif-else / match-case из далёкого прошлого

Этот приём я узнал лет пять назад.

Ага! Пять. На календарь посмотри, 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
В продолжение идеи про словарь функций
Начало тут

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
Please open Telegram to view this post
VIEW IN TELEGRAM
👨‍💻63💯2🤯1👀1
Магические числа

Нравится волшебство? А вот и зря. Магические числа - антипаттерн в программировании.

Вместо того, чтобы делать срез до -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