python 中__getitem__ 和 __iter__ 的区别

# -*- 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)时,不能替换。

转载于:https://www.cnblogs.com/MY0213/p/7884166.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值