day11 Python 迭代器
发布日期:2021-08-18 00:51:41 浏览次数:2 分类:技术文章

本文共 1859 字,大约阅读时间需要 6 分钟。

迭代器

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

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)) #Trues = "我爱北北京天安⻔门" 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__())

# 获取迭代器器

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

#我

#爱

#北
#京
#天
#安
#⻔
# 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将结束循环.

 

转载于:https://www.cnblogs.com/fanghongbo/p/9885300.html

转载地址:https://blog.csdn.net/weixin_30872733/article/details/99303405 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:「NOI2015」寿司晚宴 解题报告
下一篇:floyd路径记录

发表评论

最新留言

不错!
[***.144.177.141]2024年04月13日 02时58分38秒