Как запустить функцию заново, если выпадает исключение?
прямо в функции не стоит делать рекурсивный вызов, лучше сделайте обертку для этой функции, т.е. вызываете обертку, в которой ловите исключение исходной функции. Если исключение поймано — повторно выполняете вызов функции, если опять исключение — тогда кидаете его дальше. А ловля исключения и рекурсия может привести к бесконечной рекрсии. Как вариант — использовать рекурсию, но дополнительно передавать параметр-флаг (по дефолту False, при повторном вызове передаете True) — если параметр True, тогда не обрабатываете исключение, иначе повторный вызов функции
1 мар 2014 в 14:53
у себя (на php) я ожидал исключений, и давал несколько шансов выполниться функции, т.е. грубо код у меня был таким: def func(): pass def wrapper(): repeatCount = 10 for i in xrange(repeatCount): try: func() break catch Exception, e: pass Т.о. если функция кидала исключение, то выполнялся повторный ее вызов. Если опять было исключение — опять повторный вызов и так несколько раз. Только паузу между вызовами не забывайте делать, чтобы во время повторных вызовов не занимать процессорное время
Можно ли повторить пользовательскую функцию def() n раз
Здравствуйте! Хотел бы реализовать выполнение loop через пользовательскую функцию несколько раз, но только не обычным вбиванием печатания результата. Например для 3 раз:
1 2 3 4 5 6
def repeat(): for i in ii: трата-та-та print: print: print:
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:
Python PyGame def draw,def move,def off_screen,def collision
Python pygame За что отвечают эти команды def draw,def move,def off_screen,def collision?

