Оператор GOTO в Python


Python-сообщество

Уведомления

#1 Окт. 6, 2010 12:52:15

что-то типа go to

блин вот помню была такая тема где то, обсуждали что-то подобное функции go to(как в делфи например), но на питоне
Вообщем имею код.

#2 Окт. 6, 2010 13:24:55

что-то типа go to

hsbc
блин вот помню была такая тема где то, обсуждали что-то подобное функции go to(как в делфи например), но на питоне
Вообщем имею код…
…программка принимает 2 числа, число и степень. Все ок пашет, но как в конце вернуться в начало самой программы?
Пытался найти по поиску ту тему, но так и не нашел.

Насколько я знаю goto В питоне нет.
Можете посмотреть тут
Пишут что работает(Сам не проверял), хотя использование и не рекомендуеться

ЗЫ: Но в целом не понятно зачем goto
Можно как-то так:

#3 Окт. 6, 2010 18:24:23

что-то типа go to

pill
Пишут что работает(Сам не проверял), хотя использование и не рекомендуеться

#4 Окт. 6, 2010 19:01:19

что-то типа go to

Сначала спрашиваешь у гуру “Как использовать goto?” — тебе отвечают “Не используй”.
Потом узнаёшь что есть множество способов сделать это без goto.
Потом узнаёшь много случаев где goto удобнее других способов.
Потом к тебе подходят и спрашивают “Как использовать goto?”. Ты немного подумав отвечаешь: “Не используй”.

#5 Окт. 6, 2010 21:27:21

что-то типа go to

спасибо всем, разобрался.
Бывают провалы в памяти блин)

Сначала спрашиваешь у гуру “Как использовать goto?” — тебе отвечают “Не используй”.
Потом узнаёшь что есть множество способов сделать это без goto.
Потом узнаёшь много случаев где goto удобнее других способов.
Потом к тебе подходят и спрашивают “Как использовать goto?”. Ты немного подумав отвечаешь: “Не используй”.

Python — блок Pythonizing C ++ с оператором goto

Я Pythonising кода C ++, и я столкнулся с ситуацией, в которой я как бы застрял. Программист использовал операторы goto для реализации своей логики, и поскольку в Python нет оператора goto, и, поскольку я предпочел бы не вникать в его забавные реализации goto, мне было интересно, сможем ли мы каким-то образом Pythonize следующий блок:

У него есть ярлык «Прыжок», на который он идет. Как мы можем Pythonize этот? Так как мы уже находимся в цикле for, я немного стесняюсь вводить больше циклов.

РЕДАКТИРОВАТЬ: Благодаря авторам было предложено следующее, однако это застревает в бесконечном цикле:

Решение

Код C ++ нуждается в доработке: goto увеличение индекса и индекса эквивалентно continue инструкция (ты почти никогда необходимость goto в программе на C / C ++, и определенно не здесь, исходный код C ++, который «эмулирует» continue потому что автор не знал, что он существует)

Обратите внимание, что теперь вам не нужно вручную увеличивать индекс, так как continue переходит к следующей итерации, вызывая ++j вашей петли.

(Другая проблема приращения + перехода заключается в том, что если особый случай происходит в конце массива, то вы можете читать за пределами массива: неопределенное поведение)

Теперь вы можете перенести это прямо в Python: у вас есть 2 варианта:

Либо вы идете с индексами (как ваш код C ++)

или просто перебрать элементы (более питонические, потому что не используют индексы):

В обоих случаях for цикл контролирует итерацию. Вы просто говорите Python, чтобы перейти к следующей итерации с continue так же, как в «новом» коде C ++.

Другие решения


Поскольку всем переходам, кажется, предшествует j ++, а переход является началом цикла, может показаться, что оператор продолжения Python решит вашу проблему довольно легко?

Лично я бы просто инвертировал оператор if и условно выполнил бы нижнюю половину кода следующим образом:

Конечно.
Я бы предложил это.

Поскольку я не знаю остальную часть кода, я не могу быть очень точным.
Пожалуйста, сообщите мне, если возникнет какая-либо ошибка.

Оператор GOTO в Python

Are you a professional Visual Studio developer?

Entrian Source Search is a powerful search addin for Visual Studio.

It displays syntax colored search results within a fraction of a second, whether you’re working with hundreds of lines of code or millions.

It’s the fastest and easiest way to navigate your source code.


The «goto» module was an April Fool’s joke, published on 1st April 2004. Yes, it works, but it’s a joke nevertheless. Please don’t use it in real code!

goto for Python

Adds the ‘goto’ and ‘comefrom’ keywords to Python.

The ‘goto’ and ‘comefrom’ keywords add flexibility to Python’s control flow mechanisms, and allow Python programmers to use many common control flow idioms that were previously denied to them. Some examples are given below.

To enable the new keywords, add the following line to the top of your code:

goto

‘goto’ jumps the program execution directly to another line of code. The target line must be identified using a ‘label’ statement. Labels are defined using the ‘label’ keyword, and have names which are arbitrary Python identifiers prefixed with a single dot, like this:

To jump to a label, use the ‘goto’ keyword like this:

Computed goto

You can use a computed goto by assigning the name of the label to a variable at runtime and referencing it using an asterisk like this:

The value of ‘x’ should not include the leading dot. See Example 5 below for a full example.

comefrom

‘comefrom’ is the opposite of ‘goto’. It allows a piece of code to say «Whenever label X is reached, jump to here instead.» For example:

Here, «code 2» will not run — execution will jump directly from the «label .somewhere» line to the «comefrom .somewhere» line. ‘comefrom’ is typically used as a debugging aid — its use in production code is discouraged since it can lead to surprising behaviour.

Restrictions

There are some classes of goto and comefrom which would be unpythonic, and hence there are some restrictions on where jumps can go:

  • No jumping between modules or functions
  • No jumping into the middle of a loop or a ‘finally’ clause
  • No jumping onto an ‘except’ line (because there is no exception)

Examples

Here are some examples of how goto and comefrom can be used:

This module is released under the Python Software Foundation license, which can be found at https://www.python.org/ It requires Python 2.3 or later.

Version 1.0, released 1st April 2004. Download here.

циклы Есть ли метка/goto в Python?


циклы python (12)

Есть ли goto или любой эквивалент в Python, чтобы иметь возможность перейти к определенной строке кода?

вы можете использовать пользовательские исключения для эмуляции goto

Мастер Йода рекомендует:  Основы создания баз данных MySQL

Я хотел получить тот же ответ, и я не хотел использовать goto . Таким образом, я использовал следующий пример (из учебного плана)

Нет, Python не поддерживает метки и goto, если это то, что вам нужно. Это (высоко) структурированный язык программирования.

Python предлагает вам возможность выполнять некоторые из вещей, которые вы можете сделать с помощью goto, используя функции первого класса. Например:

Может быть сделано в python следующим образом:

Конечно, это не лучший способ заменить goto. Но, не зная точно, что вы пытаетесь сделать с goto, трудно дать конкретные советы.

Лучше всего либо заключить его в функцию, либо использовать исключение. Для функции:

Использование исключений для подобных действий может показаться немного неудобным, если вы придете с другого языка программирования. Но я бы сказал, что если вам не нравится использование исключений, Python не является для вас языком. 🙂

Ярлыки для break и continue были предложены в PEP 3136 еще в 2007 году, но были отклонены. Раздел Motivation предложения иллюстрирует несколько общих (если неэлегантных) методов имитации помеченного break в Python.

Вы можете использовать исключения для предоставления «структурированного goto», который даже работает во всех вызовах функций. Многие считают, что исключения могут легко эмулировать все разумные применения конструкций «go» или «goto» языка C, Fortran и других языков. Например:

Это не позволяет вам прыгать в середину цикла, но в любом случае это обычно считается злоупотреблением goto. Используйте экономно.

Очень приятно, что это даже упоминается в официальном FAQ, и что предоставляется хороший образец решения. Мне очень нравится python, потому что его сообщество рассматривает даже goto как это;)

В инструкции Python goto поддерживается goto . и label . . Для получения дополнительной информации перейдите по этой ссылке .

Обычно во всей планете люди рекомендуют избегать использования инструкции goto. Но обработка отказа в функции может быть хорошо обработана только с помощью инструкции goto. Даже я не предпочитаю использовать goto, кроме обработчика ошибок.

У меня есть собственный способ сделать gotos. Я использую отдельные скрипты python.

file1.py

file2.py

file3.py

( ПРИМЕЧАНИЕ. Этот метод работает только в версиях Python 2.x)

Технически возможно добавить некоторую работу ‘goto’ на python с некоторой работой. Мы будем использовать модули «dis» и «new», которые очень полезны для сканирования и изменения байтового кода python.

Основная идея реализации заключается в том, чтобы сначала отметить блок кода с использованием операторов «goto» и «label». Специальный декоратор «@goto» будет использоваться для обозначения функций «goto». Затем мы сканируем этот код для этих двух операторов и применяем необходимые изменения к базовому байтовому коду. Это происходит во время компиляции исходного кода.

Надеюсь, это ответит на вопрос.

Я думаю, что это может быть полезно для того, что вы ищете.

Примечание. Это было предложено в качестве шутки апрельского дурака. (работает хотя)

Разумеется. Да, это смешно, но DONT его использовать.

Чтобы ответить на ascobol @bobince используя предложение @bobince из комментариев:

Отступ для блока else правильный. Код использует неясное else после синтаксиса Python цикла. См. Почему python использует «else» после циклов while и while?

Эквивалент GOTO в python

Я сам учу себя python 2.7. У меня есть некоторый опыт использования BATCH, который имеет инструкцию GOTO. Как это сделать в python? Например, предположим, что я хочу перейти от строки 5 к строке 18.

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


6 Solutions collect form web for “Эквивалент GOTO в python”

Goto ‘s повсеместно оскорблены в области информатики и программирования, поскольку они приводят к очень неструктурированному коду.

Python (как и почти каждый язык программирования сегодня) поддерживает структурированное программирование, которое управляет потоком, используя if / then / else, loop и подпрограммы.

Ключ к мышлению структурированным образом заключается в том, чтобы понять, как и почему вы разветвляетесь по коду.

Например, давайте притвориться, что у Python был goto и соответствующий goto label содрогнулся . Посмотрите на следующий код. В нем, если число больше или равно 0, мы печатаем, если оно

Если мы хотим знать, когда выполняется кусок кода, нам нужно тщательно отслеживать программу и изучать, как был получен ярлык – что-то, что действительно невозможно сделать.

Например, мы можем переписать вышеописанное как:

Здесь есть два возможных способа достижения «конца», и мы не можем знать, какой из них был выбран. По мере того, как программы становятся большими, эта проблема становится все хуже и приводит к коду спагетти

Для сравнения ниже вы можете написать эту программу в Python:

Я могу посмотреть на определенную строку кода и узнать, в каких условиях это выполняется, отслеживая дерево if/then/else он находится. Например, я знаю, что строка print «odd» будет запущена, когда a ((number >= 0) == True) and ((number % 2 == 0) == False) .

Простите меня – я не удержался ��

Я полностью согласен с тем, что goto – плохое кодирование, но никто не ответил на этот вопрос. На самом деле есть модуль goto для Python (хотя он был выпущен как шутка в апреле и не рекомендуется использовать, он работает).

На языке программирования Python нет инструкции goto . Вам придется писать свой код структурированным способом … Но на самом деле, почему вы хотите использовать goto ? это считалось вредным на протяжении десятилетий, и любая программа, о которой вы можете думать, может быть написана без использования goto .

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

Отказ от ответственности: я подвергался воздействию значительного количества F77

Современный эквивалент goto (спорный, только мое мнение и т. Д.) – это явная обработка исключений:

Отредактировано для лучшего улучшения повторного использования кода.

Представьте псевдокод в поддельном языке на языке python с goto :

По сравнению с python:

Явные именованные исключения – это значительно лучший способ справиться с нелинейным условным разветвлением.

Дала бы вам то, чего вы хотите, без инструкции goto.

`goto` в Python

