1

От продавца до Big Data Scientist #11

Прошлый пост - От продавца до Big Data Scientist #10


Прошлый раз я писал  в среду, поэтому в общем ничего сильно не поменялось, очередная тема которую я пока ну вот вообще не понимаю! Итераторы и генераторы. Точнее вроде как после просмотра кучи левых лекция я вроде и понял, но реализовать в коде пока не получается. Надо получше разобраться  с yield. Да и вообще. Я всё меньше понимаю что тут вообще происходит =) Мой мозг просто отказывается думать уже. Хотя я даю ему перерывчики по паре дней, но это не спасает. Задачи, которые решались ранее были понятны, всегда ясно что на входе и что на выходе, здесь же я часто не могу сформулировать и ход мыслей и итог, а иногда не понимаю что вообще от меня просят. Жуть. Но цель закончить-таки этот курс стоит, дальше наверное с SQL начну разбираться, а то вроде без него вообще никуда.

Сильно распространяться не о чем, так что, до понедельника :)

3
DELETED
Автор поста оценил этот комментарий

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

Честно говоря, меня это порядком огорчило.

Сам иногда думаю: вот я был весьма наслышан о том, что программирование - не игрушка. Что мне это дало? Да только то, что я недооценил себя и решил, что не вытяну. Потерял несколько лет. А потом все-таки вытянул и не жалею, хотя сколько бы я ни трудился, все еще далек от желаемого результата (внутренний критик чаще негодует, чем хотя бы просто помалкивает).

Что я могу сказать? Забей. Забей на то, что не понимаешь, что трудно, что мысли сложно формулировать. Так и будет, не раз и не два. Будешь еще больше не вдуплять. А как дойдешь до серьезных проектов, там ваще пизда, вот НИЧЕ не понятно.

Так не понимай. Разреши себе не понимать, потому что это нормально. Просто делай, как получится, а понимание придет позднее - возможно, в самый неожиданный момент. В какой-то момент ты поймаешь себя на том, что все эти супер-сложные вещи, над которыми когда-то хотелось чуть ли не взрыдать, теперь даются так же легко и приятно, как посрать. Не стоит ставить всё на кон, конечно же )) Нельзя жертвовать семьей, финансами, здоровьем. Если с этим у тебя норм, то не страшно, если какое-то время будешь биться головой о стену непонимания. Главное мозг не сотряси и череп не пробей)) а остальное - нормально, у всех так было, есть и будет, даже если почти все об этом позабыли )) (а пройденные трудности реально имеют тенденцию забываться).

раскрыть ветку (1)
1
Автор поста оценил этот комментарий

Огромное спасибо за такую мотивирующую речь! Я постараюсь дойти "финала", но мои переживания больше заключаются в страхе не найти работу здесь. Хотя, да, запасных аэродромов куча – я много чего умею :) Но хочу стать той самой элитой - кодером! Ещё раз спасибо, Вы меня уже много раз поддержали!

показать ответы
0
Автор поста оценил этот комментарий
@maybeEl ну так че, все что ли, запал потух, мотивация исчерпана?)
раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Темп снизился, но пока ещё учусь) просто писать вообще не о чем(

показать ответы
0
Автор поста оценил этот комментарий

В чем проблема: мы берем текущий элемент из iterable и если он нам не подходит, то очевидно нужно брать следующий, а потом еще следующий и так пока не найдем что-то подходящее или пока iterable не закончится.
Мы видим что логика описанная выше подразумевает большое количество одинаковых шагов => нам нужен цикл

Не стесняйтесь для себя описывать решение словами, это очень помогает на начальном этапе

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

так если я туда цикл прикручу, не будет ли это как в моём задании? Что вместо одного значения пройдёт по всему списку сразу? Не понимаю.. Я извиняюсь за наглость, но можно попросить ваши контакты в соцсети, что бы можно было там писать? Я понимаю, что Вам это не упёрлось и если откажетесь - не обижусь =) Если согласитесь, напишите мне в вк: vk.com/snotfear

показать ответы
1
Автор поста оценил этот комментарий

решение с рекурсией тут плохое, если вы не можете заранее предсказать глубину этой самой рекурсии - вы потенциально получаете падение от переполнения стека вызовов. Посему, давайте пытаться изобретать решение без нее (и заодно пытаться понимать что же тут вообще происходит).

Чтобы понять как решение работает, давайте попытаемся строго определить что же именно должна возвращать функция __next__:


Функция должна вернуть следующий объект последовательности iterable, удовлетворяющий некоему условию.


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

def check(self, item):
____if <some magic>:
________return True
____else:
________return False


Попробуйте написать максимально понятную реализацию __next__ с использованием функции выше
З.Ы. мы тут пока исключительно теоретизируем, так что особого смысла запускать все это нет и отсутствие реализации check вам не должно помешать

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

def __next__(self):

____if self.count < len(self.iterable):

________count += 1

________if self.check(item) == True:

____________return self.item

________else:

____________вот тут почему-то получался None, хотя его здесь не было :)

Фиг знает. Как-то так?Счётчик есть, проверка его есть, проверка выполнения функции выше есть, возвращаем проверяемое значение item, которое, теоретически берётся из iterable

показать ответы
DELETED
Автор поста оценил этот комментарий

