Форум сайта python.su
При изучении темы замыкания, возникло недопонимание для чего это вообще нужно
Пример кода:
def number(num): def new_number(a): return num + a return new_number print(number(10)(3))
def number_1(num, a): def new_number(b): return num + b return new_number(a) print(number_1(10, 3))
Офлайн
hendemanТы создаёшь замыкание, а потом пользуешься им многократно.
При изучении темы замыкания, возникло недопонимание для чего это вообще нужно
>>> def search_string(pattern): ... def f(string): ... return pattern in string ... return f ... >>> searcher_john = search_string('John') >>> searcher_mary = search_string('Mary') >>> >>> for s in ('Bob went to the shop', ... 'I saw John near the car', ... 'Her name was Mary'): ... if searcher_john(s): ... print('I see John in', repr(s)) ... if searcher_mary(s): ... print('I see Mary in', repr(s)) ... I see John in 'I saw John near the car' I see Mary in 'Her name was Mary' >>> >>> searchers = tuple((i, search_string(i)) for i in ('near', 'car', 'name')) >>> >>> for s in ('Bob went to the shop', ... 'I saw John near the car', ... 'Her name was Mary'): ... for searcher_s, searcher_f in searchers: ... if searcher_f(s): ... print('I see {} in'.format(searcher_s), repr(s)) ... I see near in 'I saw John near the car' I see car in 'I saw John near the car' I see name in 'Her name was Mary' >>>
Отредактировано py.user.next (Фев. 18, 2022 04:14:08)
Офлайн
hendemanеще замыкание можно использовать чтобы хранить свое последнее состояние
возникло недопонимание для чего это вообще нужно
def fib(): x0 = 0 x1 = 1 print('изначальное состояние двух переменных', x0, x1,'\n') def get_next_num(): nonlocal x0, x1 print(f'храню предыдущее состояние x0,x1 = {x0}, {x1}') x0, x1 = x1, x1 + x0 print('новый расчет выдал результат = ', x1) print("^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^") return x1 return get_next_num f = fib() f() f() f() f() print('в памяти храним только предыдущее состояние, так как только оно нам нужно для расчетов') print('а не высчитывая всю цепочку начиная от 0\n') f()
изначальное состояние двух переменных 0 1
храню предыдущее состояние x0,x1 = 0, 1
новый расчет выдал результат = 1
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
храню предыдущее состояние x0,x1 = 1, 1
новый расчет выдал результат = 2
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
храню предыдущее состояние x0,x1 = 1, 2
новый расчет выдал результат = 3
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
храню предыдущее состояние x0,x1 = 2, 3
новый расчет выдал результат = 5
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
в памяти храним только предыдущее состояние, так как только оно нам нужно для расчетов
а не высчитывая всю цепочку начиная от 0
храню предыдущее состояние x0,x1 = 3, 5
новый расчет выдал результат = 8
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Process finished with exit code 0
Отредактировано xam1816 (Фев. 18, 2022 16:37:43)
Офлайн
py.user.nextДля примера, возьмем первую часть Вашего кода и сравним с кодом ниже:
def search_string(pattern, name): def f(string): return string in pattern return f(name) searcher_john = 'John' searcher_mary = 'Mary' for s in ('Bob went to the shop', 'I saw John near the car', 'Her name was Mary'): if search_string(s, searcher_john): print('I see John in', repr(s)) if search_string(s, searcher_mary): print('I see Mary in', repr(s))
Офлайн
hendemanНу, я убираю цикл вообще и получаю короткий код
Чем плох такой вариант?
>>> def search_string(pattern): ... def f(string): ... return pattern in string ... return f ... >>> def f(): ... searcher_john = search_string('John') ... searcher_mary = search_string('Mary') ... strings = ('Bob went to the shop', ... 'I knew Mary since 2007', ... 'I saw John near the car', ... 'I saw John near the shop', ... 'Her name was Mary') ... print('I see John in', *map(repr, filter(searcher_john, strings))) ... print('I see Mary in', *map(repr, filter(searcher_mary, strings))) ... >>> f() I see John in 'I saw John near the car' 'I saw John near the shop' I see Mary in 'I knew Mary since 2007' 'Her name was Mary' >>>
Отредактировано py.user.next (Фев. 19, 2022 01:23:25)
Офлайн