以下两个代码段之间有什么区别:
a1 = map(int,'222211112211')
和
a2 = int('222211112211')
为什么我可以迭代a1
类型int
?
例如:我可以使用a1
执行类似的操作:
for i in a1:
print(i)
但不是a2
?
答案 0 :(得分:5)
在import { Component, NgModule, ViewChild } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { FormsModule, ReactiveFormsModule } from '@angular/forms';
import { HttpClientModule } from '@angular/common/http';
import { NgbModule } from '@ng-bootstrap/ng-bootstrap';
import { NgbdModalBasic } from './modal-basic';
@Component({
selector: 'my-app',
template: `
<div class="container-fluid">
<hr>
<p>
This is a demo plnkr forked from the <strong>ng-bootstrap</strong> project: Angular powered Bootstrap.
Visit <a href="https://ng-bootstrap.github.io/" target="_blank">https://ng-bootstrap.github.io</a> for more widgets and demos.
</p>
<hr>
<button type="button" class="btn btn-outline-dark" (click)="openModal()">Open Modal</button>
<ngbd-modal-basic [message]='message' [title]='title' #confirmationModal></ngbd-modal-basic>{{confirmationModal.closeResult}}
</div>
`
})
export class App {
title: string;
message: string;
@ViewChild('confirmationModal') confirmationModal: NgbdModalBasic;
openModal() {
this.title = "Title of the Modal";
this.message = "Modal message.";
this.confirmationModal.open();
console.log("this.confirmationModal.closeResult", this.confirmationModal.closeResult);
}
}
@NgModule({
imports: [BrowserModule, FormsModule, ReactiveFormsModule, HttpClientModule, NgbModule.forRoot()],
declarations: [App, NgbdModalBasic]
bootstrap: [App]
})
export class AppModule {}
中,您正在迭代a1
并将其每个字符转换为string
,结果是int
s的迭代器,查看map
的文档:
int
在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
。
答案 1 :(得分: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
上进行整数运算也是错误的。
答案 2 :(得分: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)
中,或者如果它真的很长,则将地图对象的结果存储在单独的文件中,从那里读到
答案 3 :(得分:1)
在Python 3中,map
返回一个可以在for循环中使用的迭代器。
map
至少需要两个参数,一个函数和一个可迭代参数。这里int
是函数,'222211112211'
是一个字符串,是可迭代对象。 map
将函数应用于iterable的每个值。在此,int
将应用于&#34; 2&#34;,&#34; 2&#34;,&#34; 2&#34;,...&#34; 2&#34;, &#34; 1&#34;,&#34; 1&#34;单独使它们成为整数。 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"))
之类的列表。