Отклонить или зациклить пользовательский ввод, если два условия не выполнены

Я настоящий новичок в Python, хотя до сих пор мне нравится каждая минута.

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

(1) В сумме все дает не более одного (т. е. a1+ a2+ a3 \leq 1)

(2) Каждый в отдельности будет ‹ 1.

Вот мой код до сих пор (только основной средний бит):

 num_array = list()


  a1  = raw_input('Enter percentage a (in decimal form): ')
  a2 = raw_input('Enter percentage b (in decimal form): ')
  ...
  an = raw_input('Enter percentage n (in decimal form): ')


li = [a1, a2, ... , an]

for s in li:
   num_array.append(float(s))

И я хотел бы встроить что-то, чтобы оно требовало от пользователя повторного ввода, если его ввод превышает требование, которое

a1+a2+a3 >1

или что a1>1, a2>1, a3>1 и т. д.

У меня есть ощущение, что это будет очень легко реализовать, но с моими ограниченными знаниями я застрял!

Любая помощь приветствуется :-)


person KR_Henninger    schedule 10.10.2016    source источник
comment
Я вижу, что вам нужно сначала прочитать n, который представляет собой количество процентов, которое введет пользователь. После этого вы должны повторить чтение процента n раз (для этого используйте оператор for). Теперь вы можете добавить проверку того, что каждый процент меньше 1, когда вы его читаете или в конце. Также в конце вы должны добавить все значения и проверить, что их сумма не больше 1. Поместите повторение навсегда по всему этому коду и выйдите только тогда, когда хотите, поэтому, если какая-либо проверка не пройдена, вы начинаете сначала.   -  person gplayer    schedule 10.10.2016
comment
Вы можете начать с wiki.python.org/moin/WhileLoop.   -  person Kenly    schedule 10.10.2016
comment
Спасибо, @gplayer и @WalR! Это действительно полезные предложения, и спасибо, что заставили меня задуматься над ответом, а не просто дали мне его :-)   -  person KR_Henninger    schedule 10.10.2016


Ответы (1)


person    schedule
comment
О, мой! Это делает именно то, что я хотел, и его легко понять. Спасибо за отличный ответ :-) - person KR_Henninger; 10.10.2016
comment
что вы также можете сделать, чтобы улучшить его, так это установить определенное поле error (например, 10 ^ -3), чтобы ловить ошибки с плавающей запятой. Тогда это будет if (1-error) < total < (1+error):. Если вы выберете 10^-3, сумма может отличаться на 0,1% от 1, при 10^-5 она может отличаться на 0,001% от 1. - person Michel Touw; 12.10.2016
comment
Это действительно модно! Спасибо! - person KR_Henninger; 12.10.2016