Python Portal
55.3K subscribers
2.47K photos
401 videos
51 files
1.01K links
Всё самое интересное из мира Python

Связь: @devmangx

РКН: https://clck.ru/3GMMF6
Download Telegram
Если ты только начинаешь с Python, остановись и внимательно посмотри

Не меняй список во время прохода по нему.

Когда ты модифицируешь список прямо во время итерации, итератор начинает путаться. Он не “знает”, что список изменился прямо у него под ногами.

Например, этот код сломан:

items = [1, 2, 2, 3, 4]
for item in items:
if item == 2:
items.remove(item)
print(items)
# Output: [1, 2, 3, 4]


Здесь мы используем remove(), чтобы удалить все двойки из списка. Но если посмотреть на вывод, одна 2 все равно осталась. Почему так происходит: когда ты удаляешь элемент из списка, все элементы справа сдвигаются влево. А цикл продолжает идти дальше. В итоге происходит вот что: находится и удаляется первая 2. Вторая 2 сдвигается на ее место. Цикл переходит к следующему индексу и пропускает эту 2.

Лучший способ сделать это: итерироваться по копии:

for item in items[:]:
if item == 2:
items.remove(item)
print(items)
# Output: [1, 3, 4]


Когда ты проходишь по копии (поверхностной копии), индексы в исходной копии не меняются.

Еще лучше использовать list comprehension:

items = [x for x in items if x != 2]


Никогда, ни при каких условиях не модифицируй список (или любую коллекцию) прямо во время итерации по нему. Итератор плохо переносит структурные изменения: он может пропускать элементы, обрабатывать один и тот же элемент дважды или (в некоторых случаях, например со словарями) выбрасывать RuntimeError. Это плохая практика.

👉 @PythonPortal
Please open Telegram to view this post
VIEW IN TELEGRAM
34👍14🔥6🤣1
Ну что там

👉 @PythonPortal
Please open Telegram to view this post
VIEW IN TELEGRAM
32🤣25
Google раздал шума: в Chrome выкатили ранний превью WebMCP, и это приподносят как замену веб-скрейпингу

Теперь любой сайт может стать нативным инструментом для AI-агентов. 😶

👉 @PythonPortal
Please open Telegram to view this post
VIEW IN TELEGRAM
🤯229🤔1😢1
Немного базы Python. День 2: cлияние словарей

Если у тебя есть два словаря, которые нужно объединить, это можно сделать двумя простыми способами. Можно использовать оператор merge (|) или оператор (**). Ниже у нас есть два словаря: first_dict и second_dict. Мы будем использовать эти два метода, чтобы объединить словари. Вот код:

1️⃣ Использование оператора merge (|)

first_dict = {"kelly": 23,
"Derick": 14, "John": 7}
second_dict = {"Ravi": 45, "Mpho": 67}

combined_dict = first_dict | second_dict
print(combined_dict)


Вывод:

{'kelly': 23, 'Derick': 14, 'John': 7, 'Ravi': 45, 'Mpho': 67}


2️⃣Метод 2: использование оператора merge (**)

С этим оператором нужно поместить словари внутрь фигурных скобок. В коде ниже мы “подставляем” два словаря для объединения с помощью двух операторов *. Оба словаря заключены в фигурные скобки и разделены запятой.

first_dict = {"kelly": 23,
"Derick": 14, "John": 7}
second_dict = {"Ravi": 45, "Mpho": 67}

combined_dict = {**first_dict, **second_dict}
print(combined_dict)


Вывод:

{'kelly': 23, 'Derick': 14, 'John': 7, 'Ravi': 45, 'Mpho': 67}


👉 @PythonPortal
Please open Telegram to view this post
VIEW IN TELEGRAM
32👍8🔥3🤝1
Please open Telegram to view this post
VIEW IN TELEGRAM
🤣62😁4
Ускорь JSON-ответы FastAPI в 2 раза, а то и больше

1. Обновись до только что вышедшего FastAPI 0.131.0
2. Объявляй response model (тип возврата)

После этого @pydantic будет заниматься JSON-сериализацией на стороне Rust 🦀

https://fastapi.tiangolo.com/advanced/custom-response/#json-performance

👉 @PythonPortal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍173🔥3🌚2
Немного базы. День 3: Календарь в Python

В Python есть встроенный модуль calendar. Мы можем импортировать этот модуль, чтобы вывести календарь. С календарём можно делать много разных вещей.

Допустим, мы хотим посмотреть апрель 2022 года. Мы используем класс month из модуля calendar и передадим год и месяц в качестве аргументов. См. ниже:

import calendar

month = calendar.month(2022, 4)
print(month)


Есть ещё много всего, что можно сделать с calendar. Например, с его помощью можно проверить, является ли заданный год високосным или нет. Давай проверим, високосный ли 2022 год.

import calendar

month = calendar.isleap(2022)
print(month)


False


👉 @PythonPortal
Please open Telegram to view this post
VIEW IN TELEGRAM
25👍12
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥34😁65👀3👍2🤣2
This media is not supported in your browser
VIEW IN TELEGRAM
Совет для AI-инженеров 💡

Небольшая VLM, дообученная на вашем кастомном датасете, по точности может быть на уровне GPT-5 и при этом стоит в 50 раз дешевле.

Например, LFM2.5-VL-1.6B от Liquid Ai можно гонять локально на полной скорости через llama.cpp ↓

- Python CLI пример

👉 @PythonPortal
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥10👍54
Немного базы Python. День 4: Получение текущего времени и даты

