2015-04-07 3 views
2

Я являюсь абсолютным новичком с питоном, и мой профессор - это пример пробного подхода к обучению нас языку. Цель состоит в том, чтобы перечислить тройки в отношении {(a, b, c): a, b и c - целые числа с 0 < a < b < c < 5}. Используйте диапазон (5) в качестве источника для значений a, b и c.распечатать список отношений между переменными в python?

Я думаю, что понимаю общую концепцию того, что это такое, я устанавливаю значения a, b, c fine, но я не совсем понимаю, как я могу распечатать такие переменные? Я думал использовать какой-то цикл while, а < b < c распечатать (a, b, c) или что-то подобное, но я не могу заставить его работать с синтаксисом.

Большое спасибо за помощь!

ответ

4

Таким образом, вам необходимо изменить каждый из a, b и c в диапазоне 0-4 (что составляет range(5)). Для этого вы можете использовать три вложенные петли for.

for a in range(5): 
    for b in range(5): 
     for c in range(5): 

Это гарантирует, что для каждого возможного значения a все возможные значения b испытываются, а так же, для каждого возможного значения b, все возможные значения c испытываются. Другими словами, самая внутренняя (самая нижняя, как они написаны) петля c будет проходить через 0-4 для каждого значения b, которое также проходит через 0-4 для каждого значения a, которое равно также проходя через 0-4.

Теперь внутри этих циклов вам просто нужно проверить, соответствует ли критерий, который дал ваш проф, и если да, напечатайте цифры. К счастью, синтаксис ваш профессор дал отлично работает в Python:

if 0 < a < b < c < 5: 
    print(a, b, c) 

Собираем все вместе, то мы имеем:

for a in range(5): 
    for b in range(5): 
     for c in range(5): 
      if 0 < a < b < c < 5: 
       print(a, b, c) 

Теперь, это работает отлично, и, несомненно, удовлетворит ваш профессор, но есть некоторые простые улучшения, которые вы можете внести в эту программу. Во-первых, переменные каждытся от 0-4, но значение 0 никогда не пройдет тест if, потому что он никогда не будет меньше 0! Так почему же попробовать? Вы могли бы сэкономить немного работы, написав каждый диапазон как range(1, 5).

Но ... есть и тот факт, что если a является 1, b никогда не может быть 1 (потому что a < b должно быть правдой, и если a 2, b не может также не будет 2, и так далее. А также, с другого конца диапазона, если c 4, b никогда не может быть 4 и удовлетворяют тест. Мы можем написать диапазоны соответственно, так что диапазон для b начинается 1 мимо a и уходит от одного доc, так что эти комбинации значений никогда не должны проверяться.

Наконец, ваш оператор if также может быть упрощен: из-за используемых диапазонов вам не нужно быть уверенным, что 0 меньше a; это всегда будет верно, потому что a начинается с 1. В то же время вы знаете, что c всегда будет меньше 5, потому что range() делает это так, поэтому вы также можете удалить этот тест.

Таким образом, вы получите одинаковые результаты, при этом меньше работы, написав это так:

for a in range(1, 3): 
    for b in range(a+1, 4): 
     for c in range(b+1, 5): 
      if a < b < c: 
       print(a, b, c) 

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

В этом случае первоначальная версия проходит 125 тестов. Вторая, более эффективная версия? Четыре. Это точно так же, как и количество правильных результатов!

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

И мы сделали менее 1/30-й работы в этом процессе!

+0

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

+0

Спасибо * вы * за оценку. Я добавил немного больше до конца, если вы его пропустили. – kindall

1

Как насчет этого?

for a in range(5): 
    for b in range(5): 
     for c in range(5): 
      if 0 < a < b < c < 5: 
       print(a, b, c) 

Это будет перебирать значения 0 до 4 для a, b и c, и он будет печатать их, когда условие 0 < a < b < c < 5 выполнено.

+0

Работает отлично, спасибо! – Itheyln

Смежные вопросы