itertools.product
, кажется, дает вам то, что вы ищете. Он часто используется вместо вложенных for
циклов, но имеет удобный repeat
kwarg, который облегчает вашу жизнь здесь.
l = 3 # that's a lower-case L. Never use that in code, though, it looks like a 1.
digits = itertools.product(range(3), repeat=l)
# is equivalent to
def my_product():
"""the same as above itertools.product if l==3"""
for i in range(3):
for j in range(3):
for k in range(3):
yield (i, j, k)
my_digits = my_product() # YUCK!
Это создает генератор (примечание: не список!), Который генерирует все значения, которые вы ищете от (0, 0, 0)
до (2, 2, 2)
. Чтобы составить список, просто приведите его к одному.
digits = list(itertools.product(range(3), repeat=l)) # still a lower-case L. Still don't do this.
Затем, чтобы сравнить цифры, просто используйте индексацию, как любой список 2D.
first_value = digits[0]
first_digit = first_value[0]
assert first_digit == digits[0][0]
second_value = digits[1]
first_digit_of_second_value = second_value[0]
assert first_digit_of_second_value == digits[1][0]
if digits[0][0] == digits[1][0]:
# that's these two: v v
# digits == (0, 0, 0), (0, 0, 1), (0, 0, 2), ...
do_whatever_you_want()
Если вы хотите специально вывести (0, 0, 0)
как 000
, вы можете написать для этого функцию:
def sprint_tuple(tup):
"""Takes a tuple of digits and pretty Sprints them.
>>> sprint_tuple((0, 0, 1))
'001'
"""
return ''.join([str(i) for i in tup])
, затем выполнить цикл по digits
и напечатать каждый:
>>> for tup in digits:
... print(sprint_tuple(tup))
000
001
002
010
...
222
Предпочтительный метод состоит в том, чтобы на самом деле использовать условный атрибут для обертывания вызовов отладки, не используют директивы компилятора. #ifs может стать хитрым и может привести к странным проблемам сборки.
пример использования условного атрибута следующим образом (в C#, но работает в VB.NET также):
[ Conditional("Debug") ]
private void WriteDebug(string debugString)
{
// do stuff
}
, Когда Вы компилируете без набора флага DEBUG, любой вызов к WriteDebug будет удален, как был принят, происходил с Отладкой. Запишите ().
То, что я делаю, инкапсулируют вызов, чтобы Отладить в моем собственном классе и добавить директиву
public void Debug(string s)
{
#if DEBUG
System.Diagnostics.Debug(...);
#endif
}
предварительного компилятора Исследуйте эти Отладка. Запишите метод. Это отмечено с
[Conditional("DEBUG")]
атрибут.
справка MSDN для состояния ConditionalAttribute:
Указывает к компиляторам, что вызов метода или атрибут должны быть проигнорированы, если указанное символ условной компиляции не определяется .
, Имеет ли конфигурация сборки маркировку выпуска или отладки, не имеет значения, что имеет значение, определяется ли Отладочный символ в нем.
Используя ОТЛАДКУ будет символ компилятора, как Вы сказал, на самом деле опустите код от блока.
я верю той Системе. Диагностика. Отладка. Запись будет всегда производить к приложенному отладчику, даже если Вы создали в режиме Release. На статья MSDN:
информация о Записях об отладке к приемникам трассировки в наборе Слушателей.
, Если Вы не хотите никакой , производят, необходимо будет перенести вызов для Отладки. Запишите с ОТЛАДКОЙ, постоянной как Juan, сказал:
#if DEBUG
System.Diagnostics.Debug.Write(...);
#endif
Я прочитал статью также, и она привела меня полагать что, когда ОТЛАДКА не была определена, что ConditionalAttribute объявил в Системе. Функции отладки заставили бы компилятор не учитывать этот код полностью. Я предполагаю, что то же самое верно для ТРАССИРОВКИ. Таким образом, Система. Диагностика. Функции отладки должны иметь ConditionalAttributes для ОТЛАДКИ и для ТРАССИРОВКИ. Я был неправ в том предположении. Отдельный класс Трассировки имеет те же функции, и они определяют ConditionalAttribute, зависящий от постоянной ТРАССИРОВКИ.
От Системы. Диагностика. Отладка: _ Общедоступная Общая Запись Sub (_ обмениваются сообщениями Как Строка _)
От Системы. Диагностика. Трассировка: _ Общедоступный Общий Sub WriteLine (_ обмениваются сообщениями Как Строка _)
кажется затем, что мое исходное предположение было корректно, что Система. Диагностика. Отладка (или система. Диагностика. Трассировка) операторы на самом деле не включены в компиляцию, как будто они были включены в ОТЛАДКУ #IF (или ТРАССИРОВКА #IF) регионы.
, Но я также изучил здесь от Вас парней и проверил, что СБОРКА КОНЕЧНЫХ ВЕРСИЙ сам по себе не заботится об этом. По крайней мере, с проектами Silverlight, которые все еще немного облуплены, необходимо войти в "Усовершенствованные Опции Компиляции..." и удостовериться, что ОТЛАДКА не определяется.
Мы спрыгнули с.NET 1.1/VS2003 к.NET 3.5/VS2008, таким образом, я думаю, что часть этого раньше работала по-другому, но возможно она изменилась в 2.0/VS2005.
По моему опыту, выбор между Отладкой и Выпуском в VB.NET не имеет никакого значения. Можно добавить пользовательские действия к обеим конфигурациям, но по умолчанию я думаю, что они - то же.
Используя Выпуск, конечно, не удалит Систему. Диагностика. Отладка. Запишите операторы.
Чтобы выбрать, хотите ли вы, чтобы отладочная информация была скомпилирована или удалена,
войдите на вкладку «Сборка» в окне свойств проекта.
Выберите правильную конфигурацию (Активный / Выпуск / Отладка / Все) и убедитесь, что вы отметили "Константу отладки", если вам нужна информация, или снимите отметку, если не хотите. .
Применить изменения и перестроить