Уведомления

Группа в Telegram: @pythonsu

#1 Фев. 25, 2015 23:10:59

terabayt
От: Киев
Зарегистрирован: 2011-11-26
Сообщения: 1099
Репутация: +  103  -
Профиль   Отправить e-mail  

Передача результата первой функции в качестве аргумента для второй

vrabey
так не создавайте промежуточную переменную
очень запутано!



————————————————
-*- Simple is better than complex -*-

Офлайн

#2 Фев. 25, 2015 23:16:21

Stright
От: Кострома
Зарегистрирован: 2015-01-20
Сообщения: 139
Репутация: +  16  -
Профиль   Отправить e-mail  

Передача результата первой функции в качестве аргумента для второй

vrabey
так не создавайте промежуточную переменную
Так то да, сорри

Офлайн

#3 Фев. 25, 2015 23:20:10

vrabey
От: Киев
Зарегистрирован: 2013-04-17
Сообщения: 209
Репутация: +  23  -
Профиль   Отправить e-mail  

Передача результата первой функции в качестве аргумента для второй

terabayt
очень запутано!
не уверен но если передавать аргументом то это как то более гибко что ли -
на вход f2 можно передать и другую функцию - возвращающую список

Офлайн

#4 Фев. 25, 2015 23:20:20

Stright
От: Кострома
Зарегистрирован: 2015-01-20
Сообщения: 139
Репутация: +  16  -
Профиль   Отправить e-mail  

Передача результата первой функции в качестве аргумента для второй

terabayt
а условие задания какое? может мы поможем сделать еще лучше!
Я очень сильно упростил задачу, еще пару деньков попробую подумать над ней, и, наверное, в другой теме выложу, в этой теме неосновная ее часть

Офлайн

#5 Фев. 26, 2015 01:09:36

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

Передача результата первой функции в качестве аргумента для второй

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]
>>> 
Лучше и list.append() исключить из f2(), так как изменение аргумента не видно из заголовка. Это побочный эффект, и их следует точно так же избегать.

>>> 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)

Офлайн

#6 Фев. 26, 2015 08:08:59

Stright
От: Кострома
Зарегистрирован: 2015-01-20
Сообщения: 139
Репутация: +  16  -
Профиль   Отправить e-mail  

Передача результата первой функции в качестве аргумента для второй

То есть получается, что при передаче результата, например, из первой функции во вторую, а в свою очередь из второй в третью предпочтительная схема получается примерно такой:

def f1():
    ...
def f2(arg1):
    ...
def f3(arg2):
    ...
f2(f1())
f3(f2())
?
py.user.next
Это побочный эффект, и их следует точно так же избегать.
А если этот побочный эффект как раз и требуется от функции?

Офлайн

#7 Фев. 26, 2015 09:50:05

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

Передача результата первой функции в качестве аргумента для второй

Stright
То есть получается, что при передаче результата, например, из первой функции во вторую, а в свою очередь из второй в третью
f3(f2(f1()))

Stright
А если этот побочный эффект как раз и требуется от функции?
Рано или поздно у тебя окажется объект, который нельзя менять. И из-за этого побочного эффекта ты не сможешь применить к нему эту функцию. Будешь писать новую функцию, которая делает то же самое без побочного эффекта.



Офлайн

#8 Фев. 26, 2015 13:56:05

MiK
Зарегистрирован: 2014-10-30
Сообщения: 191
Репутация: +  -1  -
Профиль   Отправить e-mail  

Передача результата первой функции в качестве аргумента для второй

py.user.next
Чего-то я запутался. Ты против того чтобы, вообще, вкладывать функции друг в друга?

Офлайн

#9 Фев. 26, 2015 21:28:17

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

Передача результата первой функции в качестве аргумента для второй

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)

Офлайн

#10 Фев. 26, 2015 22:55:11

MiK
Зарегистрирован: 2014-10-30
Сообщения: 191
Репутация: +  -1  -
Профиль   Отправить e-mail  

Передача результата первой функции в качестве аргумента для второй

py.user.next
Интересно, твоё мнение как специалиста: на питоне можно нормально в функциональном стиле писать? Я имею ввиду именно парадигму. А то мнения очень неоднозначны на этот счёт, и я не знаю есть ли смысл лезть в эти дебри.

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version