Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Python: Общие вопросы > Функция с переменным числом аргументов


Автор: dizzy1984 11.11.2009, 15:19
Есть функция
Код

def f1( a, b ):
    return a + b

и функция
Код

def f2( a ):
    return a


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

пример f3( f1, 1, 2 ); f3( f2, 1)

?

Автор: pythonwin 11.11.2009, 16:00
Цитата

$ python
Python 2.5.2 (r252:60911, Jan  4 2009, 17:40:26)
[GCC 4.3.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> def f1(*args,**kw):
...     print locals()
...     return sum(args)
...
...
>>> f1(1,2)
{'args': (1, 2), 'kw': {}}
3
>>> f1(1,2, 4)
{'args': (1, 2, 4), 'kw': {}}
7
>>> f1(4)
{'args': (4,), 'kw': {}}
4
>>>


Автор: dizzy1984 12.11.2009, 08:23
Т.е получается, что обе функции должны быть оформлены, как функции с переменным числом аргументов?
Вроде такого
Код

def f1( *a ):
   ...

def f2( *a ):
    ...

def f3( f, *a ):
    ...

Автор: _Viper_ 16.11.2009, 14:32
Цитата(dizzy1984 @  12.11.2009,  08:23 Найти цитируемый пост)
Т.е получается, что обе функции должны быть оформлены, как функции с переменным числом аргументов?
 Нет, можно сделать так:
Код

In [3]: def f1( a, b ):
    return a + b

In [5]: def f2( a ):
   ...:         return a

In [9]: def f3 (f, *args):
    return f(*args)

In [11]: f3(f1, 1, 2)
Out[11]: 3

In [12]: f3(f2, 1)
Out[12]: 1


Автор: dizzy1984 19.11.2009, 17:18
Спасибо!

Автор: Virtuos86 15.1.2010, 14:35
 А что функция apply уже устарела?
Код
>>> def foo(x, y, z=0):
...     return x + y + z
... 
>>> apply(foo, (1, 2), {'z': 1})
4
>>> apply(foo, (1, 2, 1))
4
>>> foo(1, 2, z=1)
4
>>> foo(1, 2, 1)
4
>>> 

Автор: Артемий123 18.1.2010, 21:15
горю,програмисты! третий день бьюсь над тем, чтобы написать универсальный цикл для поиска максимума функции с n-ным количеством переменных,пришел к тому,что получается цикл while в таком же цикле while n-ое количество раз и каждый цикл со своей переменной. а нужно как-то от этого уйти, может  есть какой-то команда которая поможет мне избавиться от этой бесконечности? ниже привожу пример того на чем остановился:

def f(x,z): return sin(x)-cos(z)
x2=10*pi
z2=5*pi
e=0.1*pi
y1=f(x,z)
ymax=y1
xmax=x
zmax=z
while x<x2:
    x=x+e
    y2=f(x,z)
    if y2>y1:
        ymax=f(x,z)
        xmax=x
        zmax=z
        y1=f(x,z)
    while z<z2:
        z=z+e
        y2=f(x,z)
        if y2>y1:
            ymax=f(x,z)
            xmax=x
            zmax=z
            y1=f(x,z)
print ymax,xmax,zmax

это для двух переменных, для трех соответсвенно на один цикл больше и т.д.
как это записать? помогите чем можете.

Добавлено через 13 минут и 33 секунды
 smile  smile 

Автор: Леопольд 19.1.2010, 01:56
Артемий123, обычно дать ответ сложнее чем задать вопрос. Может задашь вопрос так, что-бы тебя поняли? Этот кусок кода, который ты привёл, вообще не рабочий, просто
Цитата(Артемий123 @  18.1.2010,  21:15 Найти цитируемый пост)
Код

xmax=x
zmax=z

непонятно что вообще за x и z такие. Они нигде не инициализируются.
Python обладает большими возможностями, наверняка есть простое решение, только объясни что тебе надо конкретно. Не жди что каждый будет ломать голову в надежде понять что именно ты хочешь.

Автор: Virtuos86 19.1.2010, 13:02
Я так понял, что в лоб будет трудно решить такую задачу. 
В решении появляется факториал от числа аргументов функции, т.е. при приличном количестве аргументов время работы программы резко возрастет.
Поэтому нужно включать голову.
Код
def f(x,z):
    return sin(x)-cos(z)

1. Берем выражение, по которому вычисляется результат - "sin(x) - cos(z)".
2. Находим максимальные значения положительных членов этого выражения. Здесь это "sin(x)", но могут быть и другие. Например, x изменяется от -pi до 5*pi. Куда там x подставляется, в sin? Находим максимум sin(x) для заданного для x интервала. 
И так по всем членам выражения(sin(x) и остальные члены со знаком плюс).
3. Аналогично находим минимальные значения отрицательных членов выражения(-cos(y) и т.д.)
4. Находим значение выражения, подставляя полученные значения.
5. Вот и результат.

Автор: shupg 19.1.2010, 15:46
Код

def dai_max(*args)
    # do smth like this. If you don't want just max(*args)
    m = args[0]
    for a in args:
        if m < a: m = a
    return m

print dai_max(1,2,6,3)


Хотя мне кажется дело не в этом..

Цитата

2. Находим максимальные значения положительных членов этого выражения. Здесь это "sin(x)", но могут быть и другие. Например, x изменяется от -pi до 5*pi. Куда там x подставляется, в sin? Находим максимум sin(x) для заданного для x интервала. 
И так по всем членам выражения(sin(x) и остальные члены со знаком плюс).
3. Аналогично находим минимальные значения отрицательных членов выражения(-cos(y) и т.д.)


Мне кажется, что подобные задачи лучше решать с помощью математики, чем с помощью автоматизированного перебора. Тригонометрия в помощь!

Цитата

1. Берем выражение, по которому вычисляется результат - "sin(x) - cos(z)".

Насчёт того, что аргументов и функция может быть другая может быть много:
попробуй почитать что-н-ть типа того:
http://radiomaster.ru/articles/view/137/

Просто автоматизируя "на голую".

Автор: powerfox 19.1.2010, 16:45
Модератор: Пожалуйста, один топик - один вопрос.

Артемий123, как бы вы ни горели, создайте отдельную тему. Кроме того, для кода нужно использовать подсветку синтаксиса, а так же учитывать, что телепатов здесь нет.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)