python迭代器、生成器

迭代器和生成器的关系

在这里插入图片描述

迭代概念

迭代器是访问集合元素的一种方式。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。

可迭代对象

a.可以直接作用于for-in循环的数据类型都被称为可迭代对象:Iterable
b.可以使用isinstance()判断一个对象是否是可迭代对象
c.可以直接作用于for-in循环的数据类型
1>数据结构:list、set、tuple、dict、string

2>generator【生成器】【(),函数结合yield】

迭代器

a.迭代器:Iterator

b.不但可以作用于for-in循环,还可以使用next()函数将其中的元素获取出来,当获取完最后一个元素之后,当再次调用next方法,则会出现StopIteration错误,表示无法继续返回一个值

c.可以使用isinstance()判断一个对象是否是迭代器

结论:list、set、tuple、dict、string是可迭代对象,但是,不是迭代器,只有生成器才是迭代器

#导入模块
#collections:包【文件夹】

from collections import Iterable

print(isinstance([],Iterable))

print(isinstance((),Iterable))

print(isinstance({},Iterable))

print(isinstance((x for x in range(0,6)),Iterable))

print(isinstance("",Iterable))

print(isinstance(10,Iterable))

print(isinstance(True,Iterable))

print(isinstance(10.23,Iterable))

将迭代对象转换成迭代器

迭代器一定是可迭代对象,但是,可迭代对象不一定是迭代器

iter():将可迭代对象转化为迭代器【主要针对listsettupledict、string】

from collections import Iterator

print(isinstance([],Iterator))

print(isinstance((),Iterator))

print(isinstance({},Iterator))

print(isinstance((x for x in range(0,6)),Iterator)) #生成器

print(isinstance("",Iterator))

ge = (x for x in [12,24,435,455,4])

for i in range(0,5):

print(next(ge))

#print(next(ge)) #StopIteration

list1 = [12,2,434,3]

#将列表转换为了迭代器

a = iter(list1)

print(next(a))

print(isinstance(iter([]),Iterator))

print(isinstance(iter(()),Iterator))

print(isinstance(iter({}),Iterator))

print(isinstance(iter(""),Iterator))

for x in [12,34,3545]:

print(x)

it = iter([12,34,3545])

while True:

try:

num = next(it)

except StopIteration:

break

(4.)总结

a.凡是可以使用for-in循环进行遍历元素的数据类型都是Iterable类型【可迭代对象】

b.凡是可以使用next()的数据类型都是Iterator类型

c.list、set、tuple、dict、string是Iterable类型,但是不是迭代器,可以通过iter()转换为迭代器

生成器

生成器的本质就是迭代器。

生成器包括两种:生成器函数和生成器表达式

生成器函数

一个包含yield关键字的函数就是一个生成器函数。并且yield不能和return共用,并且yield只能用在函数内。

(1).生成器函数执行之后会得到一个生成器作为返回值,并不会执行函数体。

(2).执行了__next__()方法之后才会执行函数体,并且获得返回值。

(3).next()内置方法,内部调用生成器函数的__next__()方法。

(3).yield和return相同的是可以返回值,但是不同的是yield 不会结束函数

练习1:创建一个生成器,并且调用

def generator():
    print('xxx')
    yield
    print('zzz')
 
# 接收返回值
ret = generator()
print(ret)  # 返回一个生成器对象 <generator object generator at 0x0000000002165888>
#调用__next__()方法执行生成器
ret.__next__()  # xxx 执行函数体,遇到yield结束
#ret.__next__()  # StopIteration 报错
# next()方法相当于调用__next__方法
# next(ret)

练习2:创建一个生成器,并且设置返回值

def generator():
    print('xxx')
    yield 1 # 返回值
 
g = generator()
ret = next(g) # xxx
print(ret)#1

练习3:创建生成器,定义多个yield 值

def generator():
    print('xxx')
    yield 1
    print('zzz')
    yield 2
 
g = generator()
ret1 = next(g)  # xxx
ret2 =next(g)  # zzz
print(ret1,ret2) # 1,2

生成器参考文章
迭代器参考文章

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值