Завершение скрипта Python

Похоже, вы пытаетесь реализовать сортировку кучи. Вам фактически не нужно «удалять» первый элемент кучи или даже последний.

Вместо этого алгоритм должен скопировать значения из первого элемента (элемент с наивысшим приоритет) для вывода, а затем для копирования узла из «конца» массива в первую позицию при подготовке к его пузырьку в правильное положение. «End» массива обозначается текущим значением heap_size.

Чтобы «удалить» последний элемент массива, просто уменьшите heap_size на 1.

Я смутно помню, что свертывание происходит путем проверки приоритетов детей на движущемся элементе, а затем замены его на тот, который имеет наивысший приоритет. Повторите это на перемещенном элементе до тех пор, пока элемент не станет равным или более высоким приоритетом для своих детей.

Трюк для поиска детей элемента легко: они являются узлами в 2 * i и 2 * i +1, где массив начинается с 1 вместо 0. (Будет ли это 2 * (i + 1) -1 и 2 * (1 + 1) для массивов на основе 0? Проверьте мою математику, пожалуйста. элемент массива, чтобы математика была простой.)

910
задан Lightness Races in Orbit 2 April 2016 в 02:21
поделиться

5 ответов

import sys
sys.exit()

детали от sys документация модуля :

sys.exit([arg])

Выход из Python. Это реализовано путем повышения SystemExit исключение, таким образом, действия очистки, определенные наконец пунктами try , операторы соблюдают, и возможно прервать попытку выхода внешнего уровня.

аргумент дополнительного аргумента может быть целым числом, дающим статус выхода (принимающий значение по умолчанию для обнуления), или другой тип объекта. Если это - целое число, нуль считают “successful termination”, и любое ненулевое значение считают “abnormal termination” оболочки и т.п.. Большинство систем требует, чтобы он был в диапазоне 0-127 и привел к неопределенным результатам иначе. Некоторые системы имеют соглашение для присвоения определенных значений к определенным кодам выхода, но они вообще слаборазвиты; программы Unix обычно используют 2 для ошибок синтаксиса командной строки и 1 для всего другого вида ошибок. Если другой тип объекта передается, Ни один не эквивалентен передаче нуля, и любой другой объект печатается к [1 111] stderr и приводит к коду выхода 1. В частности, sys.exit("some error message") быстрый способ выйти из программы, когда ошибка происходит.

С тех пор exit() в конечном счете “only” повышает исключение, он только выйдет из процесса, когда названо от основного потока, и исключение не прерывается.

Примечание, из которого это - 'хороший' способ выйти. glyphtwistedmatrix ниже указывает, что, если Вы хотите 'твердый выход', можно использовать OS. _ выход ( errorcode), хотя это является, вероятно, определенным для OS в некоторой степени (это не могло бы взять errorcode под окнами, например), и это определенно является менее дружественным, так как это не позволяет интерпретатору сделать любую очистку, прежде чем процесс умрет.

1236
ответ дан Community 2 April 2016 в 02:21
поделиться
from sys import exit
exit()

В качестве параметра можно передать код выхода, который будет возвращен к ОС. Значение по умолчанию 0.

26
ответ дан larsks 2 April 2016 в 02:21
поделиться

Иначе:

raise SystemExit
110
ответ дан Jérôme Verstrynge 2 April 2016 в 02:21
поделиться

В то время как необходимо обычно предпочитать sys.exit, потому что это является более "дружественным" по отношению к другому коду, все, что это на самом деле делает повысить исключение.

, Если Вы уверены, что необходимо сразу выйти из процесса, и Вы могли бы быть в некотором обработчике исключений, который поймает SystemExit, существует другая функция - os._exit - который сразу завершается на уровне C и не выполняет ни одного нормального разрушения интерпретатора; например, рычаги, зарегистрированные в "atexit" модуле, не выполняются.

62
ответ дан Glyph 2 April 2016 в 02:21
поделиться
  • 1
    Ха-ха да, это - хороший пример надлежащего выхода. Хорошее Переполнение стека задания!:) – Jason 23 October 2009 в 14:12

Существует несколько стандартных способов сделать это:

import sys
sys.exit(404)

# or...
exit(404)

# or...
quit(404)

# or...
raise SystemExit(404)

я был неудовлетворен, что (по телефону repl.it , по крайней мере) ни один из этих полностью не закрыл интерпретатор; это могло всегда выполнять код в repl, даже после exit, и т.д. единственный способ, которым я мог думать, это всегда мешает интерпретатору продолжиться, путем моделирования системного выхода путем сна довольно долго, что, кто бы ни использует его, выйдет, перезапустит его, или некоторая другая предосторожность.

import time
def forceStop(errmsg="emergency stop deployed. :("):
    print(f"\033[31m{errmsg}\033[0m")
    time.sleep(10000000)

Это, очевидно, не рекомендуется.

0
ответ дан 19 December 2019 в 20:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: