Forwarded from Just Xor
📘 Бесплатный онлайн-учебник по математике с практикой на Python.
Это обновлённая версия книги *Exploring Mathematics with Your Computer*,
где все примеры переписаны на Python и дополнены новыми главами.
Книга разбирает идеи математики через код и эксперименты, охватывая:
- основы алгоритмов и математического мышления
- теорию чисел
- вероятность и статистику
- комбинаторику
- численные методы
- фракталы и хаос
- геометрию и графику
- марковские цепи
- продолженные дроби
- кривые и многое другое
Каждая тема сопровождается пояснениями, упражнениями и примерами кода.
Подходит тем, кто уже знает базовый Python и хочет
через практику прокачать математику и алгоритмическое мышление.
📍 Ссылка на книгу: https://coe.psu.ac.th/ad/explore/
Please open Telegram to view this post
VIEW IN TELEGRAM
❤4👍2🔥1
This media is not supported in your browser
VIEW IN TELEGRAM
⚡️ Как запустить Qwen у себя на ПК с Python
Совет: если хочешь развернуть Qwen локально без облака, проще всего поставить её через Transformers - модель скачивается один раз и дальше работает офлайн.
Подходит даже для слабых ПК, если брать маленькие версии (например, Qwen-2.5-1.5B-Instruct).
Совет: если хочешь развернуть Qwen локально без облака, проще всего поставить её через Transformers - модель скачивается один раз и дальше работает офлайн.
Подходит даже для слабых ПК, если брать маленькие версии (например, Qwen-2.5-1.5B-Instruct).
# Установка:
# pip install transformers accelerate torch
from transformers import AutoModelForCausalLM, AutoTokenizer
import torch
MODEL_NAME = "Qwen/Qwen2.5-1.5B-Instruct"
# Модель и токенайзер загрузятся один раз — потом работают офлайн
tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME)
model = AutoModelForCausalLM.from_pretrained(
MODEL_NAME,
torch_dtype=torch.float16,
device_map="auto" # автоматически использует GPU, если есть
)
prompt = "Объясни простыми словами, чем контейнер отличается от виртуальной машины."
inputs = tokenizer(prompt, return_tensors="pt").to(model.device)
outputs = model.generate(
**inputs,
max_new_tokens=200,
do_sample=True,
temperature=0.7
)
print(tokenizer.decode(outputs[0], skip_special_tokens=True))
❤7👍2👌1
This media is not supported in your browser
VIEW IN TELEGRAM
🚀 Токенизация в LLM - как “Hello” превращается в цифры.
Токенизация - это первый шаг перед тем, как LLM вообще начнет “думать”.
Модель не понимает текст напрямую.
Она понимает только числа.
Поэтому любой текст сначала разбивается на маленькие кусочки - токены:
- иногда это целые слова
- иногда части слов (su, per, man)
- иногда один символ
- иногда даже пробел - тоже токен
Пример:
Фраза "I love programming" разбивается не обязательно на слова, а на кусочки слов:
Обрати внимание:
- " love" начинается с пробела - потому что пробел тоже часть токена
- programming разделилось на 2 токена: " program" + "ming"
То есть Токенизация - это когда LLM режет текст на маленькие кусочки (токены) и переводит их в числа.
Важно:
Чем больше токенов - тем дороже запрос и тем быстрее съедается контекст.
Плохая токенизация = странные ошибки (особенно в коде, ссылках, редких словах).
Поэтому LLM отлично понимают частые слова, но могут путаться на редких именах, терминах и смешанных языках.
И лайфхак: если хочешь “дешевле” и “чище” ответы - пиши короче, без мусора, без повторов.
Контекст - это валюта.
https://www.youtube.com/shorts/A7DCcYLq38M
Токенизация - это первый шаг перед тем, как LLM вообще начнет “думать”.
Модель не понимает текст напрямую.
Она понимает только числа.
Поэтому любой текст сначала разбивается на маленькие кусочки - токены:
- иногда это целые слова
- иногда части слов (su, per, man)
- иногда один символ
- иногда даже пробел - тоже токен
Пример:
Фраза "I love programming" разбивается не обязательно на слова, а на кусочки слов:
[I] ,[ love] ,[ program] , [ming]Обрати внимание:
- " love" начинается с пробела - потому что пробел тоже часть токена
- programming разделилось на 2 токена: " program" + "ming"
То есть Токенизация - это когда LLM режет текст на маленькие кусочки (токены) и переводит их в числа.
Важно:
Чем больше токенов - тем дороже запрос и тем быстрее съедается контекст.
Плохая токенизация = странные ошибки (особенно в коде, ссылках, редких словах).
Поэтому LLM отлично понимают частые слова, но могут путаться на редких именах, терминах и смешанных языках.
И лайфхак: если хочешь “дешевле” и “чище” ответы - пиши короче, без мусора, без повторов.
Контекст - это валюта.
# Tokenization demo (Python)
# pip install tiktoken
import tiktoken
text = "I love programming in Python 🐍"
enc = tiktoken.get_encoding("cl100k_base")
tokens = enc.encode(text)
print("Text:", text)
print("Token IDs:", tokens)
print("Tokens count:", len(tokens))
# decode back
print("\nDecoded tokens:")
for t in tokens:
print(t, "->", repr(enc.decode([t])))
https://www.youtube.com/shorts/A7DCcYLq38M
❤5👍2🔥1
Forwarded from Machinelearning
RealOmni - это не просто каталог видео, где роборука хватает кубик на белом столе. Это мультимодальный подарок с траекториями, аннотациями и движениями суставов.
Картинка с Fisheye-камер, данные IMU (инерциалка), энкодеры и данные с тактильных датчиков с разрешением 1 мм.
Снимали в 3000 реальных домах, никаких стерильных лабораторий: складывание одежды, завязывание шнурков, разбор посуды и сортировка всякого хлама.
Почти все таски двурукие.
Медианная длина клипа ~ 210 секунд. То есть это не "схватил-положил", а полноценные процессы "достать, сложить, убрать в ящик".
В свежем обновлении добавили 35 тыс. клипов с фокусом на разгребание куч разнородных предметов. Это именно та задача, на которой сыпется большинство моделей.
Немного цифр о всем датасете
Весть проект запланирован объемом 95 ТБ и хронометражем 10,000 часов. Но если посчитать, то что уже залито (Stage 1 + Stage 2), то суммарно около 5.4 ТБ и ~1600 часов. Остальное обещают догрузить as soon as possible.
Данные собраны специфическим гриппером GenDAS, так что если у вас другой сенсорный массив (или его нет), transfer learning может стать болью. Ассеты заточены под железку GenRobot.
Это все еще телеоперация. То есть мы учим робота копировать движения человека-оператора и если он тупил или руки дрожали сетка это тоже выучит.
Тем не менее, это очень крутой релиз для тех, кто пилит домашних роботов. Данные по завязыванию шнурков и разбору предметов в open-source редкость.
@ai_machinelearning_big_data
#AI #ML #Robotics #Dataset #RealOmni #GenRoborAI
Please open Telegram to view this post
VIEW IN TELEGRAM
❤5👍2🔥2
🔥 На stepik вышел курс, который учит Создавать настоящие AI-сервисы, а не просто запускать скрипты?
Этот практический курс по Python и FastAPI покажет, как собрать полноценное приложение с ИИ, базой данных, автогенерацией контента и Telegram-ботом.
Ты пройдёшь путь от первого HTTP-запроса до рабочего сервиса, который сам генерирует текст через ИИ, сохраняет данные, отправляет результаты по расписанию и отвечает пользователям.
Никакой теории ради теории - только практические шаги, из которых рождается реальный продукт.
🎁 48 часов действует скидка в 40% процентов
👉 Начать учиться на Stepik
Этот практический курс по Python и FastAPI покажет, как собрать полноценное приложение с ИИ, базой данных, автогенерацией контента и Telegram-ботом.
Ты пройдёшь путь от первого HTTP-запроса до рабочего сервиса, который сам генерирует текст через ИИ, сохраняет данные, отправляет результаты по расписанию и отвечает пользователям.
Никакой теории ради теории - только практические шаги, из которых рождается реальный продукт.
🎁 48 часов действует скидка в 40% процентов
👉 Начать учиться на Stepik
❤4🔥2👍1🥱1
Forwarded from Machinelearning
🗣 Qwen3-TTS - мощный open-source релиз (voice design + клонирование голоса)
Qwen официально выпустили Qwen3-TTS и полностью открыли всю линейку моделей - Base / CustomVoice / VoiceDesign.
Что внутри:
- 5 моделей (0.6B и 1.8B классы)
- Free-form Voice Design - генерация/редаквтирование голоса по описанию
- Voice Cloning - клонирование голоса
- 10 языков
- 12Hz tokenizer - сильная компрессия аудио без сильной потери качества
- полная поддержка fine-tuning
- заявляют SOTA качество на ряде метрик
Раньше лучшие генераторы были в закрытых API, а теперь появляется полноценный open-source стек TTS, где можно:
- обучать под домен,
- делать кастомные голоса,
- и не зависеть от провайдера.
▪GitHub: https://github.com/QwenLM/Qwen3-TTS
▪Hugging Face: https://huggingface.co/collections/Qwen/qwen3-tts
▪Демо (HF): https://huggingface.co/spaces/Qwen/Qwen3-TTS
▪Блог: https://qwen.ai/blog?id=qwen3tts-0115
▪Paper: https://github.com/QwenLM/Qwen3-TTS/blob/main/assets/Qwen3_TTS.pdf
@ai_machinelearning_big_data
#AI #TTS #Qwen #OpenSource #SpeechAI
Qwen официально выпустили Qwen3-TTS и полностью открыли всю линейку моделей - Base / CustomVoice / VoiceDesign.
Что внутри:
- 5 моделей (0.6B и 1.8B классы)
- Free-form Voice Design - генерация/редаквтирование голоса по описанию
- Voice Cloning - клонирование голоса
- 10 языков
- 12Hz tokenizer - сильная компрессия аудио без сильной потери качества
- полная поддержка fine-tuning
- заявляют SOTA качество на ряде метрик
Раньше лучшие генераторы были в закрытых API, а теперь появляется полноценный open-source стек TTS, где можно:
- обучать под домен,
- делать кастомные голоса,
- и не зависеть от провайдера.
▪GitHub: https://github.com/QwenLM/Qwen3-TTS
▪Hugging Face: https://huggingface.co/collections/Qwen/qwen3-tts
▪Демо (HF): https://huggingface.co/spaces/Qwen/Qwen3-TTS
▪Блог: https://qwen.ai/blog?id=qwen3tts-0115
▪Paper: https://github.com/QwenLM/Qwen3-TTS/blob/main/assets/Qwen3_TTS.pdf
@ai_machinelearning_big_data
#AI #TTS #Qwen #OpenSource #SpeechAI
❤4👍3🔥1
Python-сообщество отлично научилось делать API-серверы.
FastAPI / DRF дают идеальный опыт разработчика:
- типы
- валидация
- понятные эндпоинты
- документация по OpenAPI
- минимум рутины
Но есть проблема.
Серверы стали удобными и “правильными”, а вот клиентская сторона до сих пор часто выглядит как кустарщина.
Что часто встречается в проектах на базе python:
- везде раскиданы httpx.get/post
- URL собираются руками
- параметры и headers копируются по коду
- ответы парсятся вручную
- ошибки обрабатываются как попало
- нет нормальных типов и автодополнения
И именно тут часто появляется 80% проблем.
API может быть идеально спроектирован, но пользоваться им неудобно.
Да, можно сгенерировать кода клиента.
Но чаще всего генератор выдаёт огромный неудобный код:
- странные имена методов
- перегруженные классы
- нечитаемый boilerplate
- всё равно приходится писать обёртки руками
В итоге клиенты либо не генерируют вообще, либо генерируют и потом ненавидят.
API-клиенты должны быть сделаны как фреймворк.
Как FastAPI, только наоборот.
То есть ты описываешь клиент красиво и декларативно:
- функция описывает intent (что мы делаем)
- типы описывают контракт
- библиотека берёт на себя HTTP-рутину
Вместо кода “на коленке”
httpx.get("https://api.site.com/users/123")Должно быть
get_user(123)И дальше библиотека сама:
- соберёт URL
- подставит параметры
- сериализует запрос
- выполнит HTTP
- распарсит ответ
- кинет нормальную ошибку
- даст типы и автодополнение в IDE
Именно эту идею автор статье и продвигает (проект Clientele)
Сделать API-клиенты удобными, чистыми и типобезопасными
так же, как мы привыкли делать серверы
Проблема не в HTTP.
Проблема в том, что API-клиенты в Python до сих пор не стали “первоклассным кодом”.
А должны стать.
Подробности: paulwrites.software/articles/python-api-clients
Please open Telegram to view this post
VIEW IN TELEGRAM
❤9👍2🔥1
Python : подробный путеводитель с примерами кода 2026 года
Этот материал предназначен для новичков и тех, кто хочет систематизировать знания по языку программирования Python.
В статье рассматриваются основные конструкции языка и показаны примеры кода для самых разных задач - от работы со строками до асинхронных запросов и анализа данных. Все примеры снабжены пояснениями, чтобы вы понимали не только как, но и почему.
📌 Подробнее
Этот материал предназначен для новичков и тех, кто хочет систематизировать знания по языку программирования Python.
В статье рассматриваются основные конструкции языка и показаны примеры кода для самых разных задач - от работы со строками до асинхронных запросов и анализа данных. Все примеры снабжены пояснениями, чтобы вы понимали не только как, но и почему.
📌 Подробнее
❤4👍3🔥2
This media is not supported in your browser
VIEW IN TELEGRAM
🔥 NovaSR - крошечная open-source модель, которая ускоряет обработку аудио в сотни раз
Вышел релиз NovaSR - маленькая, но очень мощная модель для улучшения качества аудио.
Самый громкий факт:
⚡️ 3600 секунд аудио за 1 секунду
То есть целый час звука обрабатывается практически мгновенно - на порядки быстрее прошлых решений.
Зачем это нужно
NovaSR полезна везде, где есть “сырой” звук:
✅ улучшение TTS-озвучки (делает голос чище и приятнее)
✅ улучшение качества датасетов (для обучения ASR/TTS/voice моделей)
✅ очистка и восстановление созвонов / звонков / записей
✅ быстрый preprocessing перед ML пайплайном
Это как “апскейлер” для звука:
меньше шумов, больше чёткости, лучше разборчивость.
Ссылки:
Repo: https://github.com/ysharma3501/NovaSR
Model: https://huggingface.co/YatharthS/NovaSR
Если работаешь с TTS / ASR / аудио-датасетами - это must-have тулза.
Вышел релиз NovaSR - маленькая, но очень мощная модель для улучшения качества аудио.
Самый громкий факт:
⚡️ 3600 секунд аудио за 1 секунду
То есть целый час звука обрабатывается практически мгновенно - на порядки быстрее прошлых решений.
Зачем это нужно
NovaSR полезна везде, где есть “сырой” звук:
✅ улучшение TTS-озвучки (делает голос чище и приятнее)
✅ улучшение качества датасетов (для обучения ASR/TTS/voice моделей)
✅ очистка и восстановление созвонов / звонков / записей
✅ быстрый preprocessing перед ML пайплайном
Это как “апскейлер” для звука:
меньше шумов, больше чёткости, лучше разборчивость.
Ссылки:
Repo: https://github.com/ysharma3501/NovaSR
Model: https://huggingface.co/YatharthS/NovaSR
Если работаешь с TTS / ASR / аудио-датасетами - это must-have тулза.
❤6👍4🔥4
Один из лучших курсов по Парсинг на Stepik со скидкой 48%
Освой Python-парсинг так, как это делают в реальных проектах.
Не учебные “игрушки”, а рабочие инструменты для сбора данных с сайтов, API и динамических сервисов.
На курсе ты шаг за шагом пройдешь путь от нуля до уровня, где умеешь стабильно забирать данные, работать с защитами, динамикой и автоматизацией. Без воды - только то, что используют в продакшене.
В итоге ты сможешь не просто “писать на Python”, а решать практические задачи: анализ данных, мониторинг, автоматизация, фриланс-заказы и собственные проекты.
Сегодня можно забрать курс со скидкой 48%: https://stepik.org/a/269942/
Please open Telegram to view this post
VIEW IN TELEGRAM
❤3👍2🔥2
🧠 Microsoft: как люди используют ИИ - сильно зависит от контекста
Microsoft проанализировали 37.5 млн+ диалогов с Copilot и увидели простую, но важную закономерность:
💻 Днём и с компьютера (рабочие часы)
люди чаще спрашивают про:
- продуктивность
- работу и карьеру
- задачи “по делу”
📱 С телефона и поздно ночью
запросы уходят в другое:
- здоровье
- игры
- философия
- личные советы и размышления
Интересно, что со временем Copilot уходит от чисто рабочих сценариев: всё больше запросов становится “повседневными”.
Это намекает на тренд: ИИ постепенно превращается не только в инструмент для работы, а в постоянного помощника по жизни.
⚡️ Полное исслежование: https://www.deeplearning.ai/the-batch/microsoft-study-shows-people-use-ai-very-differently-at-different-times-or-on-different-devices/
Microsoft проанализировали 37.5 млн+ диалогов с Copilot и увидели простую, но важную закономерность:
💻 Днём и с компьютера (рабочие часы)
люди чаще спрашивают про:
- продуктивность
- работу и карьеру
- задачи “по делу”
📱 С телефона и поздно ночью
запросы уходят в другое:
- здоровье
- игры
- философия
- личные советы и размышления
Интересно, что со временем Copilot уходит от чисто рабочих сценариев: всё больше запросов становится “повседневными”.
Это намекает на тренд: ИИ постепенно превращается не только в инструмент для работы, а в постоянного помощника по жизни.
⚡️ Полное исслежование: https://www.deeplearning.ai/the-batch/microsoft-study-shows-people-use-ai-very-differently-at-different-times-or-on-different-devices/
❤6🔥3
🔥 Бесплатный интенсив по ChatGPT и созданию НЕЙРОСТРУДНИКОВ без опыта программирования🔥
Вы узнаете, как использовать ChatGPT в профессиональных целях, создавать нейросотрудников на заказ и зарабатывать на ИИ от 150.000р в месяц.
Простое понимание основ, без сложного кода!
Что будет на интенсиве?
🧬 Теория: как создаются нейро-сотрудники с GPT на Python
🧬 Практика: мы создадим нейро-консультанта, нейро-HR, нейро-маркетолога и др.
Интенсив - максимально простой и доступный, без какого-либо сложного программирования.
Ведущий интенсива - Senior AI-разработчик нейросетей с 2003 года и основатель Университета искусственного интеллекта - Дмитрий Романов.
🤖Присоединяйтесь к нашему бесплатному интенсиву и разберитесь в этой увлекательной теме с нами!
Вы узнаете, как использовать ChatGPT в профессиональных целях, создавать нейросотрудников на заказ и зарабатывать на ИИ от 150.000р в месяц.
Простое понимание основ, без сложного кода!
Что будет на интенсиве?
🧬 Теория: как создаются нейро-сотрудники с GPT на Python
🧬 Практика: мы создадим нейро-консультанта, нейро-HR, нейро-маркетолога и др.
Интенсив - максимально простой и доступный, без какого-либо сложного программирования.
Ведущий интенсива - Senior AI-разработчик нейросетей с 2003 года и основатель Университета искусственного интеллекта - Дмитрий Романов.
🤖Присоединяйтесь к нашему бесплатному интенсиву и разберитесь в этой увлекательной теме с нами!
👎2😐2❤1
This media is not supported in your browser
VIEW IN TELEGRAM
Когда нужно сравнить скорость выполнения задачи с использованием Python и ручного подхода, полезно измерять время выполнения обеих стратегий. Ниже приведен пример, как можно сравнить время выполнения функции, которая суммирует числа от 1 до n с помощью Python и с использованием ручного метода.
import time
# Ручной подход
def manual_sum(n):
total = 0
for i in range(1, n + 1):
total += i
return total
# Питон-метод
def python_sum(n):
return sum(range(1, n + 1))
# Сравнение производительности
n = 1000000
start_time = time.time()
manual_result = manual_sum(n)
manual_time = time.time() - start_time
start_time = time.time()
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
Forwarded from Machinelearning
PaddlePaddle обновили свою линейку PaddleOCR-VL, выпустив PaddleOCR-VL-1.5 - компактную VLM на 0.9 млрд. параметров на базе ERNIE-4.5-0.3B-Paddle. Несмотря на скромный размер, в задачах разбора документов она показывает SOTA-результаты.
На тесте OmniDocBench v1.5 модель выбила 94.5% точности, обойдя не только прошлую версию, но и более тяжелых конкурентов.
Фишка обновления - упор на полевые условия. Модель специально учили работать с плохими исходниками: кривыми сканами, бликами от мониторов и мятыми страницами.
Попутно сделали бенчмарк Real5-OmniDocBench, который гоняет модели по 5 сценариям: сканирование, перекосы, деформация листа, фото с экрана и плохое освещение.
Модель работает с
transformers, дружит с Flash Attention 2 и, само собой, поддерживается PaddlePaddle 3.2.1.Если нужно быстро поднять сервис - есть готовый Docker-образ.
Если нужен полноценный постраничный парсинг всего документа, лучше использовать официальный пакет PaddleOCR. Реализация через transformers пока ограничена только распознаванием отдельных элементов и споттингом.
В пайплайн встроили логику препроцессинга. Если картинка меньше 1500 пикселей, она автоматом апскейлится фильтром Lanczos. При этом есть потолок в 1.6 млн. пикселей для споттинга, это чтобы не перегружать память GPU и сохранить читаемость мелкого шрифта.
@ai_machinelearning_big_data
#AI #ML #VL #OCR #PaddleOCR
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
❤3👍1🔥1
🧠 Python-задача с собеседования: найди ошибку
Код должен посчитать количество чисел больше среднего значения в списке.
Проблема в этой строке:
```python
def count_above_avg(nums, avg=sum(nums)/len(nums)):
```
Здесь используется значение по умолчанию, которое вычисляется один раз — в момент определения функции, а не при каждом её вызове.
Что происходит по шагам:
Когда Python читает определение функции, он сразу считает:
sum(nums)/len(nums)
Но nums в этот момент - это первый переданный список, то есть data1.
Значение avg фиксируется и больше не меняется.
При вызове:
• count_above_avg(data2)
• среднее значение не пересчитывается, используется старое — от data1.
Поэтому логика ломается, функция работает с неверным средним.
📌 Это известная ловушка Python
Значения аргументов по умолчанию вычисляются один раз.
Это та же причина, почему списки и словари в дефолтных параметрах часто приводят к багам.
🛠 Правильное решение
Нужно вычислять среднее внутри функции, а не в параметрах:
```python
def count_above_avg(nums, avg=None):
if avg is None:
avg = sum(nums) / len(nums)
return sum(1 for n in nums if n > avg)
```
Теперь среднее будет считаться заново при каждом вызове.
💡 Главное правило
Никогда не используй вычисляемые или изменяемые объекты как значения по умолчанию:
❌ def f(x, lst=[])
❌ def f(x, avg=sum(x)/len(x))
✅ Используй None и считай внутри функции.
Код должен посчитать количество чисел больше среднего значения в списке.
def count_above_avg(nums, avg=sum(nums)/len(nums)):
count = 0
for n in nums:
if n > avg:
count += 1
return count
data1 = [1, 2, 3, 4, 5]
data2 = [10, 20, 30]
print(count_above_avg(data1))
print(count_above_avg(data2))
```python
def count_above_avg(nums, avg=sum(nums)/len(nums)):
```
Здесь используется значение по умолчанию, которое вычисляется один раз — в момент определения функции, а не при каждом её вызове.
Что происходит по шагам:
Когда Python читает определение функции, он сразу считает:
sum(nums)/len(nums)
Но nums в этот момент - это первый переданный список, то есть data1.
Значение avg фиксируется и больше не меняется.
При вызове:
• count_above_avg(data2)
• среднее значение не пересчитывается, используется старое — от data1.
Поэтому логика ломается, функция работает с неверным средним.
📌 Это известная ловушка Python
Значения аргументов по умолчанию вычисляются один раз.
Это та же причина, почему списки и словари в дефолтных параметрах часто приводят к багам.
🛠 Правильное решение
Нужно вычислять среднее внутри функции, а не в параметрах:
```python
def count_above_avg(nums, avg=None):
if avg is None:
avg = sum(nums) / len(nums)
return sum(1 for n in nums if n > avg)
```
Теперь среднее будет считаться заново при каждом вызове.
💡 Главное правило
Никогда не используй вычисляемые или изменяемые объекты как значения по умолчанию:
❌ def f(x, lst=[])
❌ def f(x, avg=sum(x)/len(x))
✅ Используй None и считай внутри функции.
👍10❤6👎1🔥1