如何在运行时更改功能参数?

时间:2011-07-26 13:06:45

标签: python on-the-fly

我是初学者并使用Python 2.7。我想让定义参数可以改变,这样我就可以动态控制暂停和字符串输出。这可能吗?我已经阅读了一些线程,但它似乎更多的是同时执行两个任务。我想在运行时期间在两个任务之间进行通信。

    def writeAndPause(stringToWrite,pauseSeconds)
        while True:
            print stringToWrite
            sleep(pauseSeconds)

非常感谢任何解决方案或文档链接。谢谢你的时间! /卡尔

3 个答案:

答案 0 :(得分:3)

线程用于同时工作。我想如果你只是重新设计你的代码,你将获得你想要的效果。考虑从函数中删除while子句并将其放在外面:

def writeAndPause(stringToWrite,pauseSeconds)
    print stringToWrite
    sleep(pauseSeconds)

在某个地方你称之为这个功能:

while True:
    stringToWrite, pauseSeconds = gatherSomeInformation()
    writeAndPause(stringToWrite, pauseSeconds)

答案 1 :(得分:0)

@Constantinius是对的:答案几乎可以肯定是重新设计你的代码所以你不需要做一些深奥的事情。

我将描述另一种纯粹为了娱乐而做的方式。如果你真的想在函数内部保持while循环,可以使用Yield Expression

例如:

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说的话。

答案 2 :(得分: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