day11 Python 迭代器

迭代器

我们之前一直在用可迭代对象进行迭代操作. 那么到底什么是可迭代对象. 本小节主要讨论可迭代对象. ⾸先我们先回顾一下⽬前我们所熟知的可迭代对象有哪些:

str, list, tuple, dict, set. 那为什么我们可以称他们为可迭代对象呢? 因为他们都遵循了可迭代协议. 什么是可迭代协议. ⾸先我们先看一段错误代码:

 # 对的
s = "abc" 
for c in s:
    print(c)

# 错的
for i in 123:
    print(i)  # TypeError: 'int' object is not iterable    

注意看报错信息中有这样一句话. 'int' object is not iterable . 翻译过来就是数类型对象是不可迭代的. iterable表⽰可迭代的. 表⽰可迭代协议. 那么如何进⾏验证你的数据类型是否符合可迭代协议. 我们可以通过dir函数来查看类中定义好的所有⽅法.

在打印结果中. 寻找 如果能找到__iter__ ,那么这个类的对象就是⼀个可迭代对象.

s = "我的哈哈哈"
print(dir(s)) # 可以打印对象中的⽅法和函数
print(dir(str)) # 也可以打印类中声明的方法和函数
 

我们发现在字符串串中可以找到__iter__. 继续看⼀一下list, tuple, dict, set;我们发现这⼏个可以进⾏for循环的东⻄都有__iter__函数, 包括range也有. 可以自⼰试⼀下.

这是查看一个对象是否是可迭代对象的第一种办法. 我们还可以通过isinstence()函数来查看一个对象是什么类型的。

综上. 我们可以确定. 如果对象中有__iter__函数. 那么我们认为这个对象遵守了可迭代协议. 就可以获取到相应的迭代器. 这⾥的__iter__是帮助我们获取到对象的迭代器. 我们使⽤迭代器中的__next__()来获取到⼀个迭代器中的元素. 那么我们之前讲的for的⼯作原理理到底是什么? 继续看代码。

l = [1,2,3] 
l_iter = l.__iter__() 
from collections import Iterable from collections import Iterator 
print(isinstance(l,Iterable)) #True 
print(isinstance(l,Iterator)) #False 
print(isinstance(l_iter,Iterator)) #True 
print(isinstance(l_iter,Iterable)) #True
s = "我爱北北京天安⻔门" 
c = s.__iter__() 
print(c.__next__()) 
print(c.__next__()) 
print(c.__next__()) 
print(c.__next__()) 
print(c.__next__()) 
print(c.__next__()) 
print(c.__next__()) 
print(c.__next__())

# 获取迭代器器
# 使⽤迭代器器进行迭代. 获取一个元素

#我

扫描二维码关注公众号,回复: 3840933 查看本文章

#爱
#北
#京
#天
#安
#⻔
# StopIteration

for循环的机制:

for i in [1,2,3]:
    print(i)

使⽤用while循环+迭代器来模拟for循环(必须要掌握)

lst = [1,2,3] 
lst_iter = lst.__iter__() 

while True:
    try:
        i = lst_iter.__next__()
        print(i)
    except StopIteration:
        break

总结:
Iterable: 可迭代对象. 内部包含__iter__()函数
Iterator: 迭代器. 内部包含__iter__() 同时包含__next__(). 迭代器的特点:

1. 节省内存.
2. 惰性机制
3. 不能反复, 只能向下执行.

for循环的时候. ⼀开始的 时候是__iter__()来获取迭代器. 后⾯每次获取元素都是通过__next__()来完成的. 当程序遇到 StopIteration将结束循环.

猜你喜欢

转载自www.cnblogs.com/fanghongbo/p/9885300.html