Я должен использовать goto в Python. Я нашел entrians goto , но моя реализация Python (CPython 2.7.1 на Mac) не имеет этого модуля, поэтому он не выглядит портативным. Он должен, по крайней мере, работать во всех реализациях Python, которые поддерживают байт-код CPython (особенно, я забочусь о CPython и PyPy). Затем есть this related question и cdjc’s goto . И те, которые даны ниже.

Я мог бы запустить и создать байт-код вручную (т. Е. Написать свой собственный компилятор Python), потому что есть такая инструкция ( JUMP_ABSOLUTE и друзья). Но мне интересно, есть ли более простой способ. Возможно ли через inspect вызывать одну инструкцию по байт-коду? Я также думал о компиляции через Python, а затем автоматически исправлял сгенерированный байт-код Python.

Конечно, люди будут спрашивать, почему и не дать мне полезный ответ, если я не объяснить, почему я действительно это нужно. Короче говоря, мой вариант использования: я переводил C AST в Python AST и компилировал это. Я могу сопоставить каждый логический поток (все циклы и другие вещи) каким-то образом с эквивалентным кодом Python. Все, кроме goto . Связанные проекты: PyCParser (см. interpreter.py ), , PyLua.

Создан 05 авг. 11 2011-08-05 16:15:56 Albert

Перевод C на Python? WTF. Просто . зачем, черт возьми, нужно это и как это может быть когда-нибудь практично? (По правде говоря, это звучит очень забавная задача.) Кроме того, знаете ли вы, что этот модуль — шутка шутов априола и работает только при проверке исходного кода и выполнении хакерства, который я бы не считал малейшим битом портативным? – delnan 05 авг. 11 2011-08-05 16:20:08

Мастер Йода рекомендует:  Обучение без учителя 4 метода кластеризации данных на Python

+1 для объяснения причин, почему вы считаете нужным «перейти». – SingleNegationElimination 05 авг. 11 2011-08-05 16:21:51

@ delnan: Ну, забавный фактор действительно является одной из основных причин. 🙂 В противном случае, я думаю, в некоторых случаях было бы полезно использовать что-то вроде Python или Lua. И для отладки кода C вообще. С помощью компиляции PyPy JIT это может быть и не так медленно. – Albert 05 авг. 11 2011-08-05 16:24:59

Я не думаю, что то, что вы пытаетесь достичь, не нарушит так или иначе счет ссылок на объекты python. – BatchyX 05 авг. 11 2011-08-05 16:26:49

@Paolo: Ой, мой мозг! – kindall 05 авг. 11 2011-08-05 16:39:36

@Paolo: Да, выглядит точно, что я искал (что я имел в виду, исправляя байт-код)! Просто положите это на ответ. 🙂 Работает как с CPython, так и с PyPy. – Albert 05 авг. 11 2011-08-05 16:58:41


6 ответов

Я знаю, о чем думает каждый:

Тем не менее, могут быть некоторые дидактические случаи, когда вы на самом деле нужно goto .

Этот рецепт python предоставляет команду goto в качестве декоратора функции.

Это рецепт для вас, если вы устали от медленной скорости модуля https://entrian.com/goto/ в существующих goto . goto в этом рецепте примерно в 60 раз быстрее и также является более чистым (злоупотребление sys.settrace кажется едва ли питоническим). Поскольку это декоратор, он предупреждает читателя , который использует функции goto . Он не реализует команду , хотя для этого нетрудно ее расширить (упражнение для читателя). Кроме того, вычисляемые gotos не поддерживаются; они не pythonic.

  • Используйте dis.dis(fn) , чтобы отобразить функцию байт-кода.
  • Доступ к байт-кодам функции осуществляется с помощью fn.func_code.co_code . Это верно только так:
  • Декорированная функция создается точно так же, как и старая, , но с байт-кодом, обновленным для выполнения команд goto .
  • Это 2.x; новый модуль не в питона 3.x (другой упражнение для читателя!)

Использование

Update

Here’re две дополнительные реализации, совместимые с Python 3:

Создан 05 авг. 11 2011-08-05 17:20:29 Paolo Moretti

