Если вы не можете использовать timeout
по какой-либо причине (одна из которых является слишком старой версией python), вот мое решение, которое работает с любой версией python:
subprocess
Я использую подпроцесс python, работающий с -u
(небуферизованный):
передатчик.py: (тестовая программа, которая печатает «hello xx» каждую 1/10-ю секунду)
blockquote>import time i=0 while True: print("hello {}".format(i)) i += 1 time.sleep(0.1)
самой программы (тайм-аут установлен на 1,5 секунды):
blockquote>import subprocess,threading,time def timeout(p,timeout): time.sleep(timeout) p.kill() p = subprocess.Popen(["python","-u","transmitter.py"],stdout=subprocess.PIPE,stderr=subprocess.STDOUT) t = threading.Thread(target=timeout,args=(p,1.5)) t.start() output = [] for line in p.stdout: output.append(line.decode()) t.join() print("".join(output))
В конце, после таймаута, программа печатает:
hello 0 hello 1 hello 2 hello 3 hello 4 hello 5 hello 6 hello 7 hello 8 hello 9 hello 10 hello 11 hello 12 hello 13 hello 14
Вы можете использовать сопоставление с образцом, чтобы проверить, является ли первый элемент в вашем списке четным, и если это так, добавить его в список аккумуляторов и вызвать тот же метод в остальной части списка. Если элемент нечетный - просто вызовите тот же метод для остальной части списка, не добавляя ничего к аккумулятору. Когда список пуст - верните аккумулятор, и у вас будет список только четных чисел.
let rec getEven (input : int list) (acc: int list) =
match input with
| head :: tail when head % 2 = 0 -> (getEven tail (head :: acc))
| head :: tail when head % 2 = 1 -> (getEven tail (acc))
| _ -> acc
let even = getEven [1..10] []
let sum = List.sum even
Приведенная выше функция даст:
val getEven : input:int list -> acc:int list -> int list
val even : int list = [10; 8; 6; 4; 2]
val sum : int = 30
P.S. чтобы вычислить сумму элементов, вы должны использовать List.sum
вместо List.length
, который вернет вам количество элементов в списке. Также обратите внимание, что вы можете вычислить сумму четных элементов в функции getEven, сохраняя не список четных элементов, а их сумму.