2015-03-09 1 views
3

Кто-то пришел с этим примером для меня (python2):Python, есть условие в цикле

num = int(input("num")) 
den = int(input("den")) 

quot = 0 
rest = den 
i = num 

for i in range(i,i>den, -den): 
    quot = quot + 1 
    rest = i - den 

print quot 
print rest  

код работает отлично, делает то, что ему нужно делать, и не вызывает ошибок.

Я не понимаю, почему. Для меня range() требует нижнего и верхнего пределов, и для меня i будет более низким значением, а i>den должно оцениваться в булевом?

Контекст - это функция учебника, которая реализует деление с циклом for.

+0

вы можете добавить немного больше окружающего кода? как написано, мы не знаем всех предварительных условий (таких как начальные значения 'i' и' num'). – aruisdante

+0

У вас может быть условие в цикле for, но не функция диапазона. –

+0

@MalikBrahimi Нет, вы можете, потому что 'True' оценивает' 1' и 'False'' 0'. Но он, конечно, не будет вести себя как оператор 'for' C-like. Это просто установка точки остановки итерации либо «0», либо «1». – aruisdante

ответ

3

Это применение "duck typing". В этом случае i>num оценивает к логическому значению True или False, но в контексте функции range, True эквивалентна целое число 1 и False эквивалентен целое число 0.

Так, например, если i>num является False, то этот код эквивалентен

for i in range(i, 0, -num): 
    #do stuff 
+0

Сказав это, существует почти наверняка более четкий способ выписать условия для итерации, чем использовать хитроумный трюк, подобный этому, который в Python 2.X технически опирается на детали реализации. – aruisdante

+0

Наверняка - это странный кусочек кода, и не тот, который я бы хотел отлаживать или поддерживать. – Brionius

+0

Gah, видя обновление OP, он еще более сумасшедший, так как 'i = num' входит в цикл, поэтому он всегда * будет' False'. WTF? – aruisdante