Забавно, что автор рецепта рассматривает «pythonicity» («злоупотребление sys.settrace кажется едва ли pythonic») при реализации goto 🙂 В любом случае, отличный ответ! – brandizzi 05 авг. 11 2011-08-05 18:05:36

Возможно, у вас есть единственный действительный прецедент, который я когда-либо видел, для использования goto в Python. 🙂

Самый простой способ эмулировать вперед goto в Python использует исключения, поскольку они могут выпрыгивать из любой глубины вложенных структур управления.

Это получает волосатые, если вам необходимо поддерживать более одного адресата, но я думаю, что это может быть сделано с помощью вложенной try/except структуры и многочисленные классы исключения, по одному для каждого пункта назначения. Поскольку C ограничивает goto объему одной функции, по крайней мере вам не придется беспокоиться о том, как сделать эту работу через функции. 🙂 Конечно, он не работает для обратного goto s.

Следует отметить, что исключения в Python, хотя и быстрые по сравнению с некоторыми языками, все еще медленнее, чем обычные структуры управления потоком, такие как while и for .

Это может быть большая работа (хотя, возможно, не более, чем у вас уже есть), но если вы могли бы генерировать байт-код Python, а не источник Python, у вас не возникло бы проблемы с реализацией goto , поскольку байт-код Python (например, большинство psuedo-machine-languages) имеет превосходный код-код JUMP_ABSOLUTE .

Создан 05 авг. 11 2011-08-05 16:28:34 kindall

К сожалению, в некоторых случаях, когда я вижу ‘goto’ в C, это обратные. И мне нужно решение, которое просто работает всегда (в противном случае его не стоит реализовывать, особенно если это так сложно). – Albert 05 авг. 11 2011-08-05 16:53:02

Будут некоторые общие шаблоны, которые, скорее всего, будут следовать за кодом, использующим goto .

В большинстве случаев я подозреваю, что все операторы goto перейдут в местоположение, которое позже и в более закрытом блоке; Если тело функции следует этому шаблону отлично, преобразуйте goto в исключения, а метки — как исключающие блоки.

Другие случаи переезда с одного места на другое в том же самом блоке, что и на конечной машине.Вероятно, это можно перевести в цикл отправки; каждая область между меткой и следующей становится функцией; Гото заменяются next_state = ‘labelname’; return

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

«Последний случай, который не является ни вышеприведенным, ни, возможно, нетривиальным, — это когда прыжок входит в тело цикла». Я думаю, вы могли бы что-то разработать с помощью генераторов. – JAB 05 авг. 11 2011-08-05 16:36:33

Надеюсь, я могу избежать внедрения нескольких независимых решений для нескольких случаев. Самый общий случай — это фактический конечный автомат, который всегда работает (если я также переводил все остальные циклы таким образом), но я боюсь, что с помощью ‘next_state = ‘label’ и т. Д. PyPy JIT не может действительно оптимизировать его ну, и я не хочу этого потерять. – Albert 05 авг. 11 2011-08-05 16:55:32

Это не совсем то, что вы ищете, но выслушай меня.

Много лет назад мой сын и я записали игру «Приключения» на Бейсике. Каждое место в подземной игре было номером строки. Например, когда вы покинули одно место через туннель, идущий на север, вы прибыли в другое место.

Кодирование было чем-то вроде if response == ‘N’ GOTO 2400 . Таким образом, игроки оказались в разных местах, используя GOTO.

Я задавался вопросом, как это можно сделать в Python и придумал это.

Возможно, такая техника может быть использована для других приложений, где требуется нечто вроде GOTO. Если вы разделите свою программу на куски, которые являются функциями, следующее «немного глупое» кодирование выполнит трюк.

Создан 24 янв. 13 2013-01-24 22:52:31 John of York

Вместо ‘return (‘4′)’ почему бы просто не вернуть сама функцию: ‘return l4’.Основной цикл затем становится ‘while go: go = go()’ – cdjc 19 авг. 14 2014-08-19 20:22:39


Я обновил свой питона Гото декоратор для Python 3. Вы можете получить его на https://github.com/cdjc/goto. Использование goto вместо функций может сделать конечный автомат примерно в 5 раз быстрее.

