【问题标题】:how to terminate python script using while loop and get the result?如何使用while循环终止python脚本并获得结果?
【发布时间】:2019-11-06 12:53:56
【问题描述】:

我想生成 5 分钟的随机数。在那之后,我想知道最常见的数字。

我的问题是:

我不确定我需要多少时间。我可以在 1 分或 1 分 19 秒时手动终止脚本并获得结果吗?

我的代码如下:

import random
from collections import Counter
t_end = time.time() + 60*5
numbers = []
while time.time() < t_end:
    number=''.join(map(str, [random.randint(0,9)for value in range(0,4)]))
    numbers.append(number)

print(Counter(numbers))

【问题讨论】:

  • 为什么要使用时间段而不是迭代范围?
  • 你是想证明randint的分布是均匀的吗?
  • 测试分布的方法相当复杂。 numbers 增长约 150k 项/秒。这接近 50mio 项目 5 分钟。尝试用普通字典数数?奇怪的随机表达是故意的吗?仅使用 randint(0,9999) 速度快 4 倍...

标签: python random time while-loop


【解决方案1】:

有无数种选择:

  • 每隔 5 秒左右打印一个中间结果并使用 ctrl+C 中止脚本
  • 检查是否按下了空格或其他内容,如果是,则中止循环(参见here了解如何操作)
  • 收听signals 并进行相应处理(这也可以优雅地终止选项 1 的脚本)
  • 如果有停止信号进来,打开一个套接字并监听一个套接字
  • 使用 TKinter 或什么创建一个 gui 并添加一个停止按钮
  • ...

第一个是最简单但也是最快速和最脏的一个。对于第二个选项,以下脚本应该可以帮助您入门(您的脚本在添加空格和换行符后为我工作):

import keyboard
while True: 
    if keyboard.read_key() == "p": 
        print("You pressed p") 
        break

假设 python3 和 windows:请注意 keyboard 默认情况下不与 python 一起提供。您需要使用pip3 install keyboard 安装它。 Pip3.exe 可能不在您的路径上。 cd 到您安装 python 的位置并环顾四周。对我来说,它位于 Scripts 文件夹中(不过我的安装非常混乱)。

【讨论】:

  • 介意告诉我第一种方法吗?你能说明一下吗?我按了 ctrl+c 但没有任何结果。
  • 如果可能的话能告诉我第二种方法吗?我使用了以下代码,但我也无法得到结果 import keyboard while True: if keyboard.read_key() == "p": print("You press p") break
  • @pythonbeginner 更新了答案,您的脚本在添加换行符后为我工作。你安装包了吗?对于正确的 python 安装?第一个:我直接在控制台中运行脚本。如果您使用 IDE,应该有一个停止按钮或某个地方可以中止当前正在运行的脚本(ctrl+C 在控制台上没有更多功能)。
  • 嗨,我在控制台中运行脚本,是的,方法 1 有效
  • 对于方法2,我没有得到结果。这是我的代码: import random import keyboard from collections import Counter import time t_end = time.time() + 60*5 numbers = [] while time.time()
【解决方案2】:
import random
from collections import Counter
import time
t_end = time.time() + 60*5
numbers = []
while time.time() < t_end:
    number=''.join(map(str, [random.randint(0,9)for value in range(0,4)]))
    numbers.append(number)
    if time.time()==(t_end-60*4): # break a 1 min
        break
print(Counter(numbers))

【讨论】:

  • 嗨,我可以在 1 分或 1 分 19 秒时手动终止脚本并获得结果
  • 您确定中断条件可以正常工作吗? (time.time() 返回浮点数)
  • 它工作得很好,我试过了,它正好停在 1 分钟跨度
  • pythonbeginner,我上面写的代码1分钟自动停止,如果要手动中断,按Ctrl+C
  • 嗨 5x 小腿,我按 ctrl+C,我无法得到任何结果。我不确定时间。我可以终止脚本并在 49 秒或 5 秒时得到结果吗
【解决方案3】:

正如评论中已经提到的 luigigi,您可以简单地使用迭代次数作为限制,并使用 for 循环:

number_of_iterations = 10000

for i in range(number_of_iterations):
    place_your_function_here()

但是,如果您出于某种原因真的想使用时间,可以这样做:在 while 块的底部更新当前时间,并在 while 循环的继续条件下,将其与结束时间:

import datetime


delta_in_seconds = 60
finish = datetime.datetime.now() + datetime.timedelta(0, delta_in_seconds)
while time < finish:
    place_your_function_here()
    time = datetime.datetime.now()

【讨论】:

  • 我可以在 1 分或 1 分 19 秒时手动终止脚本并获得结果吗
猜你喜欢
  • 1970-01-01
  • 2022-07-18
  • 1970-01-01
  • 1970-01-01
  • 2015-09-12
  • 1970-01-01
  • 2018-06-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多