Python 为什么';t range返回一个数组,但当我将其添加到列表中时是否返回?

Python 为什么';t range返回一个数组,但当我将其添加到列表中时是否返回?,python,python-3.x,list,range,Python,Python 3.x,List,Range,有没有办法不使用list()打印数组 def每隔三个nums(开始): lst=[] 如果start如果I打印(范围(start,101,3)),则它不会[返回数组]。为什么? Python3对Python2所做的更改之一是强调生成器,而不是列表或元组。列表占用列表中每个项目的内存,而生成器在需要时一次只创建一个项目。因此,生成器几乎总是使用更少的内存,这是程序中的宝贵资源。此外,由于生成器在创建后只需立即创建一个项目(最多),而其他项目可能永远不需要,因此与需要创建所有项目(无论是否需要)的列

有没有办法不使用
list()
打印数组

def每隔三个nums(开始):
lst=[]
如果start如果I
打印(范围(start,101,3))
,则它不会[返回数组]。为什么?

Python3对Python2所做的更改之一是强调生成器,而不是列表或元组。列表占用列表中每个项目的内存,而生成器在需要时一次只创建一个项目。因此,生成器几乎总是使用更少的内存,这是程序中的宝贵资源。此外,由于生成器在创建后只需立即创建一个项目(最多),而其他项目可能永远不需要,因此与需要创建所有项目(无论是否需要)的列表相比,它还可以节省大量时间

因此,Python2中列出的许多内容都被更改为创建一个生成器<代码>范围
是这些项目之一。所以range是一个对象,但只有在以某种方式请求时才创建项。因此,命令
print(range(start,101,3))
创建范围对象,然后打印对象。Python打印了一个注释,基本上说
range
是一个对象,一个特殊的
range
对象,并给出了一些更多细节

正如@ShadowRanger在一篇评论中指出的那样(我本想包括但忘了),
range
不仅仅是一个生成器。它可以作为一个序列工作(您可以从中间拉出一个项目,而不仅仅是开始),并且具有其他特殊特性。这就是为什么打印
范围
的命令不仅显示它是一个对象,还显示它是一个与其他对象不同的
范围
对象。当我写“生成器”的时候,我只是泛泛地说——还有其他类似的对象

有没有方法
range
函数在不使用
list()
的情况下打印数组?

如果要将
范围
打印为列表,请索取项目。有多种方法:

 print(*range(start, 101, 3))
它使用Pythons“splat”操作符
*
以适合作为函数参数的形式获取
范围
中的项——在本例中为
打印
函数。此方法最接近于从不使用“列表”来显示
范围的内容。打印输出不是“数组”,只是用空格分隔的项目

print([*range(start, 101, 3)])
这将使用splat创建一个列表,然后打印该列表

print(list(range(start, 101, 3))
它使用外观类型转换将范围立即转换为列表,以便可以打印列表。你说你不想要这个方法,但我展示它的完整性

print(tuple(range(start, 101, 3))
这使用元组而不是列表

print([v for v in range(start, 101, 3)])
它使用列表理解来创建列表。通过在理解中添加一个
if
子句,您可以从列表中获得一些所需的项目。如果你不想要一个列表,你可以使用集合或其他类型的理解

lst = []
lst += range(start, 101, 3)
print(list)
有关此问题的详细信息,请参阅此答案的结尾

lst = []
for v in range(start, 101, 3):
    lst.append(v)
print(lst)
您可以使用循环获取要打印的列表。在这个循环中,有许多变化是可行的


这个代码
lst+=range(开始,101,3)
如何将
range
转换成一个数字数组?

没有。在列表上使用+=命令将运算符右侧的任何内容用作iterable,而不是列表。您的代码从范围中一个接一个地选取项目,并将它们一个接一个地附加到列表中。范围永远不会转换为列表,它只是用于扩展列表。您可以看到,通过尝试执行
lst=lst+range(start,101,3)
——范围不会转换为列表,因此会产生错误。。请参阅以了解一个密切相关的问题,尽管它讨论的是元组而不是范围。

在python 3中,返回一个不可变的序列类型,其优点是范围对象

…将始终占用相同(较小)的内存量,无论 它表示的范围大小(因为它只存储开始、停止和结束 步长值,根据需要计算单个项目和子范围)

python 2中用于返回列表的范围。

关键是:

 lst += range(start, 101, 3)
lst
是一个
列表时执行以下操作:

 lst.extend(range(start, 101, 3))
extend
将其参数中的所有项添加到列表中,就像它是:

for v in range(start, 101, 3):
    lst.append(v)

在这两种情况下,range是否返回iterable或list无关紧要,因为两者都是iterable,而iterate是
extend
从其参数中获取项目所做的操作。

您希望如何打印它?
range
不是列表,因此打印它不会打印列表,
range
它是一个在迭代时生成值的对象。你需要用类似于
print([x代表范围内的x(开始,101,3)])
的方法将这些值输出。
不是重复的,而是提供你需要的所有信息。迂腐的注释:
range
实际上是一个序列,而不仅仅是一个生成器。它可以被多次迭代、索引、切片等。Python3基于迭代器/生成器制作了许多东西,但它也使用了视图和其他惰性构造,如
range
@ShadowRanger:你说得对,
range
不仅仅是一个生成器。我本想在我的回答中包括这一点,但我忘了。谢谢你的提醒--我现在要添加它。这个code
lst+=range(start,101,3)
如何将
range
转换成一个数字数组?@sharong:
list
+=
操作符将任何iterable并将其中的元素附加到
列表中。它只需从
范围中一次读取一个值,并附加这些值,直到用完为止。它大致相当于
list.extend
。不管右边的类型是什么,只要它是可编辑的,它就会拖出元素并附加它们,直到它们用完为止。