Как можно переделать данный скрипт аккордеона под функцию, чтобы можно было использовать несколько раз на сайте?
Как можно переделать данный скрипт аккордеона под функцию, чтобы можно было использовать несколько.
Необходимо передать в пользовательскую функцию (которая подключается dll) функцию, описанную в mathcad
Задача, необходимо передать в пользовательскую функцию (которая подключается dll) функцию описанную.
![]()
2794 / 2037 / 682
Регистрация: 02.03.2015
Сообщений: 6,509
Кроме как перечитать мою подпись нечего и посоветовать…
Добавлено через 4 минуты
1 2 3 4 5
def repeated_print(n, text): for _ in range(n): print(text) repeated_print(100, 'Я буду описывать условие, а не свои идеи!')
Регистрация: 15.10.2015
Сообщений: 173
Но эта идея и есть — под схожие задачи. Луп повторяет ровно столько итераций, сколько пользователь хочет задать. Но вот уточнение. Текст — это получаемая ссылка. Сейчас задача как остановить луп. Э
1 2 3 4 5 6
for tag in tags[position-1:position]: page1=tag.get('href', None) print "Retrieving:", page1 lista.append((page1)) if len(lista)==count1:break print lista
После того как лист достиг своей длины значений — я его хочу остановить. А каунт — это есть вводимое значение
2740 / 2339 / 620
Регистрация: 19.03.2012
Сообщений: 8,830
Сообщение от SKY_SHY 
После того как лист достиг своей длины значений — я его хочу остановить
В чем проблема-то, какие-то странные вопросы. Цикл сам останавливается, когда у тебя итерируемый объект истощается.
Регистрация: 15.10.2015
Сообщений: 173
В лист добавляется только одна ссылка, которая нужна на данной url странице. А я хочу затащить все ссылки со всех url в один лист и когда он наполнится прекратить этот луп. Т.е. смотрите, как только луп нашёл в url0 — url1 — я снова повторяю и нахожу уже в url1 — url2. Вот наполнится лист до нужного значения (длины). Все задача решена.
![]()
2794 / 2037 / 682
Регистрация: 02.03.2015
Сообщений: 6,509
Сообщение от SKY_SHY 
как только луп нашёл в url0 — url1 — я снова повторяю и нахожу уже в url1 — url2
Где у Вас реализован этот переход? А так:
1 2 3 4
while len(lista) count1: position += 1 for tag in tags[position-1:position]: .
Регистрация: 15.10.2015
Сообщений: 173
1 2 3 4 5 6 7 8 9 10
for tag in tags[position-1:position]: print "Retrieving:", tag.get('href', None) page1=tag.get('href', None) lista.append((page1)) ret_url(page1) if count>0:continue elif len(lista)==count: break print lista print lista
пробовал вот так. С While у меня это сделать не получалось. Тут почему-то в лист попадает только одна ссылка.
![]()
2794 / 2037 / 682
Регистрация: 02.03.2015
Сообщений: 6,509
Сообщение от SKY_SHY 
Тут почему-то в лист попадает только одна ссылка
Сообщение от Marinero 
Где у Вас реализован этот переход?
Другими словами изменение переменной position?
Регистрация: 15.10.2015
Сообщений: 173
position задается пользователем. Это порядковый номер ссылки в url. Таким образом в зависимости от введенного номера я перехожу в url0 получаю ссылку на ur1 — получаю ссылку на url2 и т.д. до тех пора пока мой лист не соберет нужное мне количество.
![]()
2794 / 2037 / 682
Регистрация: 02.03.2015
Сообщений: 6,509
Сообщение от SKY_SHY 
position задается пользователем.
ГДЕ? Чтобы работал цикл надо чтоб что-то менялось(перебиралось) — где у Вас эта часть?
Регистрация: 15.10.2015
Сообщений: 173
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
count=7 position=18 lista=[] print "Enter URL:", page.url print "Enter count:", count print "Enter position:", position for tag in tags[position-1:position]: print "Retrieving:", tag.get('href', None) page1=tag.get('href', None) lista.append((page1)) ret_url(page1) if count>0:continue elif len(lista)==count: break print lista print lista
Добавлено через 7 минут
Т.е на том же уровне что и луп. Tags — это лист найденных ссылок.
Добавлено через 18 минут
Пользовательская функция ret_url получает теги автоматически для страницы url1 — page1 и.д. для последующих других. Я ее поставил в этом уровне (уровень лупа). Поэтому мои tags для полученной url1 остались внизу. Continue снова начинает цикл. — т.к. break не работает, потому что в листе по прежнему только 1 ссылка.
Добавлено через 4 минуты
Я даже больше скажу мне удалось получить только 1 ссылку и все. Continue в данном случае не запускает луп заново.
Отладка кода Python
Python используется во многих частях приложения ArcGIS Pro . Integrated Development Environments (IDE) – это приложения, обеспечивающие удобную среду редактирования и отладки для специалистов, которые пишут коды. IDE делают процесс написания кода и поиска ошибок в нем проще и эффективнее. Python IDE используется для написания и отладки инструмента-скрипта, а также проверки набора инструментов Python и выполнения кода.
Различные IDE
Microsoft Visual Studio
Следующие компоненты ArcGIS Pro могут быть отлажены в Visual Studio :
- Выполнение инструмента-скрипта
- Проверка инструмента-скрипта
- Наборы инструментов Python
- https://docs.microsoft.com/en-us/visualstudio/python/debugging
Необходимо установить следующий Visual Studio Workload: Python development . См. https://docs.microsoft.com/en-us/visualstudio/install/modify-visual-studio.
Чтобы отладить код Python в ArcGIS Pro , выполните сначала работы следующие действия:
- Запустите Microsoft Visual Studio .
- Щелкните в главном меню Отладка > Присоединение к процессу .
- В диалоговом окне Присоединение к процессу dialog щелкните кнопку Выбрать .
- В диалоговом окне Выбрать тип кода поставьте отметку Отладка этих типов кода , отметьте Python и нажмите OK .
Примечание:
Вам нужно выбрать Присоединение к: код Python . Не используйте тип кода по умолчанию Автоматически: код Managed (v4.6, v4.5, v4.0), код Python .
После отключения IDE от ArcGIS Pro , исключения в коде Python не будут отображаться корректно. Чтобы избежать этого, необходимо заново подключить IDE или перезапустить ArcGIS Pro .
Примечание:
Microsoft Visual Studio 2017 можно использовать для отладки ArcGIS Pro 2.1 и выше. Ранние версии любого из этих приложений работать не будут.
Версия PyCharm Professional
Следующие компоненты ArcGIS Pro могут быть отлажены в PyCharm Professional:
- Выполнение инструмента-скрипта
- Проверка инструмента-скрипта
модуль pdb
Модуль pdb – часть стандартной библиотеки Python . Он не является полностью готовым IDE, но может использоваться для интерактивной отладки исходного кода. Модуль pdb не может быть использован для отладки внутри ArcGIS Pro , но он может быть использован для отладки автономных скриптов, включая исполняемый код для инструментов-скриптов.
Использование модуля pdb помогает при отладке кода инструмента-скрипта, запускаемого как автономный скрипт Python . Просто добавьте точку разрыва (используя import pdb;pdb.set_trace() ) в код инструмента-скрипта, затем запустите скрипт Python , который вызывает запуск инструмента. При обнаружении точки разрыва Python перейдет в интерактивный режим. Не забудьте удалить код точки разрыва после окончания отладки.
Код проверки отладки инструмента-скрипта
IDE может отлаживать только файлы Python ( .py ). Для проверки кода Python в инструменте-скрипте (встроенном в набор инструментов) необходимо скопировать код во внешний файл Python и заменить код в наборе инструментов Python , как показан в примере ниже. Теперь вы можете открыть файл Python в IDE установить точки разрыва, добавить IDE к ArcGIS Pro и запустить инструмент-скрипт. По окончании изменения кода скопируйте содержимое файла Python обратно в инструмент проверки.
В следующем примере, val.py содержит класс ToolValidator и сохраняется в той же директории, что и набор инструментов .
import sys import val # the following code will reload the val.py module if it's modified if 'val' in sys.modules: import importlib importlib.reload(val) # ToolValidator should exist at the global scope ToolValidator = val.ToolValidator
Код скрипта в проверке инструмента-скрипта позволяет воспроизводить запуск по мере взаимодействия пользователя с инструментом.
Наборы инструментов отладки Python
IDE может отлаживать только файлы Python ( .py ). Для кода в наборе инструментов Python (файл .pyt ): скопировать код во внешний файл Python и заменить код в наборе инструментов Python , как показано в примере ниже. Теперь вы можете открыть файл Python в IDE установить точки разрыва, добавить IDE к ArcGIS Pro и использовать набор инструментов Python . По окончании модификации кода скопируйте содержимое файла Python обратно в набор инструментов Python .
В следующем примере, pyt_code.py содержит код, обычно используемый в наборе инструментов Python и он сохраняется в той же директории, что и файл .pyt .
from pyt_code import *
Код в наборе инструментов Python выполняется несколько раз по мере загрузки инструментов и взаимодействия с ними.
Python: Условия внутри тела цикла
В теле цикла, как и в теле функции, можно выполнять инструкции. Поэтому внутри цикла можно использовать всё изученное ранее, например — условные конструкции.
Представьте функцию, которая считает, сколько раз входит буква в предложение. Пример ее работы:
count_chars('Fear cuts deeper than swords.', 'e') # 4 # Если вы ничего не нашли, то результат — 0 совпадений count_chars('Sansa', 'y') # 0
Перед тем как посмотреть содержимое функции, подумайте:
- Является ли эта операция агрегацией?
- Какой будет проверка на вхождение символа?
def count_chars(string, char): index = 0 count = 0 while index < len(string): if string[index] == char: # Считаем только подходящие символы count = count + 1 # Счетчик увеличивается в любом случае index = index + 1 return count
Это агрегирующая задача. Несмотря на то, что она считает не все символы, чтобы подсчитать сумму, приходится анализировать каждый символ. Ключевое отличие этого цикла от рассмотренных — внутри тела есть условие.
Переменная count увеличивается только в том случае, когда рассматриваемый символ совпадает с ожидаемым. В остальном — это типичная агрегатная функция, которая возвращает количество нужных символов.
Задание
Функция из теории учитывает регистр букв. То есть A и a с её точки зрения разные символы. Реализуйте вариант этой же функции, так чтобы регистр букв был не важен:
count_chars('HexlEt', 'e') # 2 count_chars('HexlEt', 'E') # 2
Упражнение не проходит проверку — что делать?
Если вы зашли в тупик, то самое время задать вопрос в «Обсуждениях». Как правильно задать вопрос:
- Обязательно приложите вывод тестов, без него практически невозможно понять что не так, даже если вы покажете свой код. Программисты плохо исполняют код в голове, но по полученной ошибке почти всегда понятно, куда смотреть.
В моей среде код работает, а здесь нет
Тесты устроены таким образом, что они проверяют решение разными способами и на разных данных. Часто решение работает с одними входными данными, но не работает с другими. Чтобы разобраться с этим моментом, изучите вкладку «Тесты» и внимательно посмотрите на вывод ошибок, в котором есть подсказки.
Мой код отличается от решения учителя
Это нормально , в программировании одну задачу можно выполнить множеством способов. Если ваш код прошел проверку, то он соответствует условиям задачи.
В редких случаях бывает, что решение подогнано под тесты, но это видно сразу.
Прочитал урок — ничего не понятно
Создавать обучающие материалы, понятные для всех без исключения, довольно сложно. Мы очень стараемся, но всегда есть что улучшать. Если вы встретили материал, который вам непонятен, опишите проблему в «Обсуждениях». Идеально, если вы сформулируете непонятные моменты в виде вопросов. Обычно нам нужно несколько дней для внесения правок.
Кстати, вы тоже можете участвовать в улучшении курсов: внизу есть ссылка на исходный код уроков, который можно править прямо из браузера.