Найти - Пользователи
Полная версия: Параметры функций
Начало » Python для новичков » Параметры функций
1 2
KW
Как в Python поменять параметры, переданные в функцию? Или обязательно для подобных случаев создавать класс, который содержит их значения в полях, передавать их в составе списка или делать глобальными переменными?

Upd: был пример кода, который демонстрирует последний из перечисленных обходных путей; удалил, поскольку он уводил обсуждение в сторону.
igor.kaist
В первую очередь нужно заглядывать в какой нибудь учебник…
Функция произвольного числа аргументов:
def max_min(*args):
# args - список аргументов в порядке их указания при вызове
return max(args), min(args)

print max_min(1, 2, -1, 5, 3)
взято отсюда http://www.intuit.ru/department/pl/python/3/2.html
KW
igor.kaist
Функция произвольного числа аргументов
В учебник я уже заглядывал, так же как и в документацию по языку.

Но мне не нужно произвольного числа аргументов. Обычная функция с 3-мя числовыми параметрами. Речь о изменении параметров в функции. То, что в C# записывается так: func(out int i, out int j, out int k). А в Pascal - func(var i , j, k: integer).

А так придется каждый получать по номеру, а не по имени, и то, заданы ли они все, проверять будет не Питон при вызове функции, а сама функция(вместо TypeError: func() takes 3 arguments (1 given) будет проверка в функции
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]
Как-то неаккуратно…
Ferroman
Как в Python поменять параметры, переданные в функцию? Или обязательно для подобных случаев создавать класс, который содержит их значения в полях, передавать их в составе списка или делать глобальными переменными?
Простой ответ - да, обязательно.
Андрей Светлов
Более того - есть мнение, что var/out/ref модификаторы нужны только для языков, не поддерживающих простую и ненапряжную работу с кортежами/списками.
И на самом деле они жизнь не облегчают.
KW
Ferroman
Простой ответ - да, обязательно.
А сложный?
Хорошо это будет смотрется только в случае, если эти три параметра отражают свойства какой-то одной сущности, для которой можно создать свой класс и хранить их там.

Даже если эти параметры - поля объектов, но разных, придется передавать в функцию эти объекты. Но тогда функция сможет теоретически поменять в этих объектах что угодно, не только три конкрентных поля.
KW
Андрей Светлов
Более того - есть мнение, что var/out/ref модификаторы нужны только для языков, не поддерживающих простую и ненапряжную работу с кортежами/списками.
И на самом деле они жизнь не облегчают.
Вот и пытаюсь разобратся с тем, как в Python это правильнее всего делается. Если речь о принципе “Worse Is Better” и простота превыше всего, то это спорно.
Ferroman
Сложный? Ок.
Дело в том, что параметры, переменные это не просто какие-то “левые” контейнеры данных.
Эти параметры - обязательно характеристики чего-то. В абстракции (структуре) этого чего-то они и должны быть записаны.
Иначе увеличение побочных эффектов.
KW
Ferroman
Эти параметры - обязательно характеристики чего-то. В абстракции (структуре) этого чего-то они и должны быть записаны.
Иначе увеличение побочных эффектов.
Но тогда придется передавать в функцию эти объекты “целиком” и функция сможет теоретически поменять в этих объектах что угодно, не только три конкрентных поля. Т. е. как раз эти побочные эффекты будут не исключены. Или речь о том, чтобы ф-я была методом класса, а ее параметры - его полями, что почти то же самое - просто один из объектов передается как self.

В любом случае, уменьшение универсальности/общности: функция будет завязана на специфику этих объектов(а вдруг понадобится похожая ф-я, но для других классов?).

Если это к тому, что язык способствует применению именно ООП, то вспоминается Java с изобилием объектов, которое постоянно нуждается в рефакторинге.
Ferroman
Но тогда придется передавать в функцию эти объекты и функция сможет теоретически поменять в этих объектах что угодно, не только три конкрентных поля. Т. е. как раз эти побочные эффекты будут не исключены.
Побочные эффекты в императивных языках в принципе не могут быть исключены.
Дело в негативных побочных эффектах - т.е. оставить только контролируемые изменения внешних переменных и только явным образом.
Или речь о том, чтобы ф-я была методом класса, а ее параметры - его полями, что почти то же самое - просто один из объектов передается как self.
Сама структура не имеет значения. Это может быть модуль, вложенные функции или класс. Переменные или общие в рамках структуры, что нужно задать явно (global, nonlocal, self), или локальные. That's it.
Я вот поведением списков в этом плане удивлён. Но тут просто надо запомнить что это ссылки а не реальные объекты.

В любом случае, уменьшение универсальности/общности: функция будет завязана на специфику этих объектов(а вдруг понадобится похожая ф-я, но для других классов?).
Это слишком обобщённый вопрос, на него нет однозначного ответа. Поступать надо исходя из практичной необходимости в каждом отдельном случае.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB