Python3.6地图对象

问题描述 投票:-1回答:4

以下两个代码段之间有什么区别:

a1 = map(int,'222211112211')

a2 = int('222211112211')

为什么我可以迭代a1类型的int

例如:我可以用a1做这样的事情:

for i in a1:
    print(i)

但不是与a2

python python-3.x
4个回答
5
投票

a1中,你正在迭代string并将其每个字符转换为int,结果是ints的迭代器,请查看map的文档:

list(a1) # use `list()` to consume the iterator
=> [2, 2, 2, 2, 1, 1, 1, 1, 2, 2, 1, 1]

a2,你将string转换为int,结果是int。他们是非常不同的东西!

a2
=> 222211112211

这就是为什么你可以迭代a1,因为它是一个迭代器,而不是int。这就是为什么你不能迭代a2,它只是一个int


2
投票

我认为在这种情况下最好的办法是检查REPL中的实际值。

>>> a1 = map(int, '2212')
>>> a1
<map object at 0x7f0036c2a4a8>
>>> list(a1)
[2, 2, 1, 2]
>>> a2 = int('2212')
>>> a2
2212

所以a1是一个特殊的地图对象,结果证明是可迭代的。它存储'2212'的每个字符,分别转换为整数。同时,a2只是将整个字符串转换为一个简单的整数。迭代a2会是一个错误,但在a1上进行整数运算也是错误的。


1
投票

在python 3.6中,map函数返回一个生成器,

注意:这些都不会作为一个整体加载到内存中

这是python3中map的实现

def map(func, iterable):
    for i in iterable:
        yield func(i)

当你把地图称为iterable时,值会产生onspot而不是加载整个东西,这可能会在某些情况下使内存崩溃。

list(map())确实将整个列表加载到内存中,这是python2版本的map所做的

`a=int('2212')` 

a一个整数值,它不是一个可迭代的

a=map(int,'2212')

返回一个可迭代的生成器对象

<map object at 0x7f97e30d7f98>

它是一个可迭代的,它将字符串中的每个字符转换为int并逐个产生结果

所以

a=map(int ,'2212')
for i in a:
   print(i)
for i in a:
   print(i)

会打印

2
2
1
2

第二次调用存储的map对象不会产生任何结果,因为函数在第一次运行中已用完了值

如果你想在第二次运行中获取值,请将其转换为列表,以便它驻留在主内存list(a)中,或者如果它真的很长,则将地图对象的结果存储在单独的文件中并从那里读取


1
投票

在Python 3中,map返回一个可以在for循环中使用的迭代器。

map至少有两个参数,一个函数和一个可迭代的参数。这里int是函数,'222211112211'是一个字符串,是可迭代的对象。 map将函数应用于iterable的每个值。在这里,int将单独应用于“2”,“2”,“2”,......“2”,“1”,“1”并使它们全部为整数。 map将返回一个迭代器,它允许你循环从上一步产生的结果:(2,2,2,...,1,1)

对于a2,您正在使用int函数创建一个整数,并且整数不可迭代。因此,你无法循环它。

以下是Python 3文档中引用的map的描述。

map(function,iterable,...):返回一个迭代器,它将函数应用于每个iterable项,产生结果。如果传递了其他可迭代参数,则函数必须采用那么多参数,并且并行地应用于所有迭代的项。对于多个迭代,迭代器在最短的iterable耗尽时停止。对于函数输入已经排列成参数元组的情况,请参阅itertools.starmap()。

值得注意的是,在Python 2中,map返回一个列表而不是迭代器。在Python 3中,您必须明确地将其设置为list(map(int, "222"))之类的列表。

© www.soinside.com 2019 - 2024. All rights reserved.