1. 满足以下条件的对象可以成为可迭代对象
2. 可迭代对象特点:
3. 判断对象是否可迭代:
- from collections.abc import Iterable
- print(isinstance(123, Iterable)) # False代表不是可迭代对象
- print(isinstance('python', Iterable)) # True代表是可迭代对象
- print(isinstance({'name':'zs'}, Iterable)) # True代表是可迭代对象
迭代器有两个函数:iter()和next() 通过iter()函数取得可迭代对象的迭代器,对获取到的迭代器对象不断的使用next()函数获取下一条数据,取完元素后,再使用next()引发StopIteration异常
- # 举例1
- li = ['迷糊', '海绵宝宝', '小白'] # 列表是可迭代对象
- # 创建迭代器对象
- name_li = iter(li)
-
- print(next(name_li))
- print(next(name_li))
- print(next(name_li))
- print(next(name_li)) # StopIteration
-
- 举例二: 自定义迭代器类
- class Test2:
- def __iter__(self): # 该方法返回的是迭代器对象
- self.n = 1
- return self # 返回self, 表示实例对象本身是自己的迭代器对象
-
- def __next__(self):
- self.n += 1
- return self.n
-
- te2 = Test2()
- print(te2) # te2跟my的地址是一样的
- # print(next(te2)) # AttributeError: 'Test2' object has no attribute 'n'
- # te2使用next方法报错是因为,没有调用iter方法,里面的self.n实例属性没有生成
-
- my = iter(te2) # 会去调用__iter__方法
- print(next(my)) # 2
- print(next(my)) # 3
- print(next(my)) # 4
-
- # 使用for循环同等效果,for循环会自动调用iter方法,再调用next方法
- for i in te2:
- if i <=10:
- print(i)
- else:
- break
-
-
- # 举例三:
- class Test3:
- def __init__(self):
- self.n = 1
-
- def __iter__(self):
- return self # 返回的是当前迭代器类的实例对象
-
- def __next__(self):
- self.n += 1
- if self.n == 10:
- raise StopIteration('终止了, 不能继续运行')
- return self.n
-
- te3 = Test3()
- try:
- while True:
- print(te3.__next__())
-
- except StopIteration as e:
- print("what",e)
1.生成器就是一个迭代器。定义方式类似于列表推导式,把列表推导式的[]改成()就行 2.生成器函数:python中, 使用了yield的函数被称为生成器(generator) 普通函数,返回值用return; 生成器函数使用yield语句 yield语句一次返回一个结果,在每个结果中间,挂起函数,以便下次从它离开的地方继续执行 yield效果使函数中断,并保存中断的状态
- 列表推导式
- # li = [i*10 for i in range(3)]
- # print(li)
- # 把列表推导式的[]改成()
- li2 = (i*10 for i in range(3)) # 生成器表达式
- print(li2) #
at 0x000002105DD1B548> -
- print(next(li2))
- print(next(li2))
- print(next(li2))
- # print(next(li2)) # StopIteration
-
- def funa(val):
- li = []
- li.append(val)
- print('这是列表:', li)
-
- funa('a') # 这是列表: ['a']
- funa('b') # 这是列表: ['b']
- funa('c') # 这是列表: ['c']
-
- # 生成器函数
- def funb():
- print('---开始了----')
- yield 2 # 返回一个2,并暂停函数
- yield 3
- yield 4
-
- fb = funb() # 调用生成器函数,返回的是一个生成器对象
- print(fb) #
- print(next(fb)) # 2
- print(next(fb)) # 3
- print(next(fb)) # 4
- print(next(fb)) # StopIteration