Уведомления

Группа в Telegram: @pythonsu

#1 Май 6, 2021 18:35:37

Ocean
Зарегистрирован: 2021-03-14
Сообщения: 131
Репутация: +  9  -
Профиль   Отправить e-mail  

Как вывести числа из list - только чётные и только до определённого момента?

Rafik
В if number2 == 237 вместо 237 поставь 238 и будет чудо.

ааааа дошло!
Решение получилось “условиезависимым”!
офигенно! Спасибо!
А то 3 захода в эту ветку делала и не понимала в чем суть!)

Офлайн

#2 Май 6, 2021 20:13:57

AD0DE412
Зарегистрирован: 2019-05-12
Сообщения: 1130
Репутация: +  44  -
Профиль   Отправить e-mail  

Как вывести числа из list - только чётные и только до определённого момента?

а чем плохо 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])
я канешн извяняюсь за такой код но это шевелится и шевелится в правильном направлении



1. пжлст, форматируйте код, это в панели создания сообщений, выделите код и нажмите что то вроде
2. чтобы вставить изображение залейте его куда нибудь (например), нажмите и вставьте ссылку на его url

есчщо

Офлайн

#3 Май 6, 2021 20:39:56

Ocean
Зарегистрирован: 2021-03-14
Сообщения: 131
Репутация: +  9  -
Профиль   Отправить e-mail  

Как вывести числа из list - только чётные и только до определённого момента?

AD0DE412
У вас в исходном наборе отсутствует 237

 numbers = [1, 240, 3, 8, 238, 239, 242, 10, 11, 12, 244]

А в коде 237 используется “if 237 in numbers”

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

AD0DE412
а чем плохо list.index(237) как у py.user.next
У него все работает.
Вопрос был в чем отличие кода Гладиатора от правильного листинга кода в онлайн обучалке)

Отредактировано Ocean (Май 6, 2021 20:41:46)

Офлайн

#4 Май 7, 2021 01:41:59

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9716
Репутация: +  842  -
Профиль   Отправить e-mail  

Как вывести числа из list - только чётные и только до определённого момента?

Ocean
Я туплю какое другое число он подставил и почему код его вывел?
Напиши, пожалуйста, числовую последовательность, на которой ломается первая программа, которую написал GLADIATORD.
Юнит-тесты, которые находятся в том сервисе, где сидит GLADIATORD и делает это упражнение, как раз и проверяют все границы. И они делают вот эту проверку, что если число сменится в маркере конца, то код должен работать так же - на маркере конца выходить, а не включать маркер конца, если тот удовлетворяет предикату (в данном случае предикат - “число_является_чётным(число): да/нет”). Предикат - это функция, которая для аргумента/аргументов возвращает истину или ложь. Так вот, при дальнейшей разработке предикат выносится из кода. Здесь он как бы не виден, число напрямую проверяется. Но когда мы программируем, мы видим за этими проверками предикаты (у себя в голове). А ещё при дальнейшей разработке, когда это будет вынесено, предикат подаётся как аргумент. Таким образом можно менять предикаты. Мы обо всём об этом думаем и смотрим, чтобы в коде всё было правильно - чтобы всё правильно проверялось и всё правильно выполнялось. Бывает, что не только предикат подаётся в функцию как аргумент, но и действие, выполняемое по истинности этого предиката тоже передаётся в функцию как аргумент. В первой версии книжки K&R как раз и была функция сортировки, которая принимала и функцию для сравнения двух элементов, и функцию для перестановки двух элементов, если они стоят в ложном порядке. Таким образом она могла и сравнивать между собой два числа или два массива, и переставлять потом местами эти два числа или эти два массива, если предикат сравнения давал ложь для них. Это абсолютно разные операции, поэтому их вот так параметризируют, иначе ты такой функцией сортировки сможешь сортировать только числа между собой или только массивы между собой, а сортировать всё что угодно и как угодно не сможешь. Потом из книжки, уже в K&R2 этого не было, исключили передаваемую функцию перестановки элементов, а передаваемую функцию сравнения оставили и функция сортировки внутри стала попроще. Там эту функцию надо было писать самому в качестве упражнения. Просто чтобы не перегружать мозги читателям, которые упражнения делают, сделали так. Потому что реальная функция, если ты код откроешь у какой-нибудь библиотеки из BSD, там вообще простыня кода на километр и внутри там вообще несколько абсолютно разных сортировок в этой одной функции “одной определённой” сортировки. Чтобы вообще всё там правильно было, можно бесконечно писать код. Для просто учебного упражнения этого было бы слишком многовато, читатель просто захлебнулся бы в собственном коде и бросил книжку и вообще всё обучение. Она очень мотивирующая и приглашающая в дальнейшие главы, поэтому читалась и проходилась легко многими тысячами людей.

Эта работа с предикатами относится ко всему программированию. В разных языках это реализуется просто или сложно. Бывает, что вообще очень сложно реализовать это в каких-то языках. Чем ближе к функциональной парадигме, тем легче там использовать предикаты. Короче, это идиома программирования.
В питоне они во многих местах есть уже изначально, функция filter(), функции из модуля itertools типа takewhile(), dropwhile() и других.
  
>>> 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
а чем плохо list.index(237) как у py.user.next
Вариант с index()'ом плох потому, что он ест память. Создание среза приводит к полному копированию всех элементов в памяти. А если их там миллиард, этих элементов до маркера конца? Поэтому я там привёл второй вариант с itertools.takewhile(), который и по памяти экономный, так как он копии сразу всего не создаёт. Первый вариант даёт возможность просто пройти юнит-тесты в большинстве учебных систем.



Отредактировано py.user.next (Май 7, 2021 01:58:11)

Офлайн

#5 Май 7, 2021 09:07:17

AD0DE412
Зарегистрирован: 2019-05-12
Сообщения: 1130
Репутация: +  44  -
Профиль   Отправить e-mail  

Как вывести числа из list - только чётные и только до определённого момента?

Ocean
У вас в исходном наборе отсутствует 237
ага и это обрабатывается … докинте есле не сложно эти 237



1. пжлст, форматируйте код, это в панели создания сообщений, выделите код и нажмите что то вроде
2. чтобы вставить изображение залейте его куда нибудь (например), нажмите и вставьте ссылку на его url

есчщо

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version