python编程:迭代对象、Iterator迭代器、生成器

举报
彭世瑜 发表于 2021/08/14 00:58:52 2021/08/14
【摘要】 迭代器:例如 列表 迭代器模式 提供了一种方法能够顺序访问集合中的所有元素,而又不暴露集合内部的实现 迭代器的本质是实现了一种方式: 能够判断集合中是否还有未被访问的元素,以及提供访问这个元素的方式 代码实例 # -*- coding: utf-8 -*- # @File : 迭代器模式.py # @Date : 2018-05-23 from abc im...

迭代器:例如 列表

迭代器模式
提供了一种方法能够顺序访问集合中的所有元素,而又不暴露集合内部的实现

迭代器的本质是实现了一种方式:
能够判断集合中是否还有未被访问的元素,以及提供访问这个元素的方式

代码实例

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

# @File : 迭代器模式.py
# @Date : 2018-05-23

from abc import abstractmethod

# 定义迭代器
# 实现了两个方法,是否还有未被访问的元素和下一个未被访问的元素
class Iterator(object): def __init__(self): pass @abstractmethod def has_next(self): pass @abstractmethod def next(self): pass


# 一个书架上摆满了书,我们需要查找某本书时,就用到了迭代器模式
# 定义书本, 名称和编号
class Book(object): def __init__(self, name, number): self.name = name self.number = number


# 书架定义
# 书架实现了增加书目,查找index位置的数目以及总共的图书数目这几个方法
class BookShelf(object): def __init__(self): self.books = [] def append_book(self, book): self.books.append(book) def get_book_at(self, index): return self.books[index] def get_length(self): return self.books.__len__()


# Iterator的具体实现
class BookShelfIterator(Iterator): def __init__(self, book_shelf): self.book_shelf = book_shelf self.index = 0 def has_next(self): if self.index < self.book_shelf.get_length(): return True else: return False def next(self): book = self.book_shelf.get_book_at(self.index) self.index += 1 return book

if __name__ == "__main__": book_shelf = BookShelf() book_shelf.append_book(Book("语文", "001")) book_shelf.append_book(Book("数学", "002")) book_shelf.append_book(Book("英语", "003")) book_shelf_iterator = BookShelfIterator(book_shelf) # 通过hasNext方法和next方法便可以访问数目的具体信息 while book_shelf_iterator.has_next(): book = book_shelf_iterator.next() print(book.name, book.number)
"""
语文 001
数学 002
英语 003
"""

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80

python实现迭代器

任何实现了__iter____next__方法的对象都是迭代器
__iter__返回迭代器自身
__next__返回容器中的下一个值

Python3

# 新书架python实现
class NewBookShelf(BookShelf): def __init__(self): self.index = 0 BookShelf.__init__(self) # 实现容器,进行成员检查 def __contains__(self, book): if book in self.books: return True else: return False # 可迭代对象实现了__iter__方法 def __iter__(self): return self #  迭代器实现next方法 def __next__(self): if self.index < self.get_length(): book = self.books[self.index] self.index += 1 return book else: raise StopIteration # 停止标志

if __name__ == "__main__": # 新书架 new_book_shelf = NewBookShelf() book1 =Book("语文", "001") new_book_shelf.append_book(book1) new_book_shelf.append_book(Book("数学", "002")) new_book_shelf.append_book(Book("英语", "003")) # 成员检查 print(book1 in new_book_shelf)
	# True # 迭代书本 for book in new_book_shelf: print(book.name, book.number)
"""
语文 001
数学 002
英语 003
""" 
  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46

Python2

# 新书架python实现
class NewBookShelf(BookShelf): def __init__(self): self.index = 0 BookShelf.__init__(self) # 实现容器,进行成员检查 def __contains__(self, book): if book in self.books: return True else: return False # 可迭代对象实现了__iter__方法 def __iter__(self): return self def next(self): if self.index < self.get_length(): book = self.books[self.index] self.index += 1 return book else: raise StopIteration  # 停止标志


  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

Python3 和 Python2和 略有不同,Python3 使用 __next__ 替换了 next
会报错

TypeError: iter() returned non-iterator of type 'NewBookShelf'

  
 
  • 1

所以可以写个兼容代码

# 新书架python实现
class NewBookShelf(BookShelf): def __init__(self): self.index = 0 BookShelf.__init__(self) # 实现容器,进行成员检查 def __contains__(self, book): if book in self.books: return True else: return False # 可迭代对象实现了__iter__方法 def __iter__(self): return self

	# 兼容 Python3 和 Python2 def next(self): return self.__next__() #  迭代器实现next方法 def __next__(self): if self.index < self.get_length(): book = self.books[self.index] self.index += 1 return book else: raise StopIteration  # 停止标志 
  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

总结

概念 实现
容器(container) __contains__
可迭代对象(iterable) __iter__ 返回迭代器自身
迭代器(iterator) __next__ 返回容器中的下一个值 停止标志StopIteration
生成器(generator) yiled关键字
生成器表达式(generator expression) [x for x in lst ] -> (x for x in lst)

参考:

  1. 设计模式之迭代器模式
  2. 完全理解 Python 迭代对象、迭代器、生成器

文章来源: pengshiyu.blog.csdn.net,作者:彭世瑜,版权归原作者所有,如需转载,请联系作者。

原文链接:pengshiyu.blog.csdn.net/article/details/80420272

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。