Немного базы Python:
Когда вы проходите циклом по итерируемому объекту, функция
В примере ниже обратите внимание на пробел между кавычками (
У
👉 @PythonPortal
print по горизонталиКогда вы проходите циклом по итерируемому объекту, функция
print печатает каждый элемент с новой строки. Это потому, что у print есть параметр end. По умолчанию значение этого параметра содержит символ перевода строки (end="\n"). Чтобы печатать в одну строку, нужно убрать перевод строки и заменить его на пустую строку (end="").В примере ниже обратите внимание на пробел между кавычками (
" "): он нужен, чтобы числа печатались с пробелами между ними. Если убрать пробел (""), числа выведутся слитно, вот так: 1367. Вот код, который это показывает:In [1]: my_list = [1, 3, 6, 7]
for number in my_list:
print(number, end=" ")
// 1 3 6 7
У
print есть еще один параметр: sep. Мы используем sep, чтобы задать, чем разделять выводимые значения. Ниже в качестве разделителя используется символ /:In [2]: print('12', '12', '1990', sep='/')
// 12/12/1990Please open Telegram to view this post
VIEW IN TELEGRAM
👍26❤10🤯3🔥1
Если ты только начинаешь с Python, остановись и внимательно посмотри
Не меняй список во время прохода по нему.
Когда ты модифицируешь список прямо во время итерации, итератор начинает путаться. Он не “знает”, что список изменился прямо у него под ногами.
Например, этот код сломан:
Здесь мы используем
Лучший способ сделать это: итерироваться по копии:
Когда ты проходишь по копии (поверхностной копии), индексы в исходной копии не меняются.
Еще лучше использовать list comprehension:
Никогда, ни при каких условиях не модифицируй список (или любую коллекцию) прямо во время итерации по нему. Итератор плохо переносит структурные изменения: он может пропускать элементы, обрабатывать один и тот же элемент дважды или (в некоторых случаях, например со словарями) выбрасывать
👉 @PythonPortal
Не меняй список во время прохода по нему.
Когда ты модифицируешь список прямо во время итерации, итератор начинает путаться. Он не “знает”, что список изменился прямо у него под ногами.
Например, этот код сломан:
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. Это плохая практика.Please open Telegram to view this post
VIEW IN TELEGRAM
❤34👍14🔥6🤣1
Google раздал шума: в Chrome выкатили ранний превью WebMCP, и это приподносят как замену веб-скрейпингу
Теперь любой сайт может стать нативным инструментом для AI-агентов.😶
👉 @PythonPortal
Теперь любой сайт может стать нативным инструментом для AI-агентов.
Please open Telegram to view this post
VIEW IN TELEGRAM
🤯22❤9🤔1😢1
Немного базы Python. День 2: cлияние словарей
Если у тебя есть два словаря, которые нужно объединить, это можно сделать двумя простыми способами. Можно использовать оператор merge (
1️⃣ Использование оператора merge (
Вывод:
2️⃣ Метод 2: использование оператора merge (
С этим оператором нужно поместить словари внутрь фигурных скобок. В коде ниже мы “подставляем” два словаря для объединения с помощью двух операторов
Вывод:
👉 @PythonPortal
Если у тебя есть два словаря, которые нужно объединить, это можно сделать двумя простыми способами. Можно использовать оператор merge (
|) или оператор (**). Ниже у нас есть два словаря: first_dict и second_dict. Мы будем использовать эти два метода, чтобы объединить словари. Вот код:|)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}**)С этим оператором нужно поместить словари внутрь фигурных скобок. В коде ниже мы “подставляем” два словаря для объединения с помощью двух операторов
*. Оба словаря заключены в фигурные скобки и разделены запятой.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}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 (тип возврата)
После этого🦀
https://fastapi.tiangolo.com/advanced/custom-response/#json-performance
👉 @PythonPortal
1. Обновись до только что вышедшего FastAPI 0.131.0
2. Объявляй response model (тип возврата)
После этого
@pydantic будет заниматься JSON-сериализацией на стороне Rust https://fastapi.tiangolo.com/advanced/custom-response/#json-performance
Please open Telegram to view this post
VIEW IN TELEGRAM
👍17❤3🔥3🌚2
Немного базы. День 3: Календарь в Python
В Python есть встроенный модуль
Допустим, мы хотим посмотреть апрель 2022 года. Мы используем класс
Есть ещё много всего, что можно сделать с
👉 @PythonPortal
В 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
Please open Telegram to view this post
VIEW IN TELEGRAM
❤25👍12
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥34😁6❤5👀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
Небольшая VLM, дообученная на вашем кастомном датасете, по точности может быть на уровне GPT-5 и при этом стоит в 50 раз дешевле.
Например, LFM2.5-VL-1.6B от Liquid Ai можно гонять локально на полной скорости через llama.cpp ↓
- Python CLI пример
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥10👍5❤4
Немного базы Python. День 4: Получение текущего времени и даты
Ниже приведенный код показывает, как можно получить текущее время с помощью модуля
Что, если мы хотим вернуть сегодняшнюю дату? Мы можем использовать
👉 @PythonPortal
Ниже приведенный код показывает, как можно получить текущее время с помощью модуля
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
Please open Telegram to view this post
VIEW IN TELEGRAM
👍16❤9🔥4
Чувак сжал 2,87 ГБ данных до 8,9 МБ (!) с помощью своего кастомного компрессора данных :D
Там было 21k JSON-файлов с данными о крикетных матчах, он использовал их структуру и сжал это до ~42,46 МБ
Максимум, что смог
Потом он скомбинировал свой компрессор +
Это ЧИСТАЯ случайность, дальше сжать уже просто нельзя.
Ему пришлось почитать про энтропию Шеннона и алгоритмическое сжатие данных
Полный разбор в GitHub-репозитории😎
👉 @PythonPortal
Там было 21k JSON-файлов с данными о крикетных матчах, он использовал их структуру и сжал это до ~42,46 МБ
Максимум, что смог
gzip, это ~53 МБ, а 7z ~45 МБ.Потом он скомбинировал свой компрессор +
7z и ужал до 8,9 МБЭто ЧИСТАЯ случайность, дальше сжать уже просто нельзя.
Ему пришлось почитать про энтропию Шеннона и алгоритмическое сжатие данных
Полный разбор в GitHub-репозитории
Please open Telegram to view this post
VIEW IN TELEGRAM
🤯61🔥11❤6🏆2👍1
Немного базы Python. День 5. Сортировка списка по убыванию
Метод
Чтобы
У метода
Помните:
Метод
Если вы попробуете создать новый объект с помощью
У метода
Этот параметр используется для передачи функции, которая задает критерий сортировки элементов списка.
В примере ниже у нас список кортежей, и мы хотим отсортировать его по возрасту студента. Используя параметр
Метод
Если у двух элементов одинаковый ключ сортировки, их исходный порядок сохраняется. Например, если у
Как видно, порядок элементов
👉 @PythonPortal
Метод
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" не изменился, потому что у них одинаковый возраст.Please open Telegram to view this post
VIEW IN TELEGRAM
❤21👍8
Перестаньте использовать
В Python, когда вы пишете:
вы не проверяете напрямую, является ли
Да, во многих случаях результат будет таким же, как у кода:
Но поведение у этих двух вариантов разное, и эта разница важна.
Когда вы используете:
Python вызывает метод
Если
Пример:
Здесь видно, что
Из этого следует, что при использовании
С другой стороны, когда вы пишете:
вы используете оператор
Оператор
❤️ Поэтому всегда рекомендуется, и это best practice, использовать
👉 @PythonPortal
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 это правильный и самый эффективный способ такой проверки.obj is None вместо obj == None ради предсказуемости и эффективности.Please open Telegram to view this post
VIEW IN TELEGRAM
👍26❤4🔥2