python - 为什么范围不返回一个数组,但是当我将它添加到列表时呢?
问题描述
有什么方法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
一个数字数组?
解决方案
如果 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”运算符以适合作为函数参数的形式*
获取 的项目——在本例中为函数。这种方法最接近从不使用“列表”来显示. 打印输出不是“数组”,只是用空格分隔的项目。range
print
range
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 未转换为列表来看到这一点,因此会导致错误。请参阅此链接以获取密切相关的问题,尽管它讨论的是元组而不是范围。
推荐阅读
- typescript - VSCode 最小 TypeScript 项目
- python - 熊猫对所有行进行排序
- c++ - printf %p 格式和 basic_ostream 格式有关系吗?
- java - 异常处理中的重复
- sql-server - 在 .NET Core EF 核心中并行调用 dbcontext
- iis - 创建从域 A 到运行 IIS 的域 B 到特定站点而不是默认站点的 CNAME
- javascript - 如何在javascript中使用appendChild附加字符串
- python - 如何在 Powershell 中使用 Start-Process 执行 abaqus python 脚本?
- php - Mike42 ESCPOS - 在一行中打印 4 个 png 文件
- python - 如何在 Python 3 中拆分二维列表中的整数?