zoukankan      html  css  js  c++  java
  • 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)时,不能替换。

  • 相关阅读:
    Leetcode: Longest Increasing Subsequence
    Leetcode: Bulls and Cows
    Leetcode: Serialize and Deserialize Binary Tree
    undefined reference to symbol '_ZNK11GenICam_3_016GenericException17GetSourceFileNameEv'
    ranlib 作用
    live555运行时报错:StreamParser internal error ( 86451 + 64000 > 150000)
    qt 免注册下载
    modsign: could't get uefi db list
    ubuntu安装 opencv-3.4.3
    xl2tpd[26104]: Maximum retries exceeded for tunnel 33925. Closing
  • 原文地址:https://www.cnblogs.com/MY0213/p/7884166.html
Copyright © 2011-2022 走看看