py3笔记27:迭代器
2022-12-18 本文已影响0人
_百草_
1、迭代器
1.1 iter()
#-*-coding:utf-8-*-
# 迭代:访问集合元素的一种方式
# 迭代器:记住遍历位置的对象
# 从集合第一个元素开始访问,直到所有元素被访问完结束
# 基本方法:iter() 、next()
# 字符串,列表或元组对象都可以用于创建迭代器
list1 = [1,2,3,4]
iter1 = iter(list1) # 列表对象创建迭代器对象
print(iter1) # <list_iterator object at 0x0000018970D5D1C0>
str1 = "abcd"
iter2 = iter(str1) # 字符串对象创建迭代对象
print(iter2) # <str_iterator object at 0x000001F1149D1FA0>
set1 = (6, 7, 8, 9)
iter3 = iter(set1)
print(iter3) # <tuple_iterator object at 0x00000207C2711F70>
dict1 ={"name":"b", "age":18}
iter4 = iter(dict1)
print(iter4) # <dict_keyiterator object at 0x0000022CDF6188B0>
1.2 迭代器遍历
print(next(iter1)) # 1 输出迭代器的下一个元素
# next(iterator, default=None)
# default未设置,则无可迭代元素时,报错:StopIteration;若已设置,则无可迭代元素是返回default
iter_default = iter([])
# print(next(iter_default,default="已无下一元素")) # TypeError: next() takes no keyword arguments
print(next(iter_default,"已无下一元素")) # 已无下一元素
# import sys
# while True:
# try:
# print(next(iter1))
# except StopIteration:
# sys.exit() # 通过引发SystemExit异常来退出Python程序(不捕捉异常)
for i in iter2: # 使用for语句遍历
print(i, end="~") # a~b~c~d~
1.3 类作为迭代器使用
- 把类作为一个迭代器使用,需要类中实现2个构造函数:
__iter__()
和__new__()
-
__iter__()
:返回一个特殊的迭代器对象,该对象实现__next__()
方法并通过StopIteration
异常标识迭代的完成。 -
__next__()
:返回下一个元素 ;py2中是next() - Python内置函数
iter()
和next()
实际上调用的就是对象的__iter__()
和__next__()
class NumberIter:
def __iter__(self):
# 返回数字的迭代器
self.a = 1
return self
def __next__(self):
# # 返回下一个元素;当前为无限循环,则需要StopIteration标识
# x = self.a
# self.a +=2
# return x
if self.a <=20:
x = self.a
self.a += 1
return x
else:
raise StopIteration
myclass = NumberIter() # 实例化
iter5 = iter(myclass) # 创建迭代器
print(iter5) # <__main__.NumberIter object at 0x000001E76D3D3DC0>
print(next(iter5)) # 1
print(next(iter5)) # 3
for i in iter5:
print(i)
1.4 迭代器对象判断
# 迭代器对象判断
# from collections import Iterable
# DeprecationWarning: Using or importing the ABCs from 'collections' instead of from 'collections.abc' is deprecated since Python 3.3, and in 3.10 it will stop working
from collections.abc import Iterable,Iterator
print(isinstance(iter5, Iterable)) # True (可迭代对象)
print(isinstance(list1, Iterator)) # False (迭代器)