Форум сайта python.su
Как в Python поменять параметры, переданные в функцию? Или обязательно для подобных случаев создавать класс, который содержит их значения в полях, передавать их в составе списка или делать глобальными переменными?
Upd: был пример кода, который демонстрирует последний из перечисленных обходных путей; удалил, поскольку он уводил обсуждение в сторону.
Отредактировано (Ноя. 6, 2009 18:09:32)
Офлайн
В первую очередь нужно заглядывать в какой нибудь учебник…
Функция произвольного числа аргументов:
def max_min(*args):
# args - список аргументов в порядке их указания при вызове
return max(args), min(args)
print max_min(1, 2, -1, 5, 3)
Отредактировано (Ноя. 6, 2009 17:42:35)
Офлайн
igor.kaistВ учебник я уже заглядывал, так же как и в документацию по языку.
Функция произвольного числа аргументов
def func(*args)
if (len(args)<3): raise TypeError(...)).
#...
def func(a,b,c):
a=1; b=2; c=3
def func(a,b,c)
a=1; b=2; c=3
return [a,b,c]
Отредактировано (Ноя. 6, 2009 18:05:02)
Офлайн
Как в Python поменять параметры, переданные в функцию? Или обязательно для подобных случаев создавать класс, который содержит их значения в полях, передавать их в составе списка или делать глобальными переменными?Простой ответ - да, обязательно.
Офлайн
Более того - есть мнение, что var/out/ref модификаторы нужны только для языков, не поддерживающих простую и ненапряжную работу с кортежами/списками.
И на самом деле они жизнь не облегчают.
Офлайн
FerromanА сложный?
Простой ответ - да, обязательно.
Отредактировано (Ноя. 6, 2009 18:30:37)
Офлайн
Андрей СветловВот и пытаюсь разобратся с тем, как в Python это правильнее всего делается. Если речь о принципе “Worse Is Better” и простота превыше всего, то это спорно.
Более того - есть мнение, что var/out/ref модификаторы нужны только для языков, не поддерживающих простую и ненапряжную работу с кортежами/списками.
И на самом деле они жизнь не облегчают.
Отредактировано (Ноя. 6, 2009 19:07:23)
Офлайн
Сложный? Ок.
Дело в том, что параметры, переменные это не просто какие-то “левые” контейнеры данных.
Эти параметры - обязательно характеристики чего-то. В абстракции (структуре) этого чего-то они и должны быть записаны.
Иначе увеличение побочных эффектов.
Офлайн
FerromanНо тогда придется передавать в функцию эти объекты “целиком” и функция сможет теоретически поменять в этих объектах что угодно, не только три конкрентных поля. Т. е. как раз эти побочные эффекты будут не исключены. Или речь о том, чтобы ф-я была методом класса, а ее параметры - его полями, что почти то же самое - просто один из объектов передается как self.
Эти параметры - обязательно характеристики чего-то. В абстракции (структуре) этого чего-то они и должны быть записаны.
Иначе увеличение побочных эффектов.
Отредактировано (Ноя. 6, 2009 19:24:12)
Офлайн
Но тогда придется передавать в функцию эти объекты и функция сможет теоретически поменять в этих объектах что угодно, не только три конкрентных поля. Т. е. как раз эти побочные эффекты будут не исключены.Побочные эффекты в императивных языках в принципе не могут быть исключены.
Или речь о том, чтобы ф-я была методом класса, а ее параметры - его полями, что почти то же самое - просто один из объектов передается как self.Сама структура не имеет значения. Это может быть модуль, вложенные функции или класс. Переменные или общие в рамках структуры, что нужно задать явно (global, nonlocal, self), или локальные. That's it.
В любом случае, уменьшение универсальности/общности: функция будет завязана на специфику этих объектов(а вдруг понадобится похожая ф-я, но для других классов?).Это слишком обобщённый вопрос, на него нет однозначного ответа. Поступать надо исходя из практичной необходимости в каждом отдельном случае.
Отредактировано (Ноя. 6, 2009 19:18:01)
Офлайн