python

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 类作为迭代器使用

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 (迭代器)

2、参考

  1. 菜鸟教程:Python3 迭代器&生成器
  2. Python next()函数
  3. python生成器
上一篇下一篇

猜你喜欢

热点阅读