首页 > 编程语言 >Python 迭代、可迭代对象、迭代器、生成器总结

Python 迭代、可迭代对象、迭代器、生成器总结

时间:2023-09-06 19:33:13浏览次数:56  
标签:__ 迭代 Python 生成器 next print isinstance

迭代

对list、tuple、str等类型的数据使用for...in...的循环语法从其中依次拿到数据进行使用,我们把这样的过程称为遍历,也叫迭代

可迭代对象

不是所有对象都能使用for ..in ,比如数字10,把可以通过for...in...这类语句迭代读取一条数据供我们使用的对象称之为可迭代对象(Iterable)

判断是否是可迭代对象

from collections.abc import Iterable

print(isinstance("hello", Iterable))  # True
print(isinstance({"name": "zhangsan", "age": 18}, Iterable))  # True
print(isinstance([11, 22, 33], Iterable))  # True
print(isinstance((10, 20, 30), Iterable))  # True
print(isinstance({1, 9, 0, 88}, Iterable))  # True
print(isinstance(10.5, Iterable))  # False

可迭代对象的本质:具备了__iter__方法的对象,就是一个可迭代对象

#该类没有实现__iter__方法,所以不是可迭代对象
class Student:
    def __init__(self, age):
        self.age = age


print(isinstance(Student(8), Iterable))  # False
#重写了__iter__方法
class Student:
    def __init__(self, age):
        self.age = age

    def __iter__(self):
        return self


print(isinstance(Student(8), Iterable))  # True

迭代器

本质就是一个实现了__iter__方法和__next__方法的对象,就是迭代器

判断是否是迭代器

from collections.abc import Iterator, Iterable

# 判断是否是迭代器,可迭代对象是Iterable不是迭代器(Iterator)
print(isinstance("hello", Iterator))  # False
print(isinstance({"name": "zhangsan", "age": 18}, Iterator))  # False
print(isinstance([11, 22, 33], Iterator))  # False
print(isinstance((10, 20, 30), Iterator))  # False
print(isinstance({1, 9, 0, 88}, Iterator))  # False
print(isinstance(10.5, Iterator))  # False
print("-----------------------------------------------")

# 调用一个对象的__iter__方法,或者调用iter()内置函数,可以获取到一个可迭代对象的迭代器,只能是可迭代对象才能调用,否则报错
print(isinstance(iter("hello"), Iterator))  # True
print(isinstance(iter({"name": "zhangsan", "age": 18}), Iterator))  # True
print(isinstance([11, 22, 33].__iter__(), Iterator))  # True
print(isinstance((10, 20, 30).__iter__(), Iterator))  # True
print(isinstance(iter({1, 9, 0, 88}), Iterator))  # True
# print(isinstance(iter(10.5), Iterator))  # 报错 TypeError: 'float' object is not iterable
print("-----------------------------------------------")


class Student:
    def __init__(self, age):
        self.age = age

    def __iter__(self):
        return self

    def __next__(self):
        pass


print(isinstance(Student(8), Iterator))  # True

for ...in...循环的本质

for item in Iterable 循环的本质就是①先通过iter()函数获取可迭代对象Iterable的迭代器,②然后对获取到的迭代器不断调用next()方法来获取下一个值并将其赋值给item,③当遇到StopIteration的异常后循环结束

生成器

利用迭代器,我们可以在每次迭代获取数据(通过next()方法)时按照特定的规律进行生成。但是我们在实现一个迭代器时,关于当前迭代到的状态需要我们自己记录,进而才能根据当前状态生成下一个数据。为了达到记录当前状态,并配合next()函数进行迭代使用,我们可以采用更简便的语法,即生成器(generator)。生成器是一类特殊的迭代器
总结就是:

  • 生成器是一类特殊的迭代器
  • 只要在def中有yield关键字的 就称为 生成器

创建生成器方法1

g = (i * 2 for i in range(5))
print(g)  # <generator object <genexpr> at 0x0000000002581CF0>
print(next(g))  # 0
print(next(g))  # 2
print(next(g))  # 4
print(next(g))  # 6
print(next(g))  # 8
print(next(g))  # 报错 StopIteration

#也可以使用for i in g 的方式遍历

创建生成器方法2

def generate_test(n):
    result = []
    for i in range(n):
        result.append(i * 2)
        yield result


