2016-03-11 6 views
1

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

def value(): 
     resp = requests.get('http://www.google.com').elapsed.total_seconds() 
     return resp 

test = value() 

while True: 
     print test 
     time.sleep(10) 

Выход:

0.00649 
0.00649 

В этом случае в while true при печати теста, он возвращает то же значение, хотя я вызываю функцию value(). Как я могу решить эту проблему? Я знаю, что могу поместить функцию в цикл while, но хочу иметь ее как переменную.

+2

просто измените 'test = value()' на 'test = value' – MaxU

+0

@MaxU: Еще немного задействовано. Затем он напечатает что-то вроде '' – zondo

+0

@zondo, это был всего лишь намек (не полный ответ), поэтому он дает OP возможность понять, как справиться с этим – MaxU

ответ

2

Предыдущие ответы верны, но, пожалуйста, позвольте мне уточнить.

В мире Python вещи имеют очень точные значения, но не всегда ясно, что есть, если вы только начинаете.

Выражения вещи, которые имеют значение , и они включают в себя такие вещи, как 123, some_variable и 10/2. Имя some_variable называется идентификатором, просто потому, что оно идентифицирует значение. Точно так же, как имя Скраффи может идентифицировать вашу собаку.

Заявления - это вещи, которые влияют на поток программы или состояние вашей программы, но не имеют значения. Ниже приведены примеры высказываний:

if x > 10: 
    x -= 1 

И

def foo(x): 
    print("The value of x is", x) 

В отличие от JavaScript, например, где почти все является выражением (и имеет значение), вы не сделать это:

my_function = def foo(x): print("The value of x is", x) 

В предыдущем def заявление создаст af unction по имени foo, но сама инструкция не имеет значения. Однако имя foo будет ссылаться на значение. Это означает, что когда вы пишете foo, значение будет вещь, и эта вещь является функцией!

Выражение x() с другой стороны будет делать два вещей. Сначала он будет искать значение идентификатора x.Надеемся, что это значение является функцией. После этого скобки означают, что значение будет под названием. Что произойдет, если x не является функцией, то?

>>> x = 10 
>>> x() 
Traceback (most recent call last): 
    File "<ipython-input-3-7354d77c61ac>", line 1, in <module> 
    x() 
TypeError: 'int' object is not callable 

Big Fat Error: 10 не является «вызываемым». Callable означает что-то, что можно назвать функцией.

Скобки, как вы, вероятно, знаете, список аргументов. В этом случае список просто пуст, поэтому, когда вы пишете x(), вы говорите: «Назовите любое имя« x », но не отправляйте какие-либо аргументы».

Вызов функции всегда имеет значение, так как это выражение. Если вы явно не вернете ничего, значение будет просто None.

Чтобы ответить на ваш вопрос, наконец, давайте сыграем в игру замещения. Правила просты, любое выражение можно заменить его значением:

def value(): 
    resp = requests.get('http://www.google.com').elapsed.total_seconds() 
    return resp 

Это заявление, так что это не имеет значения. Однако функция создается с именем value.

Функция состоит из двух операторов (без значения, снова), назначения переменной и оператора возврата.

Вещь, расположенная справа от =, является выражением. Краткая история:

  • requests ссылается на модуль запросов
  • get ссылается на модуль глобального функции в описанном выше модуле
  • get('...') называет эту функцию, и что-то возвращается.
  • «Что-то» имеет свойство, называемое elapsed, которое имеет свойство под названием total_seconds.
  • total_seconds - это идентификатор, который ссылается на вызываемый. Вызываемый вызывается без каких-либо аргументов (total_seconds()) и что-то возвращается. Вероятно, число, основанное на имени. Скажем, его значение всегда 10, для простоты.

Следующее утверждение другое назначение:

test = value() 

Это можно рассматривать как «пусть название„тест“относится к значению, возвращенному вызываемая идентифицируется именем„значение“ когда он вызывается с пустым списком аргументов ". В нашем случае будет вызван объект функции, называемый value, resp будет присвоен значение 10, тогда оператор return позволит вызывающему абоненту знать, что этот вызов отправляет значение 10 назад. Название test будет ссылаться на значение 10, с этого момента.

Давайте пройдемся по петле, быстро:

while True: 
    print test 
    time.sleep(10) 

Проделайте следующий до конца недели:

  • print (! Заявление в Python 2, выражение в Python 3) имеет побочный эффект печати материала на экран. В противном случае это не делает много.
  • Материал, в данном случае, независимо от значения выражения test. Мы уже знаем, что идентификатор test имеет значение 10. Он просто напечатает «10» на экране.
  • Сон на десять секунд.
  • Повторите.

Возможно, вы хотите вызвать некоторую функцию на каждой итерации цикла («invoke» в основном латинский для «вызова», мне нравятся причудливые слова). В противном случае программа будет снова печатать «10», «10», «10», снова и снова. Чтобы это исправить это, вы должны сначала изменить выражение оцененное как часть print заявления от всего идентификатора (test) для вызова функции:

print test() 

Но это, как мы видели ранее, приподнять Большой Ошибка Fat с 10 не является вызываемой функцией. Чтобы исправить это (это то, что делают программисты, верно?), Вам также необходимо изменить значение test с 10, так как оно не является вызываемым, для функции. Функция может называться просто по имени, так что просто изменить эту строку:

test = value() # equals ten 

Для этого:

test = value # equals the function called "value" 

Функция теперь имеет два названия, старое название «ценность», а новое имя "test". Каждый шаг в цикле снова запросит страницу и возвращает новое время, необходимое для завершения запроса. Если запрос истечет, у вас будет другой вид сбоя, но это уже другая история.

Дополнительную информацию можно найти в Python Language Reference.

3

test = value() не сохраняет функцию, которая хранит результаты. Вы должны просто позвонить value() в свой цикл или если вы хотите назначить функцию, это будет test = value, а затем test() в вашем цикле.

1

test = value() вызывает функцию и сохраняет возвращаемое значение. Он не сохраняет функцию. test = value сохранит функцию, но вам нужно позвонить print test().

def value(): 
     resp = requests.get('http://www.google.com').elapsed.total_seconds() 
     return resp 

test = value 

while True: 
     print test() 
     time.sleep(10)