Форум сайта python.su
103
vrabeyочень запутано!
так не создавайте промежуточную переменную
Офлайн
16
vrabeyТак то да, сорри
так не создавайте промежуточную переменную
Офлайн
23
terabaytне уверен но если передавать аргументом то это как то более гибко что ли -
очень запутано!
Офлайн
16
terabaytЯ очень сильно упростил задачу, еще пару деньков попробую подумать над ней, и, наверное, в другой теме выложу, в этой теме неосновная ее часть
а условие задания какое? может мы поможем сделать еще лучше!
Офлайн
857
StrightСвязывать функции между собой точно так же неправильно, как и связывать функции через глобальные переменные. Функции должны быть независимыми друг от друга, даже если используются совместно. Связь между функциями должна поддерживаться через передаваемые аргументы и возвращаемые значения. Причём эти данные должны быть максимально простыми, чтобы исключить ещё одну связь.
Знаю, что можно присвоить результат какой-либо глобальной переменной, но в этом случае пользоваться глобальными переменными, наверное, будет неправильно.
>>> def f1(): ... return [1, 2, 3, 4, 5] ... >>> def f2(lst): ... lst.append(1) ... return lst ... >>> f1() [1, 2, 3, 4, 5] >>> f2([8, 9]) [8, 9, 1] >>> f2(f1()) [1, 2, 3, 4, 5, 1] >>> >>> x = [] >>> _ = f2(x) >>> x [1] >>>
>>> def f1(): ... return [1, 2, 3, 4, 5] ... >>> def f2(lst): ... return lst + [1] ... >>> f1() [1, 2, 3, 4, 5] >>> f2([8, 9]) [8, 9, 1] >>> f2(f1()) [1, 2, 3, 4, 5, 1] >>> >>> x = [] >>> f2(x) [1] >>> x [] >>>
Отредактировано py.user.next (Фев. 26, 2015 01:22:16)
Офлайн
16
То есть получается, что при передаче результата, например, из первой функции во вторую, а в свою очередь из второй в третью предпочтительная схема получается примерно такой:
def f1(): ... def f2(arg1): ... def f3(arg2): ... f2(f1()) f3(f2())
py.user.nextА если этот побочный эффект как раз и требуется от функции?
Это побочный эффект, и их следует точно так же избегать.
Офлайн
857
Stright
То есть получается, что при передаче результата, например, из первой функции во вторую, а в свою очередь из второй в третью
f3(f2(f1()))
StrightРано или поздно у тебя окажется объект, который нельзя менять. И из-за этого побочного эффекта ты не сможешь применить к нему эту функцию. Будешь писать новую функцию, которая делает то же самое без побочного эффекта.
А если этот побочный эффект как раз и требуется от функции?
Офлайн
-1
py.user.next
Чего-то я запутался. Ты против того чтобы, вообще, вкладывать функции друг в друга?
Офлайн
857
MiKНе, там он список подаёт, который после работы функции становится изменённым. Когда надо будет сделать то же самое со списком, который нельзя менять, он не сможет это сделать. К тому же в описании функции придётся писать, что у неё есть побочный эффект, потому что из названия и аргументов этого не видно.
Ты против того чтобы, вообще, вкладывать функции друг в друга?
>>> def f(lst, item): ... lst.append(item) ... return lst ... >>> lst = [1, 2, 3] >>> out = f(lst, 1) >>> lst, out ([1, 2, 3, 1], [1, 2, 3, 1]) >>>
>>> import sys >>> >>> out = f(sys.argv, '..') >>> sys.argv, out (['', '..'], ['', '..']) >>>
>>> def f(lst, item): ... return lst + [item] ... >>> lst = [1, 2, 3] >>> out = f(lst, 1) >>> lst, out ([1, 2, 3], [1, 2, 3, 1]) >>> >>> import sys >>> >>> out = f(sys.argv, '..') >>> sys.argv, out ([''], ['', '..']) >>>
MiKВкладывать можно:
вкладывать функции
>>> def f(lst): ... def g(seq): ... return (i + 1 for i in seq) ... def h(seq): ... return (i ** 3 for i in seq) ... return list(h(g(h(g(lst))))) ... >>> f([1, 2, 3]) [729, 21952, 274625] >>>
Отредактировано py.user.next (Фев. 26, 2015 21:43:42)
Офлайн
-1
py.user.next
Интересно, твоё мнение как специалиста: на питоне можно нормально в функциональном стиле писать? Я имею ввиду именно парадигму. А то мнения очень неоднозначны на этот счёт, и я не знаю есть ли смысл лезть в эти дебри.
Офлайн