当前位置:首页>python>python进阶之迭代器与生成器

python进阶之迭代器与生成器

  • 2026-10-11 07:28:57
python进阶之迭代器与生成器

迭代器与生成器

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))异常

迭代器协议:一个对象如果同时满足如下规范,那该对象就是一个迭代器:

  1. 能被iter()接受。

  2. 能被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)

写在『生成器函数』中的代码,需要通过『生成器对象』来执行:

  1. 调用『生成器对象』的__next__方法,会让『生成器函数』中的代码开始执行。

  2. 当『生成器函数』中的代码开始执行后,遇到yield会“暂停”,并会记录“暂停”的位置。

  3. 后续调用__next__方法时,都会从上一次“暂停”的位置,继续运行,直到再次遇到 yield。

  4. 遇到return会抛出StopIteration异常,并将return后面的表达式,作为异常信息。

  5. 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,大家敬请期待~

接下来会继续更新商城项目。
需要了解服务器和域名的购买以及返佣政策的可以找我,我有朋友做这方面对这些比较了解。
需要源码联系
今天开始建立两个群,第一个群:只讨论java+vue的项目,学历提升和卖服务器的就别进了,进了也会被踢。
第二个群:只讨论python项目,以后python的代码和教程会在群里开源,学历提升和卖服务器的就别进了,进了也会被踢。
QQ群

最新文章

随机文章