在 python 中充当参数
Function as argument in python
我需要将一些函数作为参数传递给另一个函数。所以,我想每秒将当前时间添加到 class 属性,例如
import time
class Measurement():
values = []
def add_value(self, value):
print "added value"
self.values.append(value)
def smart_delay(input_function,args):
start_time = time.time()
while 5 > (time.time() - start_time):
print "Calling function"
input_function(args)
time.sleep(1)
measurement = Measurement()
smart_delay(measurement.add_value,time.time())
好的,但是在检查 measurement.values 的内容后,我明白了
[1425980407.173, 1425980407.173, 1425980407.173, 1425980407.173]
- 所以值是一样的!!!
发生了什么?以及如何获得正确的值?
更新:
实际上,这个问题是关于允许调用某个函数的方式,作为参数传递给另一个函数。你怎么看这个:
import time
class Measurement():
values = []
def add_value(self, value):
print "added value"
self.values.append(value)
def smart_delay(input_function):
start_time = time.time()
while 5 > (time.time() - start_time):
print "Calling function"
input_function()
time.sleep(1)
measurement = Measurement()
smart_delay(lambda: measurement.add_value(time.time()))
您对 time.time()
的调用在对 smart_delay(...)
的调用之前执行,因此 smart_delay(measurement.addvalue, time.time())
将首先从 time.time()
获取 return 值并将其传递转发到 smart_delay
.
您需要传递 time.time
函数本身,并在 smart_delay
方法内部调用它,而不是传递它的 return 值:
import time
class Measurement():
values = []
def add_value(self, value):
print "added value"
self.values.append(value)
def smart_delay(output_f, input_f):
start_time = time.time()
while 5 > (time.time() - start_time):
print "Calling function"
output_f(input_f())
time.sleep(1)
measurement = Measurement()
smart_delay(measurement.add_value, time.time)
请注意,这不是您正在做的事情的最佳方式,但它确实有效。
这是我的做法:
import time
# Why do you need a measurement class which only acts as a list anyways?
my_measurements = []
def repeat(duration, function, args=(), kwargs={}, interval=1):
"""Repeat a function call for the given duration."""
start_time = time.time()
while duration > time.time() - start_time:
function(*args, **kwargs)
time.sleep(interval)
def add_time_measurement(measurements):
measurements.append(time.time())
repeat(5, add_time_measurement, (my_measurements,))
如果你想要一些照片,你可以在 add_time_measurement
函数中添加它们。
我需要将一些函数作为参数传递给另一个函数。所以,我想每秒将当前时间添加到 class 属性,例如
import time
class Measurement():
values = []
def add_value(self, value):
print "added value"
self.values.append(value)
def smart_delay(input_function,args):
start_time = time.time()
while 5 > (time.time() - start_time):
print "Calling function"
input_function(args)
time.sleep(1)
measurement = Measurement()
smart_delay(measurement.add_value,time.time())
好的,但是在检查 measurement.values 的内容后,我明白了
[1425980407.173, 1425980407.173, 1425980407.173, 1425980407.173]
- 所以值是一样的!!!
发生了什么?以及如何获得正确的值?
更新:
实际上,这个问题是关于允许调用某个函数的方式,作为参数传递给另一个函数。你怎么看这个:
import time
class Measurement():
values = []
def add_value(self, value):
print "added value"
self.values.append(value)
def smart_delay(input_function):
start_time = time.time()
while 5 > (time.time() - start_time):
print "Calling function"
input_function()
time.sleep(1)
measurement = Measurement()
smart_delay(lambda: measurement.add_value(time.time()))
您对 time.time()
的调用在对 smart_delay(...)
的调用之前执行,因此 smart_delay(measurement.addvalue, time.time())
将首先从 time.time()
获取 return 值并将其传递转发到 smart_delay
.
您需要传递 time.time
函数本身,并在 smart_delay
方法内部调用它,而不是传递它的 return 值:
import time
class Measurement():
values = []
def add_value(self, value):
print "added value"
self.values.append(value)
def smart_delay(output_f, input_f):
start_time = time.time()
while 5 > (time.time() - start_time):
print "Calling function"
output_f(input_f())
time.sleep(1)
measurement = Measurement()
smart_delay(measurement.add_value, time.time)
请注意,这不是您正在做的事情的最佳方式,但它确实有效。
这是我的做法:
import time
# Why do you need a measurement class which only acts as a list anyways?
my_measurements = []
def repeat(duration, function, args=(), kwargs={}, interval=1):
"""Repeat a function call for the given duration."""
start_time = time.time()
while duration > time.time() - start_time:
function(*args, **kwargs)
time.sleep(interval)
def add_time_measurement(measurements):
measurements.append(time.time())
repeat(5, add_time_measurement, (my_measurements,))
如果你想要一些照片,你可以在 add_time_measurement
函数中添加它们。