【Python高级语法】——迭代器 (Iterator)

简介: 迭代器是访问集合的一种方式,可以记住遍历位置的对象,迭代器从集合的第一个元素开始访问,直到所有的元素被访问完才结束,只能往往前,不能后退。

迭代器iterator

在这里插入图片描述

1.什么是迭代器

  迭代器是访问集合的一种方式,可以记住遍历位置的对象,迭代器从集合的第一个元素开始访问,直到所有的元素被访问完才结束,只能往往前,不能后退。

可以直接作用于for循环的数据类型:

  • 一类是集合数据类型:如:listtupledictsetstr等;
  • 一类是generator,包括生成器和yield关键字的生成器函数generator function
  • 这些可以直接作用于for循环的对象统称为可迭代对象Iterable.
a = (1,)  # 元组
b = [1, 2]  # 列表
c = {}  # 空字典
d = ()  # 元组
s = set()
s1 = {None}  # 集合

print(type(c))  # 空集合 <class 'dict'>
print(type(d))  # <class 'tuple'>
print(type(s))  # 空集合 <class 'set'>

2.Iterable可迭代对象判断

可以使用 instance()判断一个对象是否是 Iterable对象。

instance()函数

def isinstance(x, A_tuple): # real signature unknown; restored from __doc__
    """
    Return whether an object is an instance of a class or of a subclass thereof.
    (返回一个对象是类的实例还是类的子类。)
    
    A tuple, as in ``isinstance(x, (A, B, ...))``, may be given as the target to
    check against. This is equivalent to ``isinstance(x, A) or isinstance(x, B)
    or ...`` etc.
    
    (一个元组,如' ' isinstance(x, (A, B,…))' ',可以被指定为目标
    核对。这相当于' ' isinstance(x, A)或isinstance(x, B)
    or ...`` etc.)
    """
    pass

代码实现:

# -*- coding: utf-8 -*-
# @File  : iterable对象判断.py
# @author: Flyme awei 
# @email : Flymeawei@163.com
# @Time  : 2022/8/20 22:09


from collections.abc import Iterable

print(isinstance([1], Iterable))  # True
print(isinstance({0, 1}, Iterable))  # True
print(isinstance((1, ''), Iterable))  # True
print(isinstance({1: 10}, Iterable))  # True
print(isinstance((i for i in range(10)), Iterable))  # True
print(isinstance(10, Iterable))  # False

在这里插入图片描述

   ⽣成器不但可以作⽤于 for 循环,还可以被 next() 函数不断调⽤并返回下⼀个值,直到最后抛出 StopIteration 错误表示⽆法继续返回下⼀个值了。

可以被next()函数调⽤并不断返回下⼀个值的对象称为迭代器Iterator

  可以使⽤ isinstance() 判断⼀个对象是 否是Iterator 对象,这里就产生一个疑问了,生成器都是 Iterator 对象,那么 listdictstr 是不是 Iterator ?为什么?。

3.Iterator迭代器判断

# -*- coding: utf-8 -*-
# @File  : iterator迭代器判断.py
# @author: Flyme awei 
# @email : Flymeawei@163.com
# @Time  : 2022/8/20 22:40


from collections.abc import Iterator

print(isinstance((i for i in range(10) if i % 2 == 0), Iterator))  # True
print(isinstance([], Iterator))  # False
print(isinstance({}, Iterator))  # False
print(isinstance('abc', Iterator))  # False

在这里插入图片描述

  可以得出 listdictstr 不是 Iterator ,因为 Python的 Iterator 对象表示的是一个数据流, Iterator对象可以 被 next() 函数调用并不断返回下一个数据,直到没有数据时抛出 StopIteration 错误。

  可以把这个数据流看做 是一个有序序列,但我们却不能提前知道序列的长度,只能不断通过 next() 函数实现按需计算下一个数据,所以Iterator 的计算是惰性的,只有在需要返回下一个数据时它才会计算。

  Iterator 甚至可以表示一个无限大的数据流,例如全体自然数。而使用list是永远不可能存储全体自然数的 那我们还可以通过 isinstance() 来判断是否是 Iterator 对象

注意: IteratorIterable ,一个是迭代器,一个是可迭代对象

  但是可以使用 iter() 函数将 listdictstrIterable 变成 Iterator

iter()函数.py

# -*- coding: utf-8 -*-
# @File  : iter()函数.py
# @author: Flyme awei 
# @email : Flymeawei@163.com
# @Time  : 2022/8/20 22:46

from collections.abc import Iterator

print(isinstance(iter([]), Iterator))  # True
print(isinstance(iter({}), Iterator))  # True
print(isinstance(iter('abc'), Iterator))  # True

在这里插入图片描述

4.迭代器与可迭代对象

  所有可以作用于 for循环的对象都是 Iterable可迭代对象类型;

  可以作用于next()函数的对象都是itreator迭代器类型,他们表示一个惰性计算序列;

  集合数据类型listdictstr等是Iterable但不是Iterator,不过可以通过iter()函数获得一个Iterator对象。

