Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Функция с переменным числом аргументов 
V
    Опции темы
dizzy1984
Дата 11.11.2009, 15:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 675
Регистрация: 15.2.2007

Репутация: 1
Всего: 25



Есть функция
Код

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

и функция
Код

def f2( a ):
    return a


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

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

?
PM MAIL   Вверх
pythonwin
Дата 11.11.2009, 16:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2529
Регистрация: 18.4.2006
Где: за компом

Репутация: 14
Всего: 36



Цитата

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


PM WWW GTalk Jabber   Вверх
dizzy1984
Дата 12.11.2009, 08:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 675
Регистрация: 15.2.2007

Репутация: 1
Всего: 25



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

def f1( *a ):
   ...

def f2( *a ):
    ...

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

PM MAIL   Вверх
_Viper_
Дата 16.11.2009, 14:32 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 87
Регистрация: 8.11.2006

Репутация: 10
Всего: 11



Цитата(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


PM MAIL   Вверх
dizzy1984
Дата 19.11.2009, 17:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 675
Регистрация: 15.2.2007

Репутация: 1
Всего: 25



Спасибо!
PM MAIL   Вверх
Virtuos86
Дата 15.1.2010, 14:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 4.12.2009
Где: Томская обл.

Репутация: нет
Всего: нет



 А что функция 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
>>> 


Это сообщение отредактировал(а) Virtuos86 - 15.1.2010, 14:38
PM MAIL Jabber   Вверх
Артемий123
Дата 18.1.2010, 21:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 18.1.2010

Репутация: нет
Всего: нет



горю,програмисты! третий день бьюсь над тем, чтобы написать универсальный цикл для поиска максимума функции с 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 
PM MAIL   Вверх
Леопольд
Дата 19.1.2010, 01:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 943
Регистрация: 17.6.2009

Репутация: нет
Всего: 13



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

xmax=x
zmax=z

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

Это сообщение отредактировал(а) Леопольд - 19.1.2010, 01:58


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
Virtuos86
Дата 19.1.2010, 13:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 4.12.2009
Где: Томская обл.

Репутация: нет
Всего: нет



Я так понял, что в лоб будет трудно решить такую задачу. 
В решении появляется факториал от числа аргументов функции, т.е. при приличном количестве аргументов время работы программы резко возрастет.
Поэтому нужно включать голову.
Код
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. Вот и результат.
PM MAIL Jabber   Вверх
shupg
Дата 19.1.2010, 15:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 59
Регистрация: 21.6.2006

Репутация: 2
Всего: 2



Код

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/

Просто автоматизируя "на голую".
PM MAIL   Вверх
powerfox
Дата 19.1.2010, 16:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I wanna fork()
****


Профиль
Группа: Комодератор
Сообщений: 3990
Регистрация: 1.10.2005
Где: Санкт-Петербург

Репутация: 1
Всего: 97



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

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

Это сообщение отредактировал(а) powerfox - 19.1.2010, 16:45


--------------------
user posted image
PM WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Python: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1386 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.