Оператор yield и генераторы в Python | Базовый курс. Программирование на Python.

Поделиться
HTML-код
  • Опубликовано: 28 сен 2024
  • Давай познакомимся с особым типом данных в Python - генераторам. Разберёмся со сферами применения, достоинствами и недостатками
    #Python #yield #обучение #курс

Комментарии • 31

  • @nickolayarbuzov6149
    @nickolayarbuzov6149 3 года назад +3

    насколько наглядное объяснение ! супер, спасибо за видео

  • @footballlife3140
    @footballlife3140 3 года назад +1

    Он вернулся!Целый месяц скучал!

    • @SweetCoder
      @SweetCoder  3 года назад

      да, хватит балдеть. пора видосики снимать. и смотреть.

  • @ИванИванов-н9т9ъ
    @ИванИванов-н9т9ъ 3 года назад +2

    Спасибо, дружище!
    У Олега Молчанова неплохо про генераторы (корутины) изложено, кстати. Тема на самом деле, достаточно глубокая и весьма важная.

    • @SweetCoder
      @SweetCoder  3 года назад +1

      спорить не буду. может быть и действительно глубокая. может я чего-то не замечаю или не догоняю. но пока что, субъективно, потенциального широкого применения не вижу

    • @ИванИванов-н9т9ъ
      @ИванИванов-н9т9ъ 3 года назад +1

      @@SweetCoder ну а асинхронное программирование?.. ведь в его основе лежат корутины (генераторы).. конечно можно обойтись готовыми модулями, но без понимания принципов организации асинхронности сложно будет писать асинхронный код, как говориться, со знанием дела.

    • @ИванИванов-н9т9ъ
      @ИванИванов-н9т9ъ 3 года назад +1

      @@SweetCoder Только поймите меня правильно, я с удовольствием смотрю Ваш канал, мне есть чему у Вас поучиться в плане программирования. При этом не считаю чем-то плохим высказать свое мнение по темпе.
      Спасибо, что делитесь знаниями и опытом.

    • @SweetCoder
      @SweetCoder  3 года назад +1

      @@ИванИванов-н9т9ъ про корутины и асинхронку - всё верно 👍 однако... все корутины являются генераторными функциями, но не все генераторы являются корутинами 😜всему своё время. step by step 🙂

    • @ИванИванов-н9т9ъ
      @ИванИванов-н9т9ъ 3 года назад +1

      @@SweetCoder ждём с нетерпением 🙂

  • @xm4dn355x
    @xm4dn355x 3 года назад

    Спасибо))) теперь понятно что за генераторы и с чем их едят)))

  • @Dmytro_Malakhov
    @Dmytro_Malakhov 3 года назад +5

    Наконец-то) я уже начал переживать. Как всегда спасибо!

  • @PROswimming
    @PROswimming 2 года назад +1

    Уважаемый блогер, здравствуйте. У меня результаты подсчета размера памяти для класса list, tuple т.е. gen memory получились в корне противоположными, я еще несколько раз перепроверил.
    Для аргумента в ф-ции фибоначи = 100.000
    64 list
    9284 tupleGen
    216 dir
    В чем может быть причина такого различия? спасибо

    • @SweetCoder
      @SweetCoder  2 года назад

      а что это за tupleGen и dir ?
      вот мои результаты для занимаемого объема памяти для последовательностей из 100.000:
      824456 list memory usage
      112 generator memory usage
      как видишь разница очевидна. либо ты что-то другое меряешь, либо что-то другое выводишь в качестве результата

  • @serg2259
    @serg2259 3 года назад

    Добрый день! Подскажите, пжл. Вот, например мне нужно работать с цифрами в диапозоне от 1111111111111 до 9999999999999. Т.е. с большими. Мне нужно каждое число из диапозона проверить чему равна сумма всех элементов числа, и удовлетворяет ли условию, например сумма == 50(элементы получаю делением с остатком,%). Псевдокод:
    for i in range(111...,10000...):
    Тут завожу переменную-счетчик, и разбиваю число на цифры, суммирую, сравниваю с нужной цифрой, если сумма подходит, добавляю i в список. После отработки цикла, делаю return списка с результатами.
    Но это не работает с большими цифрами. Я интуитивно чувствую, что это можно доработать генератором. Читаю, смотрю видосы, но пока не получилось. Пробовал в конце каждой итерации yield i, но результат такой же с большими цифрами.
    Направьте в какую сторону двигаться, спасибо!

    • @SweetCoder
      @SweetCoder  3 года назад

      >>Но это не работает с большими цифрами
      почему не работает?

    • @serg2259
      @serg2259 3 года назад

      @@SweetCoder Ну, работает, но вычисляет минут 30)), я не дождался, с цифрами до 1000000 еще нормально, дальше медленно🤷‍♂️. Пытаюсь понять как это ускорить...

    • @serg2259
      @serg2259 3 года назад

      Также попробовал создать полный список диапазона генератором, затем обратился к нему ускорителем map, засек таймер в два раза медленнее получилось🤷‍♂️.

    • @SweetCoder
      @SweetCoder  3 года назад

      @@serg2259 само по себе наличие в коде тех или иных операторов или функций не гарантирует, что программа будет работать быстрее. основополагающим фактором является алгоритм. если решение "в лоб" не даёт необходимой производительности - нужно искать другие пути

    • @mkalalaka
      @mkalalaka 2 года назад

      так очевидно, что при переборе всего списка выигрыша не будет. все равно надо обратиться к каждому элементу, и никуда он не денется родной, будет сгенерирован и обработан. Свит кодер об этом и сказал. некоторый выигрыш есть в том, что в каждый момент времени генератор жрет меньше памяти, т.к. предоставляет только один элемент, без необходимости держать всю коллекцию. но отсюда вытекает то, что он скорее всего и будет несколько медленнее, т.к. на каждой итерации этот элемент еще надо сгенерить, попутно восстановив контекст от предыдущего обращения и сохранив новый. это все оптимизировано наверняка, но все равно это дополнительные действия.
      а если проблема именно в величине диапазона значений, то надо уже пользоваться алгоритмами, делить диапазон на вменяемые куски, допустим по 1000, 10 000, 100 000 значений, сколько там за раз приемлемо обрабатывается. и итерировать диапазоны отдельно. в общем делать пейджирование. также на него можно пробовать накрутить асинхронный запуск обработки диапазонов. одна копия функции обрабатывает значения 1-1000, вторая 1001 - 2000 и т.д. и потом наблюдать как комп загибается под полной загрузкой процессора :)

  • @parateam
    @parateam 3 года назад

    Не думал поделать видосы по pygame?

    • @SweetCoder
      @SweetCoder  3 года назад

      думал. всему своё время. чтобы делать "крутые" штуки на Python, нужно сначала научиться делать хоть что-то на Python

    • @parateam
      @parateam 3 года назад

      @@SweetCoder ну ок. Просто я увидел у тебя уроки по ткинтер

  • @vladimirkulakov8667
    @vladimirkulakov8667 2 года назад +2

    спасибо! кратко и внятно! ну и концовка про собесы повеселила))

    • @SweetCoder
      @SweetCoder  2 года назад +1

      спасибо за отзыв

  • @АртемПотапов-т7я
    @АртемПотапов-т7я 3 года назад

    Спасибо за видео! Интересно было бы узнать, поменялось-ли что-то в питоне и появилась-ли возможность менять имя процесса при закуске приложения (на что-то другое, кроме py.exe) без танца с бубнами. И ещё, для начинающих в виде меня. Интересно было бы посмотреть видео, где описывается вывод функции в отдельный файл. Как правильно и какие подводные камни.

    • @SweetCoder
      @SweetCoder  3 года назад

      про вывод функции в отдельный файл - не уверен, что понял что именно имеется ввиду. про процесс: если приложение запускает интерпретатор Python - то он и будет выводиться. так что без танцев не обойтись

    • @АртемПотапов-т7я
      @АртемПотапов-т7я 3 года назад

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

    • @SweetCoder
      @SweetCoder  3 года назад +1

      @@АртемПотапов-т7я ага. более/менее понятно. ответ на этот вопрос здесь: ruclips.net/video/NWhwUpV4FsU/видео.html
      а вообще, не помешает ознакомиться с концепцией "пространство имён", чтобы вообще всё стало на свои места