Python中for循环的条件语句如何设置?

3

有人向我提出了这个例子(python2):

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 循环实现除法。


你能加上一些周围的代码吗?按照现有的写法,我们不知道所有的前提条件(比如 inum 的初始值)。 - aruisdante
在for循环中可以有一个条件,但是在range函数中不行。 - Malik Brahimi
@MalikBrahimi 不,你可以,因为True评估为1,而False评估为0。但它肯定不会像C语言的for语句那样运行。它只是将迭代的停止点设置为01 - aruisdante
是的,我的意思是为了预期的目的。 - Malik Brahimi
1
在我看来,编写这段代码的人混淆了Python的for循环语法和C、Java、JS等语言中的for循环语法。即使它在技术上是正确的,它绝对不是pythonic的。 - pzp
2个回答

3
这是“鸭子类型”的一个应用。在这种情况下,i>num 的值为布尔值TrueFalse,但在range函数的上下文中,True等同于整数1False等同于整数0
例如,如果i>numFalse,那么该代码等同于
for i in range(i, 0, -num):
  #do stuff

话虽如此,编写迭代条件的方式几乎肯定有比使用这样的巧妙技巧更清晰的方法,在Python 2.X中,这种方法在技术上依赖于实现细节。 - aruisdante
当然 - 这是一段奇怪的代码,我不想去调试或维护它。 - Brionius
看到楼主的更新后更加疯狂了,因为 i = num 进入循环,所以它将始终为 False。什么鬼? - aruisdante
@aruisdante 什么实现细节? - Veedrac
@faboolous i > num 对于 i == num 总是 False ;) 我猜想的是,如果前提条件不同,意图是有效地删除 i > num 的迭代。这是一个“聪明”的技巧,但在Python中,当它妨碍清晰度和可读性时,通常被认为是不好的。 - aruisdante
显示剩余5条评论

2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接