Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 24, 2022 22:11:42

xam1816
Зарегистрирован: 2020-05-11
Сообщения: 1308
Репутация: +  112  -
Профиль   Отправить e-mail  

HELP! Почему не работает код?

py.user.next
Попробуй, перепиши это на генераторы, как того требует второй питон
 res1 = filter(lambda i: 1 < i < 5, map(int, filter(str.isdigit, '123abcdef456')))
#
print(list(res1)) # [2, 3, 4]
#
res2 = (int(i) for i in '123abcdef456' if i.isdigit() and 1 < int(i) < 5 )
#
print(list(res2)) # [2, 3, 4]

С фильтром получается много вложенного, чем с генератором, нужен какой-то более жестокий пример для сравнения

Офлайн

#2 Янв. 25, 2022 10:53:09

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

HELP! Почему не работает код?

xam1816
С фильтром получается много вложенного, чем с генератором
А где у меня два раза int() происходит?

На генераторах оно будет вот так выглядеть
  
>>> (i for i in (int(i) for i in '123abcdef456' if i.isdigit()) if 1 < i < 5)
<generator object <genexpr> at 0x7f29942ccb48>
>>> list(_)
[2, 3, 4]
>>>
Чтобы прочитать это, сначала тебе надо будет долго искать самый внутренний генератор, докуда он там продолжается. Потом надо будет искать генератор вокруг этого самого внутреннего генератора, тоже максимально внимательно отыскивая его границы, чтобы не ошибиться и случайно не подумать не то. Потом снова и снова выходить изнутри наружу. Это уже похоже на операции, схожие с интегрированием сложной функции.
А с filter() ты сразу видишь, где там границы, потому что там не бывает каких-то разных filter(). У filter() всегда только два аргумента и всё.
А когда у тебя таких строк сто и писал их не ты, а какой-нибудь крендель, за которым надо проверять каждую букву, потому что он мог там ошибок понаделать в каждой строке, то скорость чтения такого кода играет вполне ощутимую роль. Или ты весь день будешь сидеть и читать этот отрывок кода, или за пятнадцать минут его прочитаешь, а остальное время будешь читать много других кодов.

Наличие filter() повышает читаемость кода, потому что все знают, как работает filter(), и прочитают его легко и однозначно. Наличие генераторного выражения снижает читаемость кода, потому что оно может быть произвольным, с множеством вложенностей и одинаковых имён на разных уровнях. И не всегда их пишут гении. Бывают их пишут такие дураки, что потом, когда они куда-то деваются, в вакансии на их место пишут “требуется человек, способный разбираться в чужом коде” - это вот такая кодовая фраза, означающая “у нас код писал какой-то дебил, а теперь мы его найти не можем, он куда-то на более тёплое место переехал, а там в его коде чота сломалось и мы даже не можем понять чо, помогите, спасите нас”.



Отредактировано py.user.next (Янв. 26, 2022 01:08:08)

Офлайн

#3 Янв. 25, 2022 17:52:27

xam1816
Зарегистрирован: 2020-05-11
Сообщения: 1308
Репутация: +  112  -
Профиль   Отправить e-mail  

HELP! Почему не работает код?

узнал для себя еще такой момент, что повторно генераторы и map и filter нельзя использовать, как обойму выстрелял и все, нужно перезаряжать…

 seq = (1,2,3,4,5,6,7,8,9)
my_map = map(lambda x: x, seq)
print('вывожу посмотреть')
print('my_map_first',list(my_map)) # >>> my_map_first [1, 2, 3, 4, 5, 6, 7, 8, 9]
print('далее перебираю my_map')
#
for i in my_map:
    print(i)
#
print('а его уже нет, такая же ситуация далее с генератором')
gen = (i for i in seq)
lst = list(gen)
#
print('gen', list(gen)) # >>> []
print('lst', lst) # >>> lst [1, 2, 3, 4, 5, 6, 7, 8, 9]
#
my_filter = filter(lambda x: x > 4, seq)
print('посмотрел значит такой для себя что как отфильтровалось')
print(list(my_filter)) # >>> [5, 6, 7, 8, 9]
#
print('снова воспользоваться не получиться, он уже пустой')
for i in my_filter:
    print(i + 2)
#
print('хотя сам он никуда не делся')
print(my_filter) # <filter object at 0x0000019A493E3E50>
#
print('создадим генератор, вывдем два первых элемента')
new_gen = (i for i in range(5))
#
print(next(new_gen)) # 0
print(next(new_gen)) # 1
print('посмотрим что осталось')
print(list(new_gen))# [2, 3, 4]
print('выведем еще раз')
print(list(new_gen)) # []

Офлайн

#4 Янв. 26, 2022 01:17:53

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

HELP! Почему не работает код?

xam1816
узнал для себя еще такой момент, что повторно генераторы и map и filter нельзя использовать, как обойму выстрелял и все, нужно перезаряжать
Попробуй выстрелить генератор g() весь
  
>>> def g():
...     while True:
...         yield 1
... 
>>> list(zip(g(), range(3)))
[(1, 0), (1, 1), (1, 2)]
>>>
Просто запусти
  
list(g())

