有没有办法让函数(我想到的那种函数都是像我写的简单函数一样,可以生成从0到某个点的斐波那契数列,或是在两个点之间的所有质数)无限运行。比如说,直到我按下某个按键或者时间过去之前,而不是直到一个数字达到某个点为止?
此外,如果基于时间,则是否有任何方法可以延长时间并从那个点重新开始,而不必从0开始重新启动?我知道有一个时间模块,我只是不太了解它。
有没有办法让函数(我想到的那种函数都是像我写的简单函数一样,可以生成从0到某个点的斐波那契数列,或是在两个点之间的所有质数)无限运行。比如说,直到我按下某个按键或者时间过去之前,而不是直到一个数字达到某个点为止?
此外,如果基于时间,则是否有任何方法可以延长时间并从那个点重新开始,而不必从0开始重新启动?我知道有一个时间模块,我只是不太了解它。
最简单的方法只是编写一个带有无限循环的程序,然后按下“控制-C”来停止它。没有更多的描述,很难知道这是否适合你。
如果您按时间进行操作,则不需要发电机。您可以暂停等待用户输入,例如“继续?【是/否】”,从标准输入读取,根据您获得的结果退出循环或不退出。
如果您真的希望您的功能运行,并仍然希望用户(或系统)输入,您有两个解决方案:
这将取决于交互的精细程度。如果你只是想中断函数而不关心退出,那么多进程是可以的。
在这两种情况下,您可以依赖于一些共享资源(文件或多线程共享内存,具有关联互斥锁的变量),并在您的函数中定期检查该资源的状态。如果它已经设置好告诉您退出,那就直接停止吧。
多线程的例子:
from threading import Thread, Lock
from time import sleep
class MyFct(Thread):
def __init__(self):
Thread.__init__(self)
self.mutex = Lock()
self._quit = False
def stopped(self):
self.mutex.acquire()
val = self._quit
self.mutex.release()
return val
def stop(self):
self.mutex.acquire()
self._quit = True
self.mutex.release()
def run(self):
i = 1
j = 1
print i
print j
while True:
if self.stopped():
return
i,j = j,i+j
print j
def main_fct():
t = MyFct()
t.start()
sleep(1)
t.stop()
t.join()
print "Exited"
if __name__ == "__main__":
main_fct()
你可以使用发电机完成这个任务:
def finished():
"Define your exit condition here"
return ...
def count(i=0):
while not finished():
yield i
i += 1
for i in count():
print i
如果您想更改结束条件,可以将一个值传回生成器函数中,并使用该值确定何时退出。
就像几乎所有语言一样:
while True:
# check what you want and eventually break
print nextValue()
你问题的第二部分更有趣:
此外,如果基于时间,则是否有任何方法我可以仅延长时间并从该点开始再次启动,而无需从0开始重新启动。
您可以在函数nextValue()
中使用yield
代替return
。
如果您使用子线程来运行函数,而主线程等待字符输入,则应该可以工作。只要记得有些东西停止子线程(在下面的示例中为全局runthread)。
例如:
import threading, time
runthread = 1
def myfun():
while runthread:
print "A"
time.sleep(.1)
t = threading.Thread(target=myfun)
t.start()
raw_input("")
runthread = 0
t.join()
这就是那样
如果您想基于时间退出,可以使用信号模块的alarm(time)功能,并捕获SIGALRM-以下是示例:http://docs.python.org/library/signal.html#example
你可以通过捕获 KeyboardInterrupt 来允许用户以正常的方式中断程序。只需要从主循环之外捕获 KeyboardInterrupt 异常,并执行任何需要的清理操作即可。
如果您想後續繼續之前停止的操作,您需要添加持續性。我會把一個數據結構用pickle存儲到磁盤上,這樣您可以讀取它以繼續操作。
我从未尝试过这样的事情,但你可以尝试使用类似memoizing的技术,并将其缓存到磁盘中。
您可以像这样做一些事情,在 1 秒钟内生成斐波那契数,然后停止。
fibonnacci = [1,1]
stoptime = time.time() + 1 # set stop time to 1 second in the future
while time.time() < stoptime:
fibonnacci.append(fibonnacci[-1]+fibonnacci[-2])
print "Generated %s numbers, the last one was %s." % (len(fibonnacci),fibonnacci[-1])
我不确定在每个循环中调用 time.time() 有多有效 - 根据你在循环中执行的操作,它可能会大大降低性能。