### Xrange() 和 range() 返回的是什么

`range`

在 Python 2 中，`range()` 函数返回一个列表（list）。它会立即生成所有数字，并将它们存储在内存中

    # Python 2
    my_list = range(5)
    print my_list
    # 输出: [0, 1, 2, 3, 4]

优点：

- 它可以直接用于索引和切片，因为返回的是一个列表

缺点：

- 内存消耗大：如果你需要生成一个非常大的数字序列（例如 `range(1000000000)`），它会占用大量的内存，可能导致程序崩溃或运行缓慢
- 速度慢：生成大列表需要时间，这会影响程序的启动速度

`xrange`

在 Python 2 中，`xrange()` 函数返回一个生成器对象（xrange object）。它并不会一次性生成所有数字，而是在你迭代它的时候，按需惰性（lazily）地生成每一个数字

    # Python 2
    my_generator = xrange(5)
    print my_generator
    # 输出: xrange(5)

优点：

- 内存效率高：它只存储生成规则，而不是所有数字，因此非常节省内存，即使处理巨大的数字序列也毫无压力
- 速度快：因为它不需要提前生成整个列表，所以速度非常快

缺点：

- 不支持索引和切片，因为对象中并没有存储所有数字。你只能通过循环来访问其中的元素

Python 3 中的变化

在 Python 3 中，`range()` 函数被重新设计，它的行为和 Python 2 中的 `xrange()` 一样，返回一个可迭代对象（range object），而不是列表

`xrange()` 函数在 Python 3 中被移除

特性 | Python 2 range() | Python 2 xrange() | Python 3 range()
--- | --- | --- | ---
返回类型 | list (列表) | xrange object (生成器) | range object (可迭代对象)
内存使用 | 高（立即生成所有数字） | 低（惰性生成） | 低（惰性生成）
支持索引 | 是 | 否 | 是
性能 | 慢（处理大序列时） | 快 | 快
是否推荐 | 不推荐 | 推荐 | 推荐