2016-02-29 6 views
-3

Я хотел бы помочь в разъяснении логики этого.Python: Почему это работает?

from operator import add, sub 

def a_plus_abs_b(a, b): 
    if b < 0: 
     f = sub # subtract a negative value 
    else: 
     f = add # add a positive one 
    return f(a, b) 

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

+1

Это на самом деле одна из интересных и мощных функций python! – callyalater

+0

Что значит, почему он работает? Вот как язык. Вы назначаете функцию 'f', но не выполняете ее до конца. Я не уверен, о чем вы просите? – olofom

+1

На самом деле, это не работает. Это вызовет ошибку с отступом. – DJMcMayhem

ответ

1

sub - это просто ссылка на объект функции, который реализует вычитание. Как и любая другая ссылка, вы можете присвоить ее значение другому имени, поэтому f = sub просто делает f другое имя для справки, хранящееся в sub. Таким образом, f(a, b) и sub(a, b) обе имеют одну и ту же базовую функцию.

2

Ну, сама логика работает, потому что a + abs(b) == a + b, когда b >= 0 и a + abs(b) == a - b, когда b < 0. Я прокомментировал ваш код ниже.

from operator import add, sub 
# two functions are imported: 
# add(x,y) -> (x + y) 
# sub(x,y) -> (x - y) 

def a_plus_abs_b(a, b): 

    # when b < 0, (a + abs(b)) == (a - b) 
    if b < 0: 
     # f is a temporary variable holding the function sub 
     f = sub 

    # when b >= 0, (a + abs(b)) == (a + b) 
    else: 
     # f is a temporary variable holding the function add 
     f = add 

    # apply the arguments to the function determined above 
    return f(a, b) 

Однако эта функция может быть записана в одну строку.

def a_plus_abs_b(a, b): 
    return a + abs(b) 

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

Смежные вопросы