Версия для python 2 по-прежнему доступна в https://code.activestate.com/recipes/576944-the-goto-decorator/, но у нее есть ряд ошибок, которые исправлены в версии python 3.

Создан 19 авг. 14 2014-08-19 20:21:02 cdjc

«Использование goto вместо функций может сделать конечный автомат примерно в 5 раз быстрее». — Первоначально научившись программировать на теперь архаическом диалекте BASIC (где GOTO и GOSUB были * единственным контролем потока). Я часто объясняю молодым программистам, которых учили, что «goto по своей сути злой», что goto на самом деле больше похож на динамит. В руках эксперта он может устранить основные препятствия из вашей кодировки четким, кратким, быстро исполняемым способом. В руках идиотка это приводит к липким жадности вашего кода, разбрызганного по всему ландшафту . – Perkins 29 апр. 15 2015-04-29 17:23:38

Примечание: Это было предложено в качестве шутки Апрельского дурака. (работает хотя)

Излишне говорить. Да, это смешно, но DONT его использовать.

Мастер Йода рекомендует:  Производительность программы против читаемости и простоты кода в пользу чего стоит делать выбор

Создан 09 фев. 17 2020-02-09 22:57:39 harmv

Оператор GOTO в Python

A function decorator to use goto in Python. Tested on Python 2.6 through 3.6 and PyPy.

Note that label .begin and goto .begin is regular Python syntax to retrieve the attribute begin from the objects with the variable names label and goto . However, in the example above these variables aren’t defined. So this code would usually cause a NameError . But since it’s valid syntax the function can be parsed, and results in following bytecode:

The with_goto decorator then removes the respective bytecode that has been generated for the attribute lookups of the label and goto variables, and injects a JUMP_ABSOLUTE or JUMP_RELATIVE instruction for each goto :

The idea of goto in Python isn’t new. There is another module that has been released as April Fool’s joke in 2004. That implementation doesn’t touch the bytecode, but uses a trace function, similar to how debuggers are written.

While this eliminates the need for a decorator, it comes with significant runtime overhead and a more elaborate implementation. Modifying the bytecode, on the other hand, is fairly simple and doesn’t add overhead at function execution.

Зачем goto в исходниках Python?

Стандартная практика обработки ошибок или освобождения ресурсов в Си. Обычно в таких случаях goto более удобен и читаем чем альтернативные решения.
Однако в данном конкретном примере функция очень короткая и в ней нет множества ветвлений, поэтому конечно проще написать без goto, но видимо сила привычки или задел на будущее.

Вот напиример функция из питона с более уместным использованием goto

Иногда читаемость, как в данном примере, повышается на порядок.

У этого кода может быть два пути рождения:

  1. автогенерация
  2. из-под пера упоротого любителя питона, который готов на все, лишь бы использовать как можно меньше фигурных скобок.

Goto перестали рекомендовать, из-за того, что очень просто с ним пропустить освобождение чего-то важного

Даже в C++ и управляемых языках?

Алексей Черемисин: вам нравится искать глазами метки?)

Добавьте в ваш пример еще пару ифов

Ну вот, пошли условности. Если код трудно читать, то нужно выделять функции, а не goto втыкать.

А холиваров нет, ибо в промышленном программировании goto табуирован практически.

Алексей Черемисин: опыт вам не смог подсказать, что конкретный пример с goto отвратителен для читающего.

Надеюсь, вы не думаете, что на системном программировании свет клином сошелся?

Линус — так себе референс, он фрик известный, но даже он говорит об условии, что «I think goto’s are fine, and they are often more readable than large amounts of indentation«. То есть goto иногда может плохокод сделать чуть менее плохокодистым.

И, это, знаете, сколько тонн легаси в этом ядре?) Да, когда-то goto в Си процветало, помнится, даже в статях на Хабре о первых компиляторах Си-с-классами на это акцент делался.

Резюмируя: в Си goto может быть вполне оправданно, наравне со всякими longjmp и прочей грустью, без которой этот язык не может, но в контексте вопроса — это goto ради goto, который может написать только человек с тяжелой судьбой.

Почему в Python нет оператора goto?

