Python3.6地图对象

时间:2018-01-02 05:24:31

标签: python python-3.x

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

a1 = map(int,'222211112211')

a2 = int('222211112211')

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

例如:我可以使用a1执行类似的操作:

for i in a1:
    print(i)

但不是a2

4 个答案:

答案 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"))之类的列表。