如何在运行时修改函数参数?
我还是个初学者,正在使用Python 2.7。我想让一些定义的参数可以随时改变,这样我就可以在运行时控制暂停和字符串输出。这可能吗?我看了一些讨论,但似乎更多的是关于同时执行两个任务。我想要的是在运行过程中这两个任务之间能够进行交流。
def writeAndPause(stringToWrite,pauseSeconds)
while True:
print stringToWrite
sleep(pauseSeconds)
任何解决方案或文档链接都非常感谢。谢谢你的时间!/Karl
3 个回答
0
@Constantinius说得对:答案几乎肯定是重新设计你的代码,这样就不需要做一些复杂的事情。
我再介绍一种方法,纯粹是为了好玩。如果你真的想把那个while循环放在函数里面,你可以使用一个叫做Yield表达式。
比如:
def writeAndPause():
while True:
stringToWrite, pauseSeconds = yield
print stringToWrite
sleep(pauseSeconds)
可以这样使用:
# create the generator
writer = writeAndPause()
# start the generator
writer.next()
# resume execution and send new values into generator
writer.send(('start string', 10))
'start string'
# resume execution and send another set of new values into generator
writer.send(('new string', 20))
'new string'
现在你已经看到了,忘掉它,按照@Constantinius说的去做吧。
0
这对你有帮助吗?
这段代码利用了默认参数的特点,并且说明了列表并不是一个变量,而是一组引用。在我的代码中,实际上只有一个(简单来说就是这样)
from time import sleep,time
stringToWrite = [None]
pauseSeconds = [0]
def writeAndPause(stw = stringToWrite, pz = pauseSeconds, keep = [time()]):
if stw[0]:
print stw[0]
else:
print 'START'
print ' having waited ',time()-keep[0],'seconds, must wait',pz[0],'seconds'
keep[0] = time()
sleep(pz[0])
writeAndPause()
for a,b in (('first',1),('second',2.05),('third',3.4),('fourth',0.88),
('BANANA',0.2),('APPLE',1.5),
('PEAR',0.77),('CHERRY',4),
('ORANGE',0.1),('NUT',6),
('APRICOT',0.56),('PLUM',2.5)):
stringToWrite[0] = a
pauseSeconds[0] = b
writeAndPause()
结果
START
having waited 0.0310001373291 seconds, must wait 0 seconds
first
having waited 0.0320000648499 seconds, must wait 1 seconds
second
having waited 1.01600003242 seconds, must wait 2.05 seconds
third
having waited 2.15600013733 seconds, must wait 3.4 seconds
fourth
having waited 3.42100000381 seconds, must wait 0.88 seconds
BANANA
having waited 0.905999898911 seconds, must wait 0.2 seconds
APPLE
having waited 0.266000032425 seconds, must wait 1.5 seconds
PEAR
having waited 1.51499986649 seconds, must wait 0.77 seconds
CHERRY
having waited 0.796999931335 seconds, must wait 4 seconds
ORANGE
having waited 4.03200006485 seconds, must wait 0.1 seconds
NUT
having waited 0.140000104904 seconds, must wait 6 seconds
APRICOT
having waited 6.03099989891 seconds, must wait 0.56 seconds
PLUM
having waited 0.765000104904 seconds, must wait 2.5 seconds
3
线程是用来同时工作的。如果你重新设计一下你的代码,可能就能达到你想要的效果。可以考虑把你函数里的while
语句去掉,放到外面去:
def writeAndPause(stringToWrite,pauseSeconds)
print stringToWrite
sleep(pauseSeconds)
然后在某个地方调用这个函数:
while True:
stringToWrite, pauseSeconds = gatherSomeInformation()
writeAndPause(stringToWrite, pauseSeconds)