g = generate_test(5)
print(g)
print(next(g))  # [0]
print(next(g))  # [0,2]
print(next(g))  # [0,2,4]
print(g.__next__())  # [0,2,4,6]也可以使用__next__方法,只是用的相对较少
print(g.__next__())  # [0,2,4,6,8]也可以使用__next__方法,只是用的相对较少
#print(g.__next__()) # 报错  StopIteration

#也可以使用for in
for i in g:
    print(i)

image

生成器总结

  • 使用了yield关键字的函数不再是函数,而是生成器。(使用了yield的函数就是生成器)
  • yield关键字有两点作用:
    • 保存当前运行状态(断点),然后暂停执行,即将生成器(函数)挂起
    • 将yield关键字后面表达式的值作为返回值返回,此时可以理解为起到了return的作用
      可以使用next()函数让生成器从断点处继续执行,即唤醒生成器(函数)

标签:__,迭代,Python,生成器,next,print,isinstance
From: https://www.cnblogs.com/bangbangzoutianya/p/17683088.html

相关文章

  • python-day1
    1.print向文件输出内容A=open('D:/practice.text','a+')print('helloword',file=A)A.close()2.转义字符print('hello\nword')#newlineprint('hello\rword')#return光标移动到本行开头print('hello\bword')#backspaceprint......
  • python分享之读取xml文件(2)
    获得标签属性值<?xmlversion="1.0"encoding="utf-8"?><catalog><maxid>4</maxid><loginusername="pytest"passwd='123456'><caption>Python</caption>......
  • python基础 04数据类型、输出彩色颜色
    数据类型1为什么要有数据类型​ 对于不同类型的变量需要用不同的数据类型去描述​ 常用:数字类型、字符串、列表、字典、布尔值1.1整型作用:年龄/身份证号码/身高/体重……定义方式:y=10id_num=5201314x=int(10)z=int('10')方法:print(y+x)print(y-x)pr......
  • python变量内存的管理
    python变量内存管理当定义一个变量时,内存就会开辟一个内存空间来存储这个变量height=180#定义变量print(180)#print会自动帮你创建一个变量180,打印完成后,马上就会释放180的内存空间引用计数(针对变量值)#引用计数(针对变量值)height=180#180引用计数为1x=height#180......
  • 执行python程序的两种方式
    执行python程序的两种方式方式一:交互式直接win+r打开cmd命令窗口,在里面输入python.exe即可运行此程序直接在命令行窗口里面就能运行python的代码,例如:print(“helloworld!”)优点:运行一句执行一句缺点:关闭即消失方式一:命令行式直接在桌面上新建一个文本文件,在文本文件中写......
  • 《Python魔法大冒险》009 魔法之语:字符串的奥秘
    随着小鱼和魔法师的深入,他们来到了一个被薄雾笼罩的湖泊。湖中央有一个小岛,岛上有一棵巨大的古树,树上挂满了闪闪发光的果实,每一个果实上都刻着一个字母或符号。小鱼好奇地问:“这些是什么果实?为什么每一个上面都有字母和符号?”魔法师微笑地回答:“这些是字符串果实,小鱼。在编程的......
  • Python 迁移虚拟环境
    #在虚拟环境下生成项目依赖文件pipfreeze>requirements.txt#在有网络的环境下载依赖包pipdownload-dpkgs-rrequirements.txt#将txt文件和依赖包pkgs复制到新环境,执行安装pipinstall--no-index--find-links=pkgs-rrequirements.txt#如果有非whl后缀的......
  • 《Python魔法大冒险》 001 序章:少年小鱼的不平凡一天
     在一个普通的城市里,生活着一个名叫小鱼的少年。他是一名初中生,但在班级里,他的学习成绩总是垫底。同学们经常取笑他,有时甚至戏称他为“倒数王”。放学后,小鱼一个人走在回家的路上,他的心情沉重,仿佛背上了一座大山。今天的数学考试又是一场灾难,他甚至怀疑自己是否真的有学习的天......
  • python 变量
    变量什么是变量?变量就是用来变化的世间万物的状态,简单来说就是给他起一个新的代号或名字例如:身高:160,体重:140​ height=160​ print(height)----输出结果就等于160​ ||等价于​ print(160)--------输出结果也等于160​ weight=140​ print(weight)----输出结果......
  • python随记
    解包,print(*(a)) ......