Ты удаляешь элементы из списка при каждой итерации по генератору так как идет вызов a.pop Ну а список то у тебя один, удалил все элементы после первого прохода, идет итерация по следующему генератору, он входит в условие if not a(потому что ты все элементы удалил во время прошлой итерации по первому генератору) принтит ended и останавливается
Да я чет тупанул) Сижу удивляюсь)))
не.. генераторы это действительно не так уж просто так что не стоит удивляться там дальше будут всякие yield from(хотя это еще не очень тяжело воспринимается) а вот .send у генератора - мм..
чего сложного в .send() ?
расскажи что оно делает
елдит значение переданное в сенд
Я все время путаюсь, что в каком порядке надо вызывать - сенд или Некст
А ты видел как устроено RESULT = yield from something?
RESULT = yield from EXPR is equal to _i = iter(EXPR) try: _y = next(_i) except StopIteration as _e: _r = _e.value else: while 1: try: _s = yield _y except GeneratorExit as _e: try: _m = _i.close except AttributeError: pass else: _m() raise _e except BaseException as _e: _x = sys.exc_info() try: _m = _i.throw except AttributeError: raise _e else: try: _y = _m(*_x) except StopIteration as _e: _r = _e.value break else: try: if _s is None: _y = next(_i) else: _y = _i.send(_s) except StopIteration as _e: _r = _e.value break RESULT = _r
есть хороший плейлист на эту тему https://www.youtube.com/playlist?list=PLlWXhlUMyooawilqK4lPXRvxtbYiw34S8
Ну тут надо разбираться что за частные случаи
какая интересная конструкция, чет не пойму скрытый смысл try: _m = _i.close except AttributeError: pass else: _m()
нуу ты знаешь как else работает в этой конструкции?
Вызывает close если есть
А почему нельзя getattr сделать или dict проверить?
dict проверять плохая идея, вдруг getattr переопределен, например. А getattr() не используют почему, хз, может для перфы: лишний вызов функции. Или просто вопрос стиля
А че если a.b сделать, это не то же, что getattr(a, "b")?
Обсуждают сегодня