# -*- coding: utf-8 -*-

class Library(object):
def __init__(self):
self.books = { 'title' : 'a', 'title2' : 'b', 'title3' : 'c', } def __getitem__(self, i):
return self.books[i] def __iter__(self):
# 方法1 使用生成器
for titles in self.books:
yield self.books[titles]
# 方法2 使用迭代器
# return self.books.itervalues() library = Library() # 1.普通方法
print library.books['title'] # 2.使用__getitem__
print library['title'] # 3.迭代器
for book in library:
print book

问题:那__getitem__可以替代__iter__方法吗

1.list

# -*- coding: utf-8 -*-

class Library(object):
def __init__(self):
self.books = [ 'title' , 'a', 'title2' , 'b', 'title3' , 'c', ] def __getitem__(self, i):
return self.books[i] # def __iter__(self):
# 方法1 使用生成器
# for titles in self.books:
# yield self.books[titles]
# 方法2 使用迭代器
# return self.books.itervalues() library = Library() # 1.普通方法
print(library.books[1]) # 2.使用__getitem__
print(library[1]) # 3.迭代器
for book in library:
print(book)

结果为

>>>
===================== RESTART: C:/Users/CUI/Desktop/1.py =====================
a
a
title
a
title2
b
title3
c
>>>

2.dict

# -*- coding: utf-8 -*-

class Library(object):
def __init__(self):
self.books = { 'title' : 'a', 'title2' : 'b', 'title3' : 'c', } def __getitem__(self, i):
return self.books[i] # def __iter__(self):
# 方法1 使用生成器
# for titles in self.books:
# yield self.books[titles]
# 方法2 使用迭代器
# return self.books.itervalues() library = Library() # 1.普通方法
print(library.books[1]) # 2.使用__getitem__
print(library[1]) # 3.迭代器
for book in library:
print(book)

结果为:

>>>
===================== RESTART: C:/Users/CUI/Desktop/1.py =====================
Traceback (most recent call last):
File "C:/Users/CUI/Desktop/1.py", line 20, in <module>
print(library.books[1])
KeyError: 1
>>>

结论:当字段为索引行数据类型(如:list, tuple,str)时,可以替换,当字段为hash型类型(如dict,set)时,不能替换。

python 中__getitem__ 和 __iter__ 的区别的更多相关文章

  1. Python中生成器和迭代器的区别(代码在Python3.5下测试):

    https://blog.csdn.net/u014745194/article/details/70176117 Python中生成器和迭代器的区别(代码在Python3.5下测试):Num01–& ...

  2. Python中type与Object的区别

    Python中type与Object的区别 在查看了Python的API后,总算明白了.现在总结如下: 先来看object的说明: Python中关于object的说明很少,甚至只有一句话: clas ...

  3. Python中的is和==的区别,==判断值是否相等,is判断地址是否一致

    Python中的is和==的区别 Python中的对象包含三要素:id.type.value. 其中id用来唯一标示一个对象,type标识对象的类型,value是对象的值. is判断的是a对象是否就是 ...

  4. 基于python中staticmethod和classmethod的区别(详解)

    例子 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 class A(object):   def foo(self,x):     print "executing foo ...

  5. Python中send()和sendall()的区别

    Python中send()和sendall()的区别 估计每个学习Python网络编程的人,都会遇到过这样的问题: send()和sendall()到底有什么区别? send()和sendall()原 ...

  6. Python中的is和==的区别

    Python中的is和==的区别 1. is 是比较内存地址id() a = "YongJie" b = "YongJie" print(id(a)) #233 ...

  7. python中_new_()与_init_()的区别

    __new__方法的使用 只有继承于object的新式类才能有__new__方法,__new__方法在创建类实例对象时由Python解释器自动调用,一般不用自己定义,Python默认调用该类的直接父类 ...

  8. python中break和continue的区别

    python中break和continue的区别   break和continue 1.break 意思为结束循环   例: i = 0 while i<10:     i+=1     if ...

  9. 从python中copy与deepcopy的区别看python引用

    讨论copy与deepcopy的区别这个问题要先搞清楚python中的引用.python的内存管理. python中的一切事物皆为对象,并且规定参数的传递都是对象的引用.可能这样说听起来比较难懂,对比 ...

随机推荐

  1. 20145214 《网络对抗技术》 MSF基础应用

    20145214 <网络对抗技术> MSF基础应用 1.实验后回答问题--用自己的话解释什么是exploit,payload,encode 如果把MSF比作一把枪的话,payload应该是 ...

  2. WebGL七点二

    与上一节相比这一节相当做了些整合和整理,目的是提高了读写效率和减少代码量,就是做了优化.这里我们只需要在顶点着色器中定义一个用于从js传递参数的变量u_MvcMatrix一看就知道是uniform变量 ...

  3. 图论 Kruskal算法 并查集

    #include<iostream> #include<cstring> #include<string> #include<cstdio> #incl ...

  4. Thinking in Java & 内部类

    静态内部类可以直接创建对象new B.C(); 如果内部类不是静态的,那就得这样 B b = new B(); B.C c = b.new C(); //要想直接创建内部类的对象,不能按照想象的方式, ...

  5. iOS 如何改变搜索取消按钮的值和颜色

    在初始化的时候加上下面两句就行了,试了无数方法,什么遍历查找子元素啊什么的都白搭,也不知道为啥还说可以,下面代码测试是有效果的: //改变搜索取消按钮的文字颜色 [[UIBarButtonItem a ...

  6. struts2与springmvc的区别

    1 机制不同 springmvc的入口是servlet,struts2的入口是filter,导致了二者的机制不同: 2 性能不同 spring会稍微比struts快.spring mvc是基于方法的设 ...

  7. Akka系列---什么是Actor

    本文已.Net语法为主,同时写有Scala及Java实现代码 严肃的说,演员是一个广泛的概念,作为外行人我对Actor 模型的定义: Actor是一个系统中参与者的虚拟人物,Actor与Actor之间 ...

  8. 关于localStorage 应用总结

    window.localStorage 设置数据几种方式 1.localStorage.setItem('name',c); 2.localStorage.name=c; 3.localStorage ...

  9. 1105 C程序的推导过程

  10. MySQL中varchar最大长度是多少

    一. varchar存储规则: 4.0版本以下,varchar(20),指的是20字节,如果存放UTF8汉字时,只能存6个(每个汉字3字节) 5.0版本以上,varchar(20),指的是20字符,无 ...