В питоне есть итераторы, есть генераторы, есть генераторные выражения, есть итерабельные объекты, есть включения. И это всё различается между собой. Так что нужно тебе читать книжку, потому что это в двух словах не расскажешь. Если не будешь книжки читать, то будешь итераторы генераторами называть, генераторы итераторами, генераторные выражения генераторами, а потом дойдёшь и до того, что включения будешь называть генераторами, как у многих это бывает. И, естественно, у тебя будет каша в голове и знать ты ничего не будешь точно, будешь знать только приблизительно. И в итоге будешь, как собака: всё знаешь, всё понимаешь, только вот ничего написать не можешь, и ни одной программы у тебя нет за десятки лет твоего “программирования”. У многих такое бывает, даже бывает у целых групп это принято, как у леммингов каких-то. Сидят, соревнуются, как шимпанзе или как разноцветные попугаи на ветках, кто больше с умным видом слов наговорил и понаписал, и все сидят и пользуются чужими прогами, потому что свои написать не в состоянии, так как это же сложно, языком-то молоть гораздо легче, главное уши найти и всё, которые слухать будут легенды про то, как он там бороздил.



Отредактировано py.user.next (Янв. 26, 2022 01:41:15)

Офлайн

#5 Янв. 26, 2022 18:43:12

olly_wonka
Зарегистрирован: 2022-01-22
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

HELP! Почему не работает код?

Добрый вечер!

программа должна выводить весь список приветствий, но выводит только одно
не могу понять, что я не так делаю

помогите, пжлста))

 def convert_name_extract(list_in: list) -> str:
    for i in list_in:
        list_in = f'Привет, {i.split()[-1].title()}!'
    return list_in
my_list = ['инженер-конструктор Игорь',
           'главный бухгалтер МАРИНА',
           'токарь высшего разряда нИКОЛАй', 'директор аэлита']
result = convert_name_extract(my_list)
print(result)

Офлайн

#6 Янв. 26, 2022 18:54:01

xam1816
Зарегистрирован: 2020-05-11
Сообщения: 1308
Репутация: +  112  -
Профиль   Отправить e-mail  

HELP! Почему не работает код?

olly_wonka
не могу понять, что я не так делаю
расскажите поочередно что происходит в вашем коде, напишите сюда подробно

Офлайн

#7 Янв. 26, 2022 18:59:35

olly_wonka
Зарегистрирован: 2022-01-22
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

HELP! Почему не работает код?

xam1816

- дан список элементов
- извлекаем имена из переменных
- формируем приветствие, приводим к необходимому виду
- возвращаем приветствие
- выводим список приветствий

Офлайн

#8 Янв. 26, 2022 19:27:46

xam1816
Зарегистрирован: 2020-05-11
Сообщения: 1308
Репутация: +  112  -
Профиль   Отправить e-mail  

HELP! Почему не работает код?

чтобы увидеть каждый шаг кто что принимает и чем становиться можно выводить с помощью print()

 def convert_name_extract(list_in: list) -> str:
    print('на вход функции поступил список =>','\n')
    print(list_in,'\n')
    print('перебираем каждый элемент списка','\n')
    for n, i in enumerate(list_in, 1):
        print(f'i = {i}(это {n}й элемент списка)')
        print('list_in (который изначально содержал в себе список), теперь становиться строкой','\n')
        list_in = f'Привет, {i.split()[-1].title()}!'
        print(f'list_in = {list_in}\n')
    print(f'по окончанию цикла for функция возвращает то что содержиться в list_in ','\n')
    return list_in
#
print('=================')
print('создали список my_list')
my_list = ['инженер-конструктор Игорь',
           'главный бухгалтер МАРИНА',
           'токарь высшего разряда нИКОЛАй', 'директор аэлита']
#
print('переменная result ожидает то что вернет функция convert_name_extract, на вход передали список my_list','\n')
#
result = convert_name_extract(my_list)
print(result)

вывод
=================
создали список my_list
переменная result ожидает то что вернет функция convert_name_extract, на вход передали список my_list

на вход функции поступил список =>

['инженер-конструктор Игорь', 'главный бухгалтер МАРИНА', 'токарь высшего разряда нИКОЛАй', 'директор аэлита']

перебираем каждый элемент списка

i = инженер-конструктор Игорь(это 1й элемент списка)
list_in (который изначально содержал в себе список), теперь становиться строкой

list_in = Привет, Игорь!

i = главный бухгалтер МАРИНА(это 2й элемент списка)
list_in (который изначально содержал в себе список), теперь становиться строкой

list_in = Привет, Марина!

i = токарь высшего разряда нИКОЛАй(это 3й элемент списка)
list_in (который изначально содержал в себе список), теперь становиться строкой

list_in = Привет, Николай!

i = директор аэлита(это 4й элемент списка)
list_in (который изначально содержал в себе список), теперь становиться строкой

list_in = Привет, Аэлита!

по окончанию цикла for функция возвращает то что содержиться в list_in

Привет, Аэлита!

Process finished with exit code 0

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

Видишь ли теперь в чем твоя ошибка?

Отредактировано xam1816 (Янв. 26, 2022 19:36:05)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version