以下两个代码段之间有什么区别:
a1 = map(int,'222211112211')
和
a2 = int('222211112211')
为什么我可以迭代a1
类型的int
?
例如:我可以用a1
做这样的事情:
for i in a1:
print(i)
但不是与a2
?
在a1
中,你正在迭代string
并将其每个字符转换为int
,结果是int
s的迭代器,请查看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
。
我认为在这种情况下最好的办法是检查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
上进行整数运算也是错误的。
在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)
中,或者如果它真的很长,则将地图对象的结果存储在单独的文件中并从那里读取
在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"))
之类的列表。