Как сделать флаг в python

Обновлено: 08.07.2024

В течение долгого времени я пытался выяснить, что является лучшим способом передать флаги в функции python. Самый простой способ – это что-то вроде:

Это действительно красиво и лаконично, но невероятно сложно читать, так как слово “True” или “False” ничего не сообщает о том, какой флаг установлен, и вы должны тщательно подсчитывать аргументы, начинающиеся слева. Вы можете сделать им аргументы ключевого слова:

но это отчасти избыточно, поскольку “Истина” вообще не имеет никакого значения. Я мог бы передать это как список:

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

передать флаги функции с минимальной детализацией и избыточности. Есть ли способ сделать что-то подобное в python?

EDIT:
Я закончил с:

в основном по указанным причинам: проверка времени компиляции (по сравнению с передачей в строках), отсутствие загрязнения пространства имен (в отличие от использования глобальных “ENUM” ) и минимального шаблона (= 1 или = 0 всего 2 символа, против 5 или 6 for = True или = False). Он также упрощает установку значений по умолчанию для флагов:

что намного более понятно и намного проще, чем прыгать через обручи, чтобы извлекать и присваивать значения по умолчанию флажкам ** kwarg. Флаги в основном статически проверены и очень четкие/чистые для записи. Теперь, если бы я мог сбрить последние два символа…

Некоторые стандартные библиотеки Python используют это:

Вы можете настроить этот подход, используя * args:

Я бы порекомендовал идти с flag1 = True:

  • можно прочитать
  • имя флага проверяется во время компиляции (если не используется ** kwargs)
  • вы можете использовать флаг = 1 и флаг = 0 вместо True и False, чтобы уменьшить шум.
  • вы можете временно изменить LONG_FLAG_NAME_YOU_DONT_REMEMBER = True на False, не переименовывая длинное имя, когда вам нужно будет вернуться назад.

вы можете определить flag1 … flagN как глобальные переменные и определить свою функцию с помощью func( *args)

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

Это хороший вопрос, чтобы понять, как работают * args и ** kwargs: * args и ** kwargs?

Как насчет того, чтобы перевернуть его?

Мне не хватает старых добрых побитовых флагов:

Я предпочитаю функции без флагов. Скорее сделайте это:

Но “flagX” действительно будет чем-то значимым, как “do_X_with_option”.

Я предпочитаю это, потому что он делает его более понятным, вы упрощаете функции (меньше ошибок), и вам не нужно переносить некоторые константы в другие модули (в случае, если флаги на самом деле являются своего рода перечислением).

Я работаю с большой матрицей (250x250x30 = 1,875,000 ячеек), и мне бы хотелось установить произвольное количество флагов для каждой ячейки в этой матрице, в некотором роде, которая проста в использовании и разумно пространственно эффективна.

Мой первоначальный план был массивом списка 250x250x30, где каждый элемент был примерно таким: ["FLAG1","FLAG8","FLAG12"] . Затем я заменил его на хранение только целых чисел: [1,8,12] . Эти целые числа отображаются внутренне с помощью функций getter/setter в исходные строки флага. Это использует только 250 МБ с 8 флагами на точку, что отлично с точки зрения памяти.

Мой вопрос: я пропустил еще один очевидный способ структурирования такого рода данных?

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

EDIT: erm начальный код, который у меня был здесь (с использованием наборов в качестве базового элемента массива 3d numpy), использовал A LOT памяти. Эта новая версия использует около 500 МБ при заполнении randint(0,2**1000) .

5 способов выйти из вложенного цикла в Python

Все мы знаем, что Python — довольно элегантный язык программирования, но, увы, у всех есть свои слабые стороны. Иногда Python выглядит не так аккуратно, как ему следовало бы. К примеру, нам нужно выйти из вложенного цикла как на примере ниже:

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

Конечно, сравнивать языки друг с другом не стоит, но вот в PHP такое действие довольно просто можно провернуть:

В PHP ключевое слово break принимает число в качестве аргумента, которое определяет, из скольки вложенных циклов нужно выйти. Значением по умолчанию установлено 1, что как раз позволяет выйти из крайнего цикла. Это довольно лаконичное и разумное решение, PHP выглядит привлекательнее с точки зрения написания кода.

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

В статье представлено 5 способов выхода из вложенного цикла в Python. В конце статьи также указано, как можно избежать проблемы вложенности в циклах.

1. Переменная-флаг

Первое решение довольно простое и эффективное. Чтобы выйти из цикла, надо объявить переменную и использовать ее как flag . Рассмотрим решение на примере ниже:

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

2. Вызов исключения

Если мы не можем использовать ключевое слово break как положено, почему бы тогда не выразить его действие другим способом? В Python существует возможность обработки исключений, поэтому из вложенного цикла можно выйти таким образом:

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

3. Повторная проверка условия

Поскольку выполнение одного условия приводит к прерыванию цикла, проверка того же условия также кажется приемлемым решением. Вот как это выглядит:

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

4. Конструкция for-else

В Python есть особая конструкция for-else . Она не очень популярна, а некоторые совсем о ней не знают. Обычно, если пишут else , то только после if . А вот когда дело доходит до выхода из вложенных циклов, то такой необычный синтаксис может помочь в решении задачи:

Этот метод берет все лучшее от синтаксиса for-else , так как код в блоке else сработает только в том случае, если внутренний цикл закончится без выхода. Если вы еще не знакомы с конструкцией for-else , то ознакомьтесь с кодом ниже — это конструкция, которая объясняет поведение конструкции:

Если вкратце, то этот способ работает, но требует использования необычного синтаксиса.

5. Дополнительная функция

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

Это решение выглядит более понятно, тут нет переменных-флагов, нет try-except , for-else и ненужных проверок условий. Функции в Python настраиваются очень гибко, так что если вложенный цикл будет присутствовать по одному разу в каждой функции, то можно вызвать ее сразу во внешней функции:

Правда, создание вложенной функции для двух циклов тоже выглядит не особо разумно.

Cовет: избегайте вложенных циклов

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

Используйте модуль Python turtle для рисования национальных флагов

Черепаха, раскрашивающая флаг, в основном использует две функции: draw_rentangle и draw_star.

Что касается вызова функции, он такой же, как C и C ++, которые мы изучили. Для программы рисования черепахи национального флага первый шаг - найти способ нарисовать национальный флаг до того, как это будет реализовано программой. В процессе реализации у меня не было точного представления о turtle.circle (), поэтому я потратил лишнее время. Когда turtle.circle рисует дугу, направление черепахи (turtle) - это касательное направление дуги, то есть вертикальное направление черепахи находится на прямой линии с центром круга. Ее можно нарисовать с заданным радиусом параметра. Вторая точка внимания в программе - это Позиционное отношение между маленькой пятиконечной звездой и большой пятиконечной звездой в программе в основном определяется turtle.left (turtle.towards (center_x, center_y) -turtle.heading ()). Конечно, я думаю, что некоторые люди используют функцию round () для Получите приблизительные значения, но значения по умолчанию достаточно. Ниже приводится демонстрация написанной мной программы и результатов.


Интеллектуальная рекомендация


Анализ протокола Zigbee: механизм маршрутизации

Функция метода Java setAccessible

В Java значение поля в классе сущности может быть получено посредством отражения. Если для метода setAccessible поля не задано значение true, проверка безопасности доступа будет выполняться при вызове.


Header Server Hot развертывание подробное подробное описание (по обновлению действий / на рамках деактивации)

Сцены: Общие серверы (такие какtomcat,jbossПодождите, после запуска мы также должны дополнительно изменить код Java или код JSP. В общем, это вступит в силу после изменения перезагрузки. Но если тепло.

Читайте также: