题
是否有任何方法来做一个功能(那些我想是的风格,简单的那些我已经由其产生的fibonnacci序列从0到一点,所有素的两点之间)的运行下去。E.g。直到我按一定的关键或至时间已经过去,而不是直到一个数量达到某一点?
此外,如果它依据的是时间,那么是否有任何方法我只能延长时间,并开始,它将从这一点再次,而不是具有重新开始从0?我知道有一个时间模块,我只是不知道很多关于它。
解决方案
最简单的方法就是编写一个带有无限循环的程序,然后点击control-C来停止它。没有更多描述,很难知道这是否适合你。
如果你这样做是基于时间的,你不需要发电机。您可以暂停用户输入,例如“继续? [y / n]",从stdin读取,并根据你得到的内容退出或不退出。
其他提示
您可以使用生成器:
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()
就是这样做
如果你真的想要你的功能运行,并仍然希望使用者(或系统)输入,有两个方案:
- 多线程
- 多进程的
这将取决于如何罚款的相互作用。如果你只想中断的功能并不关心的出口,那么多过程是好的。
在这两种情况下,你可以依赖于一些共有的资源(文件或共享内存的多线程,变量相关联的互斥的多线),并检查状态这一资源定期在你的功能。如果它被设定要告诉你退出,只要做到这一点。
例如在多线程:
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()
如果你想根据时间退出,你可以使用信号模块的闹钟(时间)功能,并抓住SIGALRM - 这是一个例子 http://docs.python.org/library/signal.html#example
您可以通过捕获KeyboardInterrupt让用户以理智的方式中断程序。只需从主循环外部捕获KeyboardInterrupt异常,然后进行任何清理。
如果您想在上次停止的地方继续,则必须添加一些排序持久性。我会挑选数据结构到磁盘,你可以回读继续运营。
我没有尝试过这样的事情,但你可以考虑使用记忆,并缓存到磁盘。
你可以做这样的事情来生成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()的效率如何 - 取决于你在循环中所做的事情,它最终可能会带走很多性能。