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
不仅仅是一个生成器。我本想在我的回答中包括这一点,但我忘了。谢谢你的提醒--我现在要添加它。这个codelst+=range(start,101,3)
如何将range
转换成一个数字数组?@sharong:list
的+=
操作符将任何iterable并将其中的元素附加到列表中。它只需从范围中一次读取一个值,并附加这些值,直到用完为止。它大致相当于list.extend
。不管右边的类型是什么,只要它是可编辑的,它就会拖出元素并附加它们,直到它们用完为止。