
迭代器与生成器
1.可迭代对象:能被for循环的对象,就是可迭代对象
names=["1","2","3"]
for item in names:
print(item)
2.下面的不是可迭代对象
age=10
def test():
pass
for item intest():
print(item )
3.可迭代对象都有__iter__方法
names.__iter__()
print(hasattr(names,"__iter__"))
4.调用__iter__方法能得到一个迭代器
1.__iter__方法和iter()等价
2.调用iter(obj)方法就说明其是可迭代对象
print(iter(names))
5.迭代器有next方法,每次调用时候都会根据当前状态,返回下一个元素
names=["1","2","3"]
it=iter(names)
print(next(it))1
print(next(it))2
print(next(it))3
print(next(it))异常
迭代器协议:一个对象如果同时满足如下规范,那该对象就是一个迭代器:
能被iter()接受。
能被next()一步一步取值
迭代器玩的就是__next()__, person既可以是迭代器,也可以是可迭代对象
class Person:
def __init__(self,name,age,gender):
self.name=name
self.age = age
self.gender = gender
self.__index=0
self.__attrs=[name,age,gender]
def __iter__(self):
self.__index=0
return self
def __next__(self):
if self.__index>=len(self.__attrs):
raise StopIteration
value=self.__attrs[self.__index]
if isinstance(value,str):
value=value.upper()
self.__index+=1
return value
p1= Person("张三",1,'男')
for item in p1:
print(item)
讲完迭代器了,就讲生成器
生成器函数:函数体中如果出现了yield关键字,就是生成器函数
生成器对象:调用生成器函数时候会返回一个生成器对象
def demo():
a=100
print(a)
yield
a=20
print(a)
d=demo()
print(d)
写在『生成器函数』中的代码,需要通过『生成器对象』来执行:
调用『生成器对象』的__next__方法,会让『生成器函数』中的代码开始执行。
当『生成器函数』中的代码开始执行后,遇到yield会“暂停”,并会记录“暂停”的位置。
后续调用__next__方法时,都会从上一次“暂停”的位置,继续运行,直到再次遇到 yield。
遇到return会抛出StopIteration异常,并将return后面的表达式,作为异常信息。
yield后面所写的表达式,会作为本次__next__方法的返回值。
def demo():
a=100
print(a)
yield
a=20
print(a)
return"a"
d=demo()
print(d)#100
r1=next(d)
print("1")
print(r1)
try:
next(d)
except StopIteration as e:
print(e)
应用:生成器遍历对象
class Person:
def __init__(self,name,age):
self.name=name
self.age=age
self.__attr=[name,age]
def __iter__(self):
yield from self.__attr
p2=Person("1",1)
for attr in p2:
print(attr)#1 ,1
生成器表达式:一种用类似列表推导式的语法,快速创建生成器对象的方式。
语法格式:(表达式 for 变量 in 可迭代对象)。
什么时候适合用生成器表达式?———— 当“每个结果,只依赖当前这一个元素”时。
nums=[10,20,30]
result=[n*2 for n in nums]
print(result)
result1=(n*2 for n in nums)
print(result1)
for item in result:
print(item)
本节终
arcMallV2版AI智能购物功能正在开发ing,大家敬请期待~