В Python нет goto, но в чем причина недоступности goto в python 2.X?


Пожалуйста, скажите мне.

4 ответа

Почему нет goto?

Вы можете использовать исключения для предоставления «структурированного перехода», который работает даже при вызовах функций. Многие считают, что исключения могут удобно эмулировать все разумные варианты использования конструкций «go» или «goto» в C, Fortran и других языках.

Другими словами: нет необходимости в goto когда у вас есть обработка исключений.

Даже в таких языках, как FORTRAN, где есть GOTO, обычно не рекомендуется использовать его:

Вы можете делать все, используя if , else , while и for , добавление goto означает неструктурированное программирование. goto не добавляет никакой дополнительной мощности в язык, это просто безусловный цикл.

1 Gerrat [2013-01-09 17:04:00]

Python увидел ошибку в своих отношениях и добавил goto !

Просто шучу — пожалуйста, не используйте в реальном коде

Есть ли метка / Гото в Python?

Есть goto или какой — либо эквивалент в Python , чтобы иметь возможность перейти к конкретной строке кода?

Нет, Python не поддерживает этикетки и Гото, если это то, что вы после этого. Это (высоко) структурированный язык программирования.

Python предлагает вам возможность сделать некоторые из вещей, которые вы могли бы сделать с Гото, используя первые функции класса. Например:

Может быть сделано в Python, как это:

Конечно, это не самый лучший способ заменить Гото. Но, не зная точно, что вы пытаетесь сделать с Гото, это трудно дать конкретные советы.

Лучше всего, чтобы либо заключить его в функцию или использовать исключение. Для функции:

Использование исключений делать такие вещи, как это может чувствовать себя немного неловко, если вы из другого языка программирования. Но я бы сказал, что если вам не нравится использование исключений, Python не язык для вас. 🙂

Недавно я написал функцию декоратора , которая позволяет goto в Python, просто так:

Я не знаю , почему один хотел бы сделать что — то подобное , хотя. Тем не менее, я не слишком серьезно. Но я хотел бы отметить, что этот вид мета — программирования является актуальной возможно в Python, по крайней мере , в CPython и PyPy, а не только злоупотребляют отладчик API , как другой парень сделал. Вы должны возиться с байткод , хотя.

Для того, чтобы ответить на @ascobol «ы вопрос , используя @bobince » s предложение от комментариев:

Выемка для else блока является правильной. Код использует неясный else после синтаксиса цикла Python. См Почему использование питона «еще» после того, как на и в то время как петли?

Вы можете использовать исключения для обеспечения «структурированных Готы», который работает даже через вызовы функций. Многие считают, что исключения могут легко эмулировать все разумные виды использования «идти» или «Гот» конструкты C, Fortran и других языков. Например:

Это не позволяет прыгать в середине цикла, но это обычно считается злоупотребление Гото в любом случае. Используйте экономно.

Это очень приятно , что это даже упоминается в официальном FAQ, и что хороший пример решения обеспечивается. Мне очень нравится питон , потому что его сообщество лечение даже , goto как это;)

Примечание: Это было предложено в качестве первоапрельской шутки в. (Работает, хотя)

Разумеется. Да его забавное, но не использовать его.

Этикетки для break и continue были предложены в PEP 3136 еще в 2007 году, но оно было отклонено. Мотивация раздел предложения иллюстрирует несколько общих (если безвкусный) метод для имитации помечены break в Python.

Это технически возможно добавить «Гото» как заявление на питоне с некоторой работой. Мы будем использовать «Дис» и «новые» модули, и очень полезный для сканирования и модификации питона байт-кода.

Основная идея реализации является первым маркировать блок кода, как с помощью «Готы» и «метки» заявление. Особый декоратор «@goto» будет использоваться для целей маркировки «GOTO» функции. Затем мы просматриваем этот код для этих двух утверждений и применить необходимые изменения в базовый байт-код. Все это происходит в исходном время компиляции кода.

Надеюсь, что это отвечает на вопрос.

Я искал некоторые вещи подобных

Таким образом, мой подход заключается в использовании логического значения, чтобы помочь вырваться из вложенных для петель:

Добавить комментарий