Python 3将范围转换为列表

Python 3将范围转换为列表,python,python-3.x,list,range,Python,Python 3.x,List,Range,我正在尝试制作一个包含数字1-1000的列表。很明显,写/读这些内容会很烦人,所以我试图列出一个包含范围的列表。在Python 2中,似乎: some_list = range(1,1000) 本可以工作,但在Python3中,范围类似于Python2的xrange 有人能对此提供一些见解吗?你真的不需要在列表中使用数字1-1000。但如果出于某种原因,您确实需要这些数字,那么您可以: [i for i in range(1, 1001)] 简而言之,列出理解: 上述列表可翻译为: nums

我正在尝试制作一个包含数字
1-1000
的列表。很明显,写/读这些内容会很烦人,所以我试图列出一个包含范围的列表。在Python 2中,似乎:

some_list = range(1,1000)
本可以工作,但在Python3中,范围类似于Python2的
xrange


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

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

[i for i in range(1, 1001)]
简而言之,列出理解:

上述列表可翻译为:

nums = []
for i in range(1, 1001):
    nums.append(i)
这只是列表理解语法,尽管来自2.x。我知道这将在Python3中工作,但不确定是否也有升级的语法

范围开始,包括第一个参数;但是最后,不包括第二个参数(当提供两个参数时;如果第一个参数被关闭,它将从“0”开始)


您可以从范围对象构造一个列表:

my_list = list(range(1, 1001))
这也是python2.x中使用生成器的方法。通常来说,您可能不需要列表,因为您可以更有效地使用
my_list[i]
的值(
i+1
),如果您只需要对其进行迭代,您可以使用
range

还要注意,在python2.x上,
xrange
仍然是可索引的1。这意味着python3.x上的
range
也具有相同的属性2

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


2 python3.x中与1类似的语句是
print(range(30)[12])
,这同样有效。

事实上,如果您想要1-1000(包括1-1000),请使用
range(…)
函数和参数1和1001:
range(11001)
,因为
range(start,end)
函数从开始到结束(end-1),包含。

在Python3.x中,
range()
函数有自己的类型。所以在这种情况下,必须使用迭代器


列表(范围(1000))
在蟒蛇中事实上,与蟒蛇2相比,这是蟒蛇3的复古。当然,使用range()和xrange()的Python2比分别使用list(range()和range()的Python3更方便。原因是Python3的原始设计者不是很有经验,他们只考虑了许多初学者使用range函数迭代大量内存和CPU效率都很低的元素;但是他们忽略了使用范围函数来生成数字列表。现在,对他们来说已经太晚了

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

  • 使用irange返回序列迭代器
  • 使用lrange返回序列列表
  • 使用range返回序列迭代器(如果元素数较大,例如range(999999))或序列列表(如果元素数较小,例如range(10))
  • 这应该是最佳选择。

    在Python3中使用

    下面是一个示例函数,它从两个数字返回两个数字

    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
    

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

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

    • 在Python2中,我们有
      xrange()
      range()
    • 在Python3中,我们有
      range()
      list(range())
    尽管如此,您仍然可以通过以下方式使用列表扩展:

    [*range(N)]
    
    Python 3:

    my_list = [*range(1001)]
    

    为什么理解?只是:
    list(范围(1000))
    谢谢!你能解释一下为什么是“我为我在……而不是简单的为我在”吗?我还没有使用过python3。所以我不能完全确定它是如何工作的。我知道理解力会起作用,但不是100%在施法上。但是如果施法有效,那么你是对的,你的方式更像是python。@inspector4dget:这不是“施法”,它正在调用。
    list()
    构造函数知道在给定任何iterable对象时如何创建新列表。@inspector4dget:
    list(range(1000))
    将在python3中工作,就像python2中的
    list(xrange(1000))
    一样,我会说“构造”或“构建”(或者可能是“实现”)-因为您没有“转换”(这样)作为列表的生成器,您正在从一个数据源创建一个新的列表对象,该数据源恰好是一个生成器…(但s’s只是吹毛求疵,并不是100%确定我喜欢什么)My+1表示“构造”,因为它与其他OO语言一致。
    list(arg)在其他语言中,< <代码>被理解为调用<代码>列表类的构造函数。实际上,它也是Python实例。在构造过程中(例如在C++情况下)还是仅在第一个自动调用方法(如Python <代码>无法改变基本的抽象概念。我的观点是,列表构造函数使用迭代器并用返回值填充列表。@pepr--是的,我同意。构造函数可能是最好的使用词。需要注意的是,不能保证调用
    \uuuuuu init\uuuuuuuuuu
    “如果uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu==i+1
    ,因此您可能并不真正需要列表。@RikPoggi。例如,可能需要为绘图函数提供列表。
    print(get_between_numbers(5, 9))
    print(get_between_numbers(9, 5))
    
    [5, 6, 7, 8, 9]  
    [5, 6, 7, 8, 9]
    
    [*range(N)]
    
    my_list = [*range(1001)]