首页 > 解决方案 > 为什么范围不返回一个数组,但是当我将它添加到列表时呢?

问题描述

有什么方法range可以在不使用的情况下打印数组list()

def every_three_nums(start):
  lst = []
  if start <= 100:
    lst += range(start, 101, 3)
    # this returns an array but if I print(range(start, 101, 3)), it doesn't
    return lst
  else:
    return lst

这会返回一个数组,但如果 I print(range(start, 101, 3)),它不会。为什么?这段代码如何lst += range(start, 101, 3)变成range一个数字数组?

标签: pythonpython-3.xlistrange

解决方案


如果 I print(range(start, 101, 3)),它不会[返回一个数组]。为什么?

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

因此,在 Python 2 中创建列表的许多东西都被更改为创建生成器。range是其中之一。所以 range 是一个对象,但只有在以一种或另一种方式被要求时才会创建项目。因此该命令print(range(start, 101, 3))创建范围对象,然后打印该对象。Python 打印了一个注释,基本上说range是一个对象,一个特殊range对象,并提供了更多细节。

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

该函数有什么方法可以在range不使用的情况下打印数组list()

如果要将 arange作为列表打印,请询问项目。有多种方式:

 print(*range(start, 101, 3))

它使用 Python 的“splat”运算符以适合作为函数参数的形式*获取 的项目——在本例中为函数。这种方法最接近从不使用“列表”来显示. 打印输出不是“数组”,只是用空格分隔的项目。rangeprintrange

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(start, 101, 3)变成range一个数字数组?

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


推荐阅读