【问题标题】:misunderstanding about Range in python 2.7python 2.7中对范围的误解
【发布时间】:2017-10-19 17:56:02
【问题描述】:

我一直在做一些练习,想问你们一个问题。 跟随我添加的图片。 对于number =2,我们在第二行得到的范围是从22

那么,为什么我没有收到一些错误消息?它是如何工作的?

程序如何知道跳过它并返回True

代码:

def main(number):
    for i in range(2,int(number**0.5)+1):
        if number % i == 0:
            return False
    return True
print main(2)

谢谢!!

【问题讨论】:

  • 不要再...不要提交您的代码的图片。发布实际代码
  • 回答你的问题:因为 Python 认为这是一个 empty 范围。所以它根本就不一一列举。为什么需要错误消息?
  • 好的,你对代码是正确的。我预计会出现错误,因为我正在谈论一个不存在的 I。那么在场景之外实际发生了什么?运行哪些代码行?谢谢!

标签: python-2.7 primes


【解决方案1】:

有些人认为Python在forrange之间附加了一些特殊的语法,但range是一个支持迭代的对象

这意味着它有一个返回迭代器的__iter__ 函数,这支持iterator protocol。这是一个允许我们从该对象中枚举项目的协议。就像我们也可以枚举列表、元组、集合等。

for 另一方面只是简单地使用这个协议,以便对于每次迭代,它旨在从迭代器中获取下一个元素。如果有下一个元素,它将该元素分配给左侧的变量。如果迭代器耗尽(不再有元素),它将停止。

如果你构造一个range(start,stop) 对象,其中stop <= start。该范围对象被认为是:它根本不枚举任何项目。 for 知道它在枚举什么,但是由于 range(..) 元素上的迭代器只是说不再有元素 for 停止。

您可能确实会争辩说,如果range(..)stop 小于或等于start 的情况下引发错误会更好。但通常想要的行为不会产生错误,并且循环根本不会执行。

您可以将for i in range(0,n) 与 Java/C++ 语言家族中的构造进行比较:

for(int i = 0; i < n; i++) {
    //...
}

在这种情况下,如果n 小于或等于零,也不会执行循环。 range(..) 对象有点像这种类型的循环的生成器。

另外需要注意的是,range 实际上比此答案中描述的更复杂,因为您还可以添加step,并且可以倒计时。但这对这个答案的语义没有影响。

您可以通过在all 语句中使用生成器来使代码更优雅。喜欢:

def main(number):
    return all(number % i for i in range(2,int(number**0.5)+1))

此外,我们可以通过仅检查 odd 除数(和 2)来稍微提高性能:

def main(number):
    sq = int(number ** 0.5) + 1
    return (number & 1) and all(number % i for i in range(3, n, 2))

【讨论】:

  • 哇,伙计!非常感谢。多么棒的答案!非常感激!非常感谢
  • @AlmogCarmeli 如果您的问题得到解答,请感谢marking their answer accepted
猜你喜欢
  • 1970-01-01
  • 2020-03-16
  • 2018-12-26
  • 1970-01-01
  • 2019-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-04
相关资源
最近更新 更多