Оператор yield и генераторы в Python | Базовый курс. Программирование на Python.
HTML-код
- Опубликовано: 28 сен 2024
- Давай познакомимся с особым типом данных в Python - генераторам. Разберёмся со сферами применения, достоинствами и недостатками
#Python #yield #обучение #курс
насколько наглядное объяснение ! супер, спасибо за видео
на здоровье
Он вернулся!Целый месяц скучал!
да, хватит балдеть. пора видосики снимать. и смотреть.
Спасибо, дружище!
У Олега Молчанова неплохо про генераторы (корутины) изложено, кстати. Тема на самом деле, достаточно глубокая и весьма важная.
спорить не буду. может быть и действительно глубокая. может я чего-то не замечаю или не догоняю. но пока что, субъективно, потенциального широкого применения не вижу
@@SweetCoder ну а асинхронное программирование?.. ведь в его основе лежат корутины (генераторы).. конечно можно обойтись готовыми модулями, но без понимания принципов организации асинхронности сложно будет писать асинхронный код, как говориться, со знанием дела.
@@SweetCoder Только поймите меня правильно, я с удовольствием смотрю Ваш канал, мне есть чему у Вас поучиться в плане программирования. При этом не считаю чем-то плохим высказать свое мнение по темпе.
Спасибо, что делитесь знаниями и опытом.
@@ИванИванов-н9т9ъ про корутины и асинхронку - всё верно 👍 однако... все корутины являются генераторными функциями, но не все генераторы являются корутинами 😜всему своё время. step by step 🙂
@@SweetCoder ждём с нетерпением 🙂
Спасибо))) теперь понятно что за генераторы и с чем их едят)))
на здоровье
Наконец-то) я уже начал переживать. Как всегда спасибо!
на здоровье
Уважаемый блогер, здравствуйте. У меня результаты подсчета размера памяти для класса list, tuple т.е. gen memory получились в корне противоположными, я еще несколько раз перепроверил.
Для аргумента в ф-ции фибоначи = 100.000
64 list
9284 tupleGen
216 dir
В чем может быть причина такого различия? спасибо
а что это за tupleGen и dir ?
вот мои результаты для занимаемого объема памяти для последовательностей из 100.000:
824456 list memory usage
112 generator memory usage
как видишь разница очевидна. либо ты что-то другое меряешь, либо что-то другое выводишь в качестве результата
Добрый день! Подскажите, пжл. Вот, например мне нужно работать с цифрами в диапозоне от 1111111111111 до 9999999999999. Т.е. с большими. Мне нужно каждое число из диапозона проверить чему равна сумма всех элементов числа, и удовлетворяет ли условию, например сумма == 50(элементы получаю делением с остатком,%). Псевдокод:
for i in range(111...,10000...):
Тут завожу переменную-счетчик, и разбиваю число на цифры, суммирую, сравниваю с нужной цифрой, если сумма подходит, добавляю i в список. После отработки цикла, делаю return списка с результатами.
Но это не работает с большими цифрами. Я интуитивно чувствую, что это можно доработать генератором. Читаю, смотрю видосы, но пока не получилось. Пробовал в конце каждой итерации yield i, но результат такой же с большими цифрами.
Направьте в какую сторону двигаться, спасибо!
>>Но это не работает с большими цифрами
почему не работает?
@@SweetCoder Ну, работает, но вычисляет минут 30)), я не дождался, с цифрами до 1000000 еще нормально, дальше медленно🤷♂️. Пытаюсь понять как это ускорить...
Также попробовал создать полный список диапазона генератором, затем обратился к нему ускорителем map, засек таймер в два раза медленнее получилось🤷♂️.
@@serg2259 само по себе наличие в коде тех или иных операторов или функций не гарантирует, что программа будет работать быстрее. основополагающим фактором является алгоритм. если решение "в лоб" не даёт необходимой производительности - нужно искать другие пути
так очевидно, что при переборе всего списка выигрыша не будет. все равно надо обратиться к каждому элементу, и никуда он не денется родной, будет сгенерирован и обработан. Свит кодер об этом и сказал. некоторый выигрыш есть в том, что в каждый момент времени генератор жрет меньше памяти, т.к. предоставляет только один элемент, без необходимости держать всю коллекцию. но отсюда вытекает то, что он скорее всего и будет несколько медленнее, т.к. на каждой итерации этот элемент еще надо сгенерить, попутно восстановив контекст от предыдущего обращения и сохранив новый. это все оптимизировано наверняка, но все равно это дополнительные действия.
а если проблема именно в величине диапазона значений, то надо уже пользоваться алгоритмами, делить диапазон на вменяемые куски, допустим по 1000, 10 000, 100 000 значений, сколько там за раз приемлемо обрабатывается. и итерировать диапазоны отдельно. в общем делать пейджирование. также на него можно пробовать накрутить асинхронный запуск обработки диапазонов. одна копия функции обрабатывает значения 1-1000, вторая 1001 - 2000 и т.д. и потом наблюдать как комп загибается под полной загрузкой процессора :)
Не думал поделать видосы по pygame?
думал. всему своё время. чтобы делать "крутые" штуки на Python, нужно сначала научиться делать хоть что-то на Python
@@SweetCoder ну ок. Просто я увидел у тебя уроки по ткинтер
спасибо! кратко и внятно! ну и концовка про собесы повеселила))
спасибо за отзыв
Спасибо за видео! Интересно было бы узнать, поменялось-ли что-то в питоне и появилась-ли возможность менять имя процесса при закуске приложения (на что-то другое, кроме py.exe) без танца с бубнами. И ещё, для начинающих в виде меня. Интересно было бы посмотреть видео, где описывается вывод функции в отдельный файл. Как правильно и какие подводные камни.
про вывод функции в отдельный файл - не уверен, что понял что именно имеется ввиду. про процесс: если приложение запускает интерпретатор Python - то он и будет выводиться. так что без танцев не обойтись
@@SweetCoder где-то встречался вариант вывода отдельных самописных функций (или нескольких, не помню уже) во внешний файл с последующим импортированием его в основной код... Или я тогда что-то не так понял... Это в плане уменьшения размера основного тела кода. Конечно, в редакторах есть функции сокрытия веток кода, но, когда программа постепенно наполняется новыми и новыми функциями, то даже сокрытие может не всегда удовлетворить в размере перелистываемого текста :) Либо, как вариант, поднять тему правильного обращения приложений между собой. Например, есть центральное приложение, которое, по необходимости, запускает другие приложения написанные на питоне, и нужно передать информацию которую необходимо обработать второму приложению и вернуть обработанные данные обратно... Можно конечно, и через текстовый файл это реализовать и через базу данных, но, может есть методы и попроще... :)
@@АртемПотапов-т7я ага. более/менее понятно. ответ на этот вопрос здесь: ruclips.net/video/NWhwUpV4FsU/видео.html
а вообще, не помешает ознакомиться с концепцией "пространство имён", чтобы вообще всё стало на свои места