Форум сайта python.su
Rafikааааа дошло!
В if number2 == 237 вместо 237 поставь 238 и будет чудо.
Офлайн
а чем плохо list.index(237) как у py.user.next ну или что то вроде этого
numbers = [1, 240, 3, 8, 238, 239, 242, 10, 11, 12, 244] print([i for i in numbers[0:numbers.index(237)]if not i % 2] if 237 in numbers else [i for i in numbers if not i % 2])
Офлайн
AD0DE412
У вас в исходном наборе отсутствует 237
numbers = [1, 240, 3, 8, 238, 239, 242, 10, 11, 12, 244]
AD0DE412У него все работает.
а чем плохо list.index(237) как у py.user.next
Отредактировано Ocean (Май 6, 2021 20:41:46)
Офлайн
OceanЮнит-тесты, которые находятся в том сервисе, где сидит GLADIATORD и делает это упражнение, как раз и проверяют все границы. И они делают вот эту проверку, что если число сменится в маркере конца, то код должен работать так же - на маркере конца выходить, а не включать маркер конца, если тот удовлетворяет предикату (в данном случае предикат - “число_является_чётным(число): да/нет”). Предикат - это функция, которая для аргумента/аргументов возвращает истину или ложь. Так вот, при дальнейшей разработке предикат выносится из кода. Здесь он как бы не виден, число напрямую проверяется. Но когда мы программируем, мы видим за этими проверками предикаты (у себя в голове). А ещё при дальнейшей разработке, когда это будет вынесено, предикат подаётся как аргумент. Таким образом можно менять предикаты. Мы обо всём об этом думаем и смотрим, чтобы в коде всё было правильно - чтобы всё правильно проверялось и всё правильно выполнялось. Бывает, что не только предикат подаётся в функцию как аргумент, но и действие, выполняемое по истинности этого предиката тоже передаётся в функцию как аргумент. В первой версии книжки K&R как раз и была функция сортировки, которая принимала и функцию для сравнения двух элементов, и функцию для перестановки двух элементов, если они стоят в ложном порядке. Таким образом она могла и сравнивать между собой два числа или два массива, и переставлять потом местами эти два числа или эти два массива, если предикат сравнения давал ложь для них. Это абсолютно разные операции, поэтому их вот так параметризируют, иначе ты такой функцией сортировки сможешь сортировать только числа между собой или только массивы между собой, а сортировать всё что угодно и как угодно не сможешь. Потом из книжки, уже в K&R2 этого не было, исключили передаваемую функцию перестановки элементов, а передаваемую функцию сравнения оставили и функция сортировки внутри стала попроще. Там эту функцию надо было писать самому в качестве упражнения. Просто чтобы не перегружать мозги читателям, которые упражнения делают, сделали так. Потому что реальная функция, если ты код откроешь у какой-нибудь библиотеки из BSD, там вообще простыня кода на километр и внутри там вообще несколько абсолютно разных сортировок в этой одной функции “одной определённой” сортировки. Чтобы вообще всё там правильно было, можно бесконечно писать код. Для просто учебного упражнения этого было бы слишком многовато, читатель просто захлебнулся бы в собственном коде и бросил книжку и вообще всё обучение. Она очень мотивирующая и приглашающая в дальнейшие главы, поэтому читалась и проходилась легко многими тысячами людей.
Я туплю какое другое число он подставил и почему код его вывел?
Напиши, пожалуйста, числовую последовательность, на которой ломается первая программа, которую написал GLADIATORD.
>>> def pred1(x): ... return x % 2 == 0 ... >>> def pred2(x): ... return x % 3 == 0 ... >>> def pred3(x): ... return pred1(x) and pred2(x) ... >>> list(filter(pred1, [1, 2, 3, 4, 5, 6])) [2, 4, 6] >>> >>> list(filter(pred2, [1, 2, 3, 4, 5, 6])) [3, 6] >>> >>> list(filter(pred3, [1, 2, 3, 4, 5, 6])) [6] >>>
>>> list(filter(lambda x: x % 2 == 0, [1, 2, 3, 4, 5, 6])) [2, 4, 6] >>> >>> list(filter(lambda x: x % 3 == 0, [1, 2, 3, 4, 5, 6])) [3, 6] >>> >>> list(filter(lambda x: x % 2 == 0 and x % 3 == 0, [1, 2, 3, 4, 5, 6])) [6] >>>
AD0DE412Вариант с index()'ом плох потому, что он ест память. Создание среза приводит к полному копированию всех элементов в памяти. А если их там миллиард, этих элементов до маркера конца? Поэтому я там привёл второй вариант с itertools.takewhile(), который и по памяти экономный, так как он копии сразу всего не создаёт. Первый вариант даёт возможность просто пройти юнит-тесты в большинстве учебных систем.
а чем плохо list.index(237) как у py.user.next
Отредактировано py.user.next (Май 7, 2021 01:58:11)
Офлайн
Oceanага и это обрабатывается … докинте есле не сложно эти 237
У вас в исходном наборе отсутствует 237
Офлайн