Может ли функция быть параметром определения функции - PullRequest
0 голосов
/ 01 мая 2020

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

Вот несколько примеров, которые меня смутили.

def func1(x,y=len()):
    pass

Я хочу знать, что происходит в этих параметрах функций, когда мы их вызываем

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

Ответы [ 2 ]

0 голосов
/ 01 мая 2020

В обоих примерах кода есть синтаксические ошибки, поэтому неясно, что именно вы ищете.

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

Вот пример:

# print_os takes an integer and prints that many o's
def print_os(n):
    print('o' * n)


# here, f is expected to be a function, any function that takes an integer
def for_multiples_of_three(xs, f):
    for x in xs:
        if x % 3 == 0:
            f(x)


for_multiples_of_three([2, 6, 1, 9, 4, 5, 3], print_os)

Результат:

oooooo
ooooooooo
ooo

Или это:

def first_letter(s):
    return s[0] if s else ''


def for_each_word(s, f):
    return [f(x) for x in s.split()]


print(for_each_word('Not a very useful function', first_letter))

Результат:

['N', 'a', 'v', 'u', 'f']

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

Ошибка в ваших примерах заключается в том, что вы добавили (), что означает, что Python пытается вызвать функцию и получить от них результат, а затем передает результат в следующую функцию. Это не вызов функции с функцией, это вызов функции с результатом другой функции:

def three():
    return 3

def print_sum(x, y):
    print(x+y)

print_sum(2, three())

Результат:

5
0 голосов
/ 01 мая 2020

Функции являются объектами, как и все остальное. Как только вы определили один

>>> def foo(param):
...     return "Do all the " + param
... 

Вы можете передать его другой функции и заставить эту функцию выполнить вызов

>>> def bar_1(func, param):
...     print(func(param))
... 
>>> bar_1(foo, "things")
Do all the things

Вы можете использовать объект функции в качестве параметра по умолчанию

>>> def bar_2(func=foo, param=""):
...     print(func(param))
... 
>>> bar_2()
Do all the 

Вы даже можете вызвать функцию и использовать ее результат, чтобы установить значение по умолчанию для параметра

>>> def bar_3(text=foo("things")):
...     print(text)
... 
>>> bar_3()
Do all the things

Но вы не можете вызвать функцию для определения самого имени параметра. Здесь кажется, что вы хотите, чтобы результатом len() (который возвращает int - или в этом случае не удалось) было имя параметра, но это нарушает правила синтаксиса python.

>>> def func1(x,y,len()):
  File "<stdin>", line 1
    def func1(x,y,len()):
                     ^
SyntaxError: invalid syntax
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...