Уведомления

Группа в Telegram: @pythonsu

#1 Ноя. 6, 2009 17:37:21

KW
От:
Зарегистрирован: 2009-11-06
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

Параметры функций

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

Upd: был пример кода, который демонстрирует последний из перечисленных обходных путей; удалил, поскольку он уводил обсуждение в сторону.



Отредактировано (Ноя. 6, 2009 18:09:32)

Офлайн

#2 Ноя. 6, 2009 17:41:56

igor.kaist
От:
Зарегистрирован: 2007-11-12
Сообщения: 1879
Репутация: +  3  -
Профиль   Отправить e-mail  

Параметры функций

В первую очередь нужно заглядывать в какой нибудь учебник…

Функция произвольного числа аргументов:
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



Отредактировано (Ноя. 6, 2009 17:42:35)

Офлайн

#3 Ноя. 6, 2009 17:45:45

KW
От:
Зарегистрирован: 2009-11-06
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

Параметры функций

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]
Как-то неаккуратно…



Отредактировано (Ноя. 6, 2009 18:05:02)

Офлайн

#4 Ноя. 6, 2009 18:06:37

Ferroman
От:
Зарегистрирован: 2006-11-16
Сообщения: 2759
Репутация: +  1  -
Профиль   Отправить e-mail  

Параметры функций

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

Офлайн

#5 Ноя. 6, 2009 18:23:12

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Параметры функций

Более того - есть мнение, что var/out/ref модификаторы нужны только для языков, не поддерживающих простую и ненапряжную работу с кортежами/списками.
И на самом деле они жизнь не облегчают.



Офлайн

#6 Ноя. 6, 2009 18:23:30

KW
От:
Зарегистрирован: 2009-11-06
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

Параметры функций

Ferroman
Простой ответ - да, обязательно.
А сложный?
Хорошо это будет смотрется только в случае, если эти три параметра отражают свойства какой-то одной сущности, для которой можно создать свой класс и хранить их там.

Даже если эти параметры - поля объектов, но разных, придется передавать в функцию эти объекты. Но тогда функция сможет теоретически поменять в этих объектах что угодно, не только три конкрентных поля.



Отредактировано (Ноя. 6, 2009 18:30:37)

Офлайн

#7 Ноя. 6, 2009 18:27:33

KW
От:
Зарегистрирован: 2009-11-06
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

Параметры функций

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



Отредактировано (Ноя. 6, 2009 19:07:23)

Офлайн

#8 Ноя. 6, 2009 18:35:49

Ferroman
От:
Зарегистрирован: 2006-11-16
Сообщения: 2759
Репутация: +  1  -
Профиль   Отправить e-mail  

Параметры функций

Сложный? Ок.
Дело в том, что параметры, переменные это не просто какие-то “левые” контейнеры данных.
Эти параметры - обязательно характеристики чего-то. В абстракции (структуре) этого чего-то они и должны быть записаны.
Иначе увеличение побочных эффектов.

Офлайн

#9 Ноя. 6, 2009 18:44:12

KW
От:
Зарегистрирован: 2009-11-06
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

Параметры функций

Ferroman
Эти параметры - обязательно характеристики чего-то. В абстракции (структуре) этого чего-то они и должны быть записаны.
Иначе увеличение побочных эффектов.
Но тогда придется передавать в функцию эти объекты “целиком” и функция сможет теоретически поменять в этих объектах что угодно, не только три конкрентных поля. Т. е. как раз эти побочные эффекты будут не исключены. Или речь о том, чтобы ф-я была методом класса, а ее параметры - его полями, что почти то же самое - просто один из объектов передается как self.

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

Если это к тому, что язык способствует применению именно ООП, то вспоминается Java с изобилием объектов, которое постоянно нуждается в рефакторинге.



Отредактировано (Ноя. 6, 2009 19:24:12)

Офлайн

#10 Ноя. 6, 2009 19:17:16

Ferroman
От:
Зарегистрирован: 2006-11-16
Сообщения: 2759
Репутация: +  1  -
Профиль   Отправить e-mail  

Параметры функций

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

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

Отредактировано (Ноя. 6, 2009 19:18:01)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version