# -*- coding: utf-8 -*-
# @File  : 迭代器和可迭代对象.py
# @author: Flyme awei 
# @email : Flymeawei@163.com
# @Time  : 2022/8/20 23:00


# 迭代器  可以被next()函数调⽤并不断返回下⼀个值的对象称为迭代器:Iterator。

from collections.abc import Iterator, Iterable
# iterable 可迭代对象
# iterator 迭代器

a = (1,)  # 元组
b = [1, 2]  # 列表
c = {}  # 空字典
d = ()  # 元组
s = set()
s1 = {None}  # 集合

print(type(c))  # 空集合 <class 'dict'>
print(type(d))  # <class 'tuple'>
print(type(s))  # 空集合 <class 'set'>


# isinstance判断
# 可作用于for循环的对象都是iterable类型
def fun(args):
    if isinstance(args, Iterable):
        print(f'{args}对象是可迭代对象')
    else:
        print(f'{args}对象不是可迭代对象')


fun(a)  # 函数调用
fun(b)
fun(c)
fun(d)
fun(s)
print('---------------------------')


# 渴作用与next()函数的对象都是iterator类型,他们表示一个惰性计算的序列
def fun1(args):
    if isinstance(args, Iterator):
        print(f'{args}对象是可迭代器')
    else:
        print(f'{args}对象不是可迭代器')


g = (i for i in range(10))
fun1(g)
print(next(g))
print(next(g))
print(next(g))

# 用python内置函数iter()函数 把list dict str等 iterable变成iterator迭代器
fun1(iter(a))
fun1(iter(b))

在这里插入图片描述

相关文章
|
1月前
|
XML 前端开发 数据格式
三分钟搞定 Python XPath 语法
XPath(XML Path Language)是一种用于在 XML 文档中查找信息的语言。它基于树状结构的 XML 文档,可以通过路径表达式来选取节点或节点集。也常常用来解析 HTML。 如果你是一个前端,对用路径获取元素可能陌生又熟悉。陌生是很多的路径,熟悉的路径上又有熟悉的属性和方法。下面我们就来探究一下 XPath 的魅力。
|
13天前
|
IDE Java 开发工具
Python的语法
Python的语法。
19 5
|
25天前
|
存储 数据挖掘 程序员
揭秘Python:掌握这些基本语法和数据类型,你将拥有编程世界的钥匙!
【9月更文挑战第3天】Python 是一种简洁强大的高级编程语言,其清晰的语法和丰富的功能深受程序员喜爱。本文从基本语法入手,介绍 Python 的代码结构特点,如通过缩进区分代码块,使逻辑更清晰。接着详细讲解主要数据类型:数值型、字符串、列表、元组、集合与字典,每个类型均附有示例代码,帮助初学者快速掌握 Python,为后续学习打下坚实基础。
29 2
|
1月前
|
数据采集 存储 大数据
Python关于迭代器的使用
在Python编程中,数据的处理和操作是核心任务之一。 想象一下,你有一个装满各种颜色球的箱子,你想逐个查看并使用这些球,但又不想一次性将它们全部取出。 这就引出了我们今天要讨论的主题——迭代。
|
1月前
|
IDE Java 测试技术
Python接口自动化测试框架(基础篇)-- 基础语法(真的很基础)
这篇文章是关于Python编程语言的基础语法介绍,包括编码、标识符、注释、行和缩进、输入输出以及导包等基础知识点,旨在帮助初学者理解并掌握Python编程的基础。
18 2
|
1月前
|
测试技术 索引 Python
Python接口自动化测试框架:回顾Python3基础语法知识总览
本文是Python 3基础语法知识的全面总结,涵盖了标识符、数据类型、运算符、控制流程、函数、模块和文件操作、异常处理以及面向对象编程的各个方面,旨在为编写Python接口自动化测试框架提供必要的语法知识支持。
21 1
|
1月前
|
存储 安全 数据库
Python中的可迭代性与迭代器
在Python中,可迭代性和迭代器是非常重要的概念,它们为我们提供了一种优雅且高效的方式来处理序列和集合数据。本文将深入探讨这些概念,包括可迭代协议以及与异步编程相关的可迭代性和迭代器。
|
1月前
|
存储 安全 数据库
Python中的可迭代性与迭代器
在Python中,可迭代性和迭代器是非常重要的概念,它们为我们提供了一种优雅且高效的方式来处理序列和集合数据。本文将深入探讨这些概念,包括可迭代协议以及与异步编程相关的可迭代性和迭代器。
|
1月前
|
存储 数据挖掘 程序员
揭秘Python:掌握这些基本语法和数据类型,你将拥有编程世界的钥匙!
【8月更文挑战第8天】Python是一种高级、解释型语言,以简洁的语法和强大的功能广受好评。本文从基本语法入手,强调Python独特的缩进规则,展示清晰的代码结构。接着介绍了Python的主要数据类型,包括数值、字符串、列表、元组、集合和字典,并提供了示例代码。通过这些基础知识的学习,你将为深入探索Python及其在文本处理、数据分析等领域的应用打下坚实的基础。
34 3
|
2月前
|
存储 Python
Python 基础语法变量
【7月更文挑战第27天】
38 9