а чего бояться-то? Если так сильно хочешь - найдешь. Просто не жди и не требуй от себя, что ты вот прям щас курс закончишь (за несколько месяцев) - и "войдешь в айти". Может несколько лет уйти.

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

ну боязнь не совсем верное определение. Просто досадно осозновать что твои труды могут не дать плодов. Хотя в любом случае, лучше делать, чем не делать =D

показать ответы
0
Автор поста оценил этот комментарий

Переделал, почему-то вместо отфильтрованных значений стали возвращаться None, хотя я так и не понял, как до reurn вообще доходил интерпритатор. Но, подглядел на форуме решение с рекурсией. Добавил - заработало, но степик всё равно не принимает решение.

def __next__(self):

____if self.count < len(self.iterable):

________pos = 0

________neg = 0

________self.count += 1

________for func in self.funcs:

____________if func(self.iterable[self.count-1]):

________________pos += 1

____________else:

________________neg += 1

________if self.judge(pos, neg) == True:

____________return self.iterable[self.count-1]

________else: return self.__next__()

____else:

________raise StopIteration

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

блин, я там принт забыл удалить. Всё, степик принял. Большое Вам спасибо! Но, честно я так и не понял как эта вся конструкция работает :(

показать ответы
0
Автор поста оценил этот комментарий

Смотрите, вся идея подобного итератора в том, что он обрабатывает одно значение за раз, и вам нужно так или иначе хранить текущий индекс чтобы при следующем вызове "вспомнить" где же вы остановились.

Посмотрите мои примеры выше, они должны навести вас на мысль

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Переделал, почему-то вместо отфильтрованных значений стали возвращаться None, хотя я так и не понял, как до reurn вообще доходил интерпритатор. Но, подглядел на форуме решение с рекурсией. Добавил - заработало, но степик всё равно не принимает решение.

def __next__(self):

____if self.count < len(self.iterable):

________pos = 0

________neg = 0

________self.count += 1

________for func in self.funcs:

____________if func(self.iterable[self.count-1]):

________________pos += 1

____________else:

________________neg += 1

________if self.judge(pos, neg) == True:

____________return self.iterable[self.count-1]

________else: return self.__next__()

____else:

________raise StopIteration

показать ответы
0
Автор поста оценил этот комментарий

так, давайте разбираться:

1) что должна возвращать функция __next__ у итератора?

2) что она возвращает в реализации выше?

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

1. Следующее значение?

2. Весь список?

показать ответы
0
Автор поста оценил этот комментарий

Портянка выше вам понятна? Вопрос о том в чем разница между возвращением себя как итератора и созданием отдельного объекта снят?

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Я нихуя не пойму. Требуется принять последовательность, проверить её тремя функциями и вернуть только значения, проходящие фильтр из тех функций.

Приведу собственно как реализован метод next. Для начала проверяю не закончился ли список, потом идут переменные для проверки прохождения фильтра из функций, собственно фильтр (сами функции внутри тела класса их нет смысл показывать) Затем если проверка прошла я добавляю к временному списку (z) значение ,если нет, то перехожу к следующему значению. Возвращаю полученный список.

def __next__(self):

____for i in self.iterable:

________if self.count < len(self.iterable):

____________pos = 0

____________neg = 0

____________for func in self.funcs:

________________if func(i):

____________________pos += 1

________________else:

____________________neg += 1

____________if self.judge(pos, neg) == True:

________________self.z.append(i)

________________self.count += 1

____________else:

________________raise StopIteration

____return self.z

Внимание вопрос: когда идёт вызов: print(list(multifilter(a, mul2, mul3, mul5))), (где multifilter - имя класса, a - последовательность значений списком, mul - функции фильтры), моё решение выдаёт ответ но в двойных квадратных скобках [[2, 3, 5]] например. А должно быть в одинарных: [2, 3, 5]. Я так понимаю фигня в том что и значения в списке хранятся и запрашиваются через список, поэтому двойные скобки. Но как их хранить вообще без ничего? или их не надо хранить? Я нифига не пойму

показать ответы
0
Автор поста оценил этот комментарий

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

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Ну спаси меня пожалуйста! :D

показать ответы
0
Автор поста оценил этот комментарий
Ск тебе лет?
раскрыть ветку (1)
0
Автор поста оценил этот комментарий

30

Автор поста оценил этот комментарий

почему именно пайтон и data scientist? Интересно именно почему выбор такой, а не java Frontend...

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

я в самом первом посте из серии писал об этом :)

показать ответы
0
Автор поста оценил этот комментарий
Какой именно аспект работы с генераторами вызывает у вас вопросы? Я когда-то давным давно проходил тот курс и вроде все было даже слишком тривиально
раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Да пока я даже не могу сформулировать. Если в классе определена ф-ия __next__, то это класс становится итератором? Верно? Если в Классе определена ф-ия __iter__, то этот класс становится итерируемым. А если и та и другая, то класс может итерировать сам себя? Как это? %( Притом почему-то итерировать сам себя он может только один раз? А если итерируемый экземпляр итерирует другой экземпляр, являющийся итератором, то можно итерировать много раз? Что такое Генератор? Он не содержит значения, а генерирует их при запросе? Как работает Yield? У меня прям каша в голове от попытки это всё осмыслить..

показать ответы