我正试着列一个数字为1-1000的清单。显然,这将是令人讨厌的写/读,所以我试图使一个范围内的列表。在Python 2中,似乎:

some_list = range(1,1000)

会工作,但在Python 3中,范围类似于Python 2的xrange ?

有人能对此提供一些见解吗?


当前回答

Python3缺少直接获取远程列表的函数的原因是,最初的Python3设计者在Python2方面是新手。他只考虑在for循环中使用range()函数,因此,列表永远不需要扩展。事实上,我们经常需要使用range()函数来生成一个列表并传递给一个函数。

因此,在这种情况下,Python3比Python2更不方便,因为:

在Python2中,我们有xrange()和range(); 在Python3中,我们有range()和list(range())

尽管如此,你仍然可以这样使用列表展开:

[*range(N)]

其他回答

在Python 3中使用Range。

下面是一个示例函数,返回两个数字之间的数字

def get_between_numbers(a, b):
    """
    This function will return in between numbers from two numbers.
    :param a:
    :param b:
    :return:
    """
    x = []
    if b < a:
        x.extend(range(b, a))
        x.append(a)
    else:
        x.extend(range(a, b))
        x.append(b)

    return x

结果

print(get_between_numbers(5, 9))
print(get_between_numbers(9, 5))

[5, 6, 7, 8, 9]  
[5, 6, 7, 8, 9]

在Pythons <= 3.4中,可以像其他人建议的那样,使用list(range(10)),以便从范围(通常是任何可迭代对象)中创建列表。

在Python 3.5中引入的另一种方法是在列表文字[]中使用*:

>>> r = range(10)
>>> l = [*r]
>>> print(l)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

虽然这相当于list(r),但它是字面语法,而且不涉及函数调用的事实确实让它执行得更快。它也更少的字符,如果你需要编码高尔夫:-)

In fact, this is a retro-gradation of Python3 as compared to Python2. Certainly, Python2 which uses range() and xrange() is more convenient than Python3 which uses list(range()) and range() respectively. The reason is because the original designer of Python3 is not very experienced, they only considered the use of the range function by many beginners to iterate over a large number of elements where it is both memory and CPU inefficient; but they neglected the use of the range function to produce a number list. Now, it is too late for them to change back already.

如果我是Python3的设计者,我会:

使用irange返回一个序列迭代器 使用lrange返回一个序列列表 使用range返回序列迭代器(如果元素数量很大,例如range(9999999))或序列列表(如果元素数量很小,例如range(10))

这应该是最优的。

你真的不应该在列表中使用数字1-1000。但如果出于某种原因,你确实需要这些数字,那么你可以这样做:

[i for i in range(1, 1001)]

概括地列出理解:

上述列表的理解转化为:

nums = []
for i in range(1, 1001):
    nums.append(i)

这只是2.x中的列表理解语法。我知道这将在python 3中工作,但我不确定是否有一个升级的语法

Range开始包括第一个参数;但结束Up To,不包括第二个参数(当提供2个参数;如果省略了第一个参数,它将从'0'开始)

range(start, end+1)
[start, start+1, .., end]

你可以从range对象中构造一个列表:

my_list = list(range(1, 1001))

这是在python2中使用生成器的方法。X也是。通常来说,你可能不需要一个列表,因为你可以更有效地获得my_list[i]的值(i + 1),如果你只需要迭代它,你可以回到range。

还要注意在python2上。X, xrange仍然是可索引的。这意味着python3上的范围。X也有相同的性质2

1打印xrange(30)[12]适用于python2.x

在python3中类似于1的语句。X是print(range(30)[12]),同样有效。