python迭代器、生成器、装饰器之迭代器
2024-10-06 09:05:22
迭代是Python最强大的功能之一,是访问集合元素的一种方式。
一般分为可迭代对象,迭代器,可迭代对象不一定是迭代器,但迭代器一定是可迭代对象
1、可以直接作用于for循环的数据类型
第一类:集合数据类型,如list、tuple、dict、set、str等;
第二类:generator,包括集合定义generator和带yield的generator(也就是generator function)。
以上这些可以直接作用于for循环的对象统称为可迭代对象:Iterable。
可以使用isinstance()判断一个对象是否是Iterable对象:可迭代代对象一般内置__iter__()方法,或者是可以利用iter()函数转变为Iterator的对象,iter()为内置函数,作用是将可迭代对象转变为迭代器,而__iter__()继承于iter()
def iter(source, sentinel=None): # known special case of iter
"""
iter(iterable) -> iterator
iter(callable, sentinel) -> iterator
Get an iterator from an object. In the first form, the argument must
supply its own iterator, or be a sequence.
In the second form, the callable is called until it returns the sentinel.
"""
pass
def __iter__(self, *args, **kwargs): # real signature unknown
""" Implement iter(self). """
pass
from collections import Iterable
print(isinstance([], Iterable)) # True
print(isinstance({}, Iterable)) # True
print(isinstance((), Iterable)) # True
print(isinstance('abc', Iterable)) # True
print(isinstance(123, Iterable)) # Flase
2、迭代器(Iterator)
可以使用isinstace()判断一个对象是否是Iterator对象:
当一个可迭代对象调用__iter__()或者iter()后得到的就是一个迭代器对象,而迭代器对象可以通过__next__()或者next()方法进行取值,取值特点是,一次取出一个值,不能后退,当值取完时会抛出StopIteration异常
# 可迭代对象执行obj.__iter__()得到的结果就是迭代器对象
# 而迭代器对象指的是即内置有__iter__又内置有__next__方法的对象
# 以使用isinstance()判断一个对象是否是Iterator对象:
print(isinstance((x for x in range(10)), Iterator)) #True
print(isinstance([], Iterator)) # Flase
print(isinstance([].__iter__(), Iterator)) # True
print(isinstance({}, Iterator)) # Flase
print(isinstance(iter({}), Iterator)) # True
print(isinstance((), Iterator)) # Flase
print(isinstance('abc', Iterator)) # Flase
迭代器通过__next__()或者next()取值
l = [1, 2, 3]
l = l.__iter__()
print(l.__next__())
print(next(l))
迭代器的优缺点:
# 优点:
# - 提供一种统一的、不依赖于索引的迭代方式
# - 惰性计算,节省内存
# 缺点:
# - 无法获取长度(只有在next完毕才知道到底有几个值)
# - 一次性的,只能往后走,不能往前退
最新文章
- 【zz】面试题之寻找丢失的数字
- SQL Server提高事务复制效率优化(四)修改数据同步过程优化
- 【转】jQuery中.bind() .live() .delegate() .on()的区别
- web前端基础——jQuery编程进阶
- AIO、NIO、BIO
- MySQL 中随机抽样:order by rand limit 的替代方案
- JQ方法大全
- Docker 基本管理
- 【Loadrunner】初学Loadrunner——安装
- Microsoft.Identity的IPasswordHasher的默认实现与运用
- hasattr(obj,attr) 判断前面是否有后面的属性
- GetTypes Unable to load one or more of the requested types
- Vivox9怎么录制屏幕
- py-day2-5 python 百分号字符串拼接
- PAT 1039 到底买不买
- .Net Core之Swagger
- 第十一章 串 (c2)KMP算法:查询表
- IOS开发之无法选择模拟器显示NO Scheme
- 用jquery写的校验用户名
- Java精选笔记_面向对象(慨念、类和对象)
热门文章
- Luogu 4751 动态DP 模板
- location对象属性
- 003_Python3 基本数据类型
- 第四组团队git现场编程实战
- vue中封装一个倒计时
- postgresql数据的入门教程
- gradle的简单使用
- java.lang.IllegalStateException: Method get not annotated with HTTP method type (ex. GET, POST);
- cannot load from mysql.proc. the table is probably corrupted 解决办法
- THINKPHP扩展PHPEXCEL,PHP7.2以上版本无法导出Excel