Ниже приведенный код показывает, как можно получить текущее время с помощью модуля datetime. Метод now() возвращает объект datetime, представляющий текущие дату и время в соответствии с системными часами. Метод strftime() форматирует время для нужного вывода. Этот код показывает, как использовать модуль datetime вместе с методом strftime(), чтобы получить отформатированную строку времени в формате часов, минут и секунд.

from datetime import datetime

time_now = datetime.now().strftime('%H:%M:%S')
print(f'Текущее время: {time_now}')


Текущее время: 17:37:28


Что, если мы хотим вернуть сегодняшнюю дату? Мы можем использовать date из модуля datetime. Ниже используется метод today():

from datetime import date

today_date = date.today()
print(today_date)


2023-09-20


👉 @PythonPortal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍169🔥4
Чувак сжал 2,87 ГБ данных до 8,9 МБ (!) с помощью своего кастомного компрессора данных :D

Там было 21k JSON-файлов с данными о крикетных матчах, он использовал их структуру и сжал это до ~42,46 МБ

Максимум, что смог gzip, это ~53 МБ, а 7z ~45 МБ.

Потом он скомбинировал свой компрессор + 7z и ужал до 8,9 МБ

Это ЧИСТАЯ случайность, дальше сжать уже просто нельзя.

Ему пришлось почитать про энтропию Шеннона и алгоритмическое сжатие данных

Полный разбор в GitHub-репозитории 😎

👉 @PythonPortal
Please open Telegram to view this post
VIEW IN TELEGRAM
🤯61🔥116🏆2👍1
Немного базы Python. День 5. Сортировка списка по убыванию

Метод sort() сортирует список по возрастанию (по умолчанию).

Чтобы sort() работал, элементы списка должны быть одного типа. Нельзя сортировать список со смешанными типами данных, например числа и строки.

У метода sort() есть параметр reverse; чтобы отсортировать список по убыванию, установите reverse=True.

list1 = [2, 5, 6, 8, 1, 8, 9, 11]

list1.sort(reverse=True)
print(list1)

# [11, 9, 8, 8, 6, 5, 2, 1]


Помните: sort() это строго метод списка (list). Его нельзя использовать для сортировки set, tuple, string или dictionary.

Метод sort() не возвращает новый список; он сортирует существующий список на месте (in place).

Если вы попробуете создать новый объект с помощью sort(), он вернет None. Пример ниже:

list1 = [2, 5, 6, 8, 1, 8, 9, 11]
list2 = list1.sort(reverse=True)
print(list2)

# None


У метода sort() есть необязательный параметр key, который позволяет настроить поведение сортировки.

Этот параметр используется для передачи функции, которая задает критерий сортировки элементов списка.

В примере ниже у нас список кортежей, и мы хотим отсортировать его по возрасту студента. Используя параметр key вместе с lambda-функцией, можно реализовать такую кастомную сортировку. См. ниже:

students = [
("Alice", 22),
("Bob", 20),
("Charlie", 24)
]

# Сортируем студентов по возрасту, используя lambda-функцию как key
students.sort(key=lambda students: students[1])
print(students)

# [('Bob', 20), ('Alice', 22), ('Charlie', 24)]


Метод sort() является стабильным (stable), то есть сохраняет относительный порядок равных элементов в отсортированном списке.

Если у двух элементов одинаковый ключ сортировки, их исходный порядок сохраняется. Например, если у "Alice" и "Bob" одинаковый возраст, их порядок останется прежним. Это и называется стабильной сортировкой (stable sorting). См. пример:

students = [
("Alice", 22),
("Bob", 22),
("Charlie", 24)
]

# Сортируем студентов по возрасту, используя lambda-функцию как key
students.sort(key=lambda students: students[1])
print(students)

# [('Alice', 22), ('Bob', 22), ('Charlie', 24)]


Как видно, порядок элементов "Alice" и "Bob" не изменился, потому что у них одинаковый возраст.

👉 @PythonPortal
Please open Telegram to view this post
VIEW IN TELEGRAM
21👍8
Главное захотеть 🧠

👉 @PythonPortal
Please open Telegram to view this post
VIEW IN TELEGRAM
😁393🤔1
Перестаньте использовать if obj == None, используйте if obj is None

В Python, когда вы пишете:

obj == None


вы не проверяете напрямую, является ли obj значением None. Вместо этого вы спрашиваете, равен ли объект None.

Да, во многих случаях результат будет таким же, как у кода:

obj is None


Но поведение у этих двух вариантов разное, и эта разница важна.

Когда вы используете:

obj == None


Python вызывает метод __eq__ у объекта. То есть сам объект решает, что значит "равен None". А этот метод можно переопределить.

Если obj это экземпляр класса, в котором __eq__ реализован так, что при сравнении с None возвращается True (даже если объект на самом деле не None), тогда obj == None может ошибочно дать True.

Пример:

class Weird:
def __eq__(self, other):
return True # Всегда утверждает, что равен

obj = Weird()

print(obj == None) # True
print(obj is None) # False


Здесь видно, что obj == None возвращает True из-за кастомного поведения оператора __eq__ в классе.

Из этого следует, что при использовании obj == None результат не всегда предсказуем.

С другой стороны, когда вы пишете:

obj is None


вы используете оператор is, который нельзя переопределить. Это значит, что результат всегда будет одинаковым и предсказуемым.

Оператор is проверяет идентичность объектов, то есть указывают ли две ссылки на один и тот же объект. Поскольку None это singleton (единственный экземпляр), obj is None это правильный и самый эффективный способ такой проверки.

❤️ Поэтому всегда рекомендуется, и это best practice, использовать obj is None вместо obj == None ради предсказуемости и эффективности.

👉 @PythonPortal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍264🔥2