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

**`range`**

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

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

**优点：**

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

**缺点：**

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

**`xrange`**

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

```python
# 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 (可迭代对象) |
| 内存使用 | 高（立即生成所有数字） | 低（惰性生成）         | 低（惰性生成）            |
| 支持索引 | 是                     | 否                     | 是                        |
| 性能     | 慢（处理大序列时）     | 快                     | 快                        |
| 是否推荐 | 不推荐                 | 推荐                   | 推荐                      |