迭代器、生成器、模块和包知识点总结

迭代,生成器,模块,知识点,总结 · 浏览次数 : 25

小编点评

**第一部分:迭代器 例1.  for....in 运行机制** ```python li=[1,2,3,4]# 在列表中取值从第一个取到最后一个结束 for i in li: print(i) i+=1 print(i) ``` **例题2. 可迭对象** ```python class Data: __iter__ = True def __iter__(self): yield 1 yield 2 yield 3 yield 4 li1 = iter(li2) print(dir(li1)) ``` **例3. 迭代器** ```python def f(o): li31 = o.__iter__() try: while True: print(next(li31)) except StopIteration as e: print(e) f(li3) ``` **例4.  for 循环的实现原理** ```python li3=[1,2,3,4]li31=li3.__iter__() try: while j<5: print(next(l)) j+=1 except Exception: pass ``` **第二部分:生成器** ```python def f(): print('第一次执行') yield 1 print('第二次执行') yield 2 return 3 li = f() print(dir(l)) for i in li: print(i) ``` **第三部分:模块(待续)练习** 在模块中定义一个生成器,这个生成器可以生成斐波拉契数列, 再另一个模块中使用这个生成器,得到斐波拉契数列斐波那契数列:数列中每一个数的值都等于前两个数相加的值

正文

第一部分:迭代器

 例1.  for....in 运行机制

li=[1,2,3,4]
# 在列表中取值从第一个取到最后一个结束
# for i in li:
#     print(i)  # 1,2,3,4
i=0
while i < len(li): # 索引
    # print(i) # 输出索引 0,1,2,3
    print(li[i]) # 取列表值
    i+=1
print(i)  # i=4的时候结束

运行截图:

 

例题2. 可迭对象

    一个数据类型中包含__iter__魔术方法就被称为可迭对象

        __iter__:确定你是一个可迭代对象、生成迭代器

li1=[1,2,3,4]
# print(dir(li1))  # 有__iter__
s=123
s1='123' # 可迭代
# print(dir(s)) # 没有__iter__,不可迭代
print(dir(s1))  # __iter__

运行截图:

例3. 迭代器:iter(可迭代对象),取值=next(迭代器),同时具备有__iter__、__next__这两个魔术方法被称为一个迭代器

   生成迭代器的两种方法

       1.通过iter()函数生成

     2.通过__iter__魔术方法

li21=iter(li2)  # 必须是可迭代对象才可以生成
# print('================================================')
# li21=li2.__iter__() # 跟上述作用一样的
print(dir(li21)) # 有__iter__' __next__

运行截图:

 通过__next__方法取迭代器里面的值:当取完的时候会出现异常,可以写个对应异常

li21=iter(li2)  # 必须是可迭代对象才可以生成
# print('================================================')
# li21=li2.__iter__()  # 跟上述作用一样的
# print(dir(li21))  # 有__iter__' __next__
print(li21.__next__())  # 1 相当于在一个盒子里面逐一取值
print(li21.__next__())  # 2 [2,3,4]
print(li21.__next__())  # 3
print(li21.__next__())   # 4 []
print(li21.__next__())  #  取完了 ===StopIteration
# next是一个一个取值
# 与以上方法一样
# print(next(li21))
# print(next(li21))
# print(next(li21))
# print(next(li21))

运行截图:

 例4. for 循环的实现原理

li3=[1,2,3,4]
li31=li3.__iter__()
# 写一个异常
try:

while True:
# print(next(li31))
var=next(li31)
print(var)
except StopIteration as e:
print(e)

同理以下写法:
def f(o):
li31=o.__iter__()
try:
while True:
print(next(li31))
except Exception:
pass
f(li3)

运行截图:

 第二部分:生成器:

  是一个函数,函数里面包含一个yield关键字

 例1.生成器

def f():

    print('第一次执行')
    yield 1  # 具备 return的返回值
    # return 1

    print('第二次执行')
    yield 2

    print('第三次')

l=f()  # l:迭代器
# print(dir(l))  # __iter__,__next__
print(l) # yield:返回、暂停、等待(等待下次取值)
print(next(l)) # 取值
print(next(l)) # 第二次取值
print(next(l)) # 第三次执行并抛出一个异常

运行截图:

 例2.

def f2():
    i=0
    while i<5:
        yield i
        i+=1
j=0
l=f2()
try:
    while j<5:   # i和j实际上没什么关联
        # l=f2() # 迭代器
        print(next(l))
        j+=1
except Exception:
    pass

运行截图:

 总结:

  生成器,是Python提供的一种非常简便的语法 能让我们来自己写出迭代器;

       注意:1. 生成器,是一种特殊的迭代器

     2. 生成器指的是一个函数,返回的结果是一个迭代器

 

第三部分:模块(待续)

练习:

在一个模块中定义一个生成器, 这个生成器可以生成斐波拉契数列, 再另一个模块中使用这个生成器,得到斐波拉契数列

斐波那契数列:数列中每一个数的值都等于前两个数相加的值 [1, 1, 2, 3, 5, 8, 13, 21, 34, 55.........]

方法1:通过函数的方式实现

def f(n):  # n 为序列值
    if n==1:
        return 1
    if n==2:
        return 1
    return f(n-2)+f(n-1)

# print(f(4))

li=[]
for i in range(1,10):
    li.append(f(i))  

运行截图:

 

 方法2:通过生成器实现

# yield:返回、等待、暂停
# f() 为一个生成器
def f(max):  # max:循环的次数
    a=0
    b=1 # 每个元素值
    n=0
    while n < max:
        yield b  # 1
        # 改变b的值
        a,b=b,a+b
        # 第一次循环: a=1,b=1(因为是同时性这个时候的a还是0)
        # 第二次循环: a=1,b=2
        # 第三次循环: a=2,b=3
        # 第四次循环: a=3,b=5
        # 第五次循环:
        n+=1  # 改变条件
li2=[] for i in f(10): li2.append(i) print(li2)
# f=f(5) # 调用一次就行了,不能像以下调用多次 # print(next(f)) # print(next(f)) # print(next(f)) # print(next(f)) # print(next(f))
# 以下形式不可以调用多次 # print(next(f(5))) # 如果传5进去,循环5次 # print(next(f(5))) # print(next(f(5))) # print(next(f(5))) # print(next(f(5)))  

运行截图:

 

与迭代器、生成器、模块和包知识点总结相似的内容:

迭代器、生成器、模块和包知识点总结

第一部分:迭代器 例1. for....in 运行机制 li=[1,2,3,4] # 在列表中取值从第一个取到最后一个结束 # for i in li: # print(i) # 1,2,3,4 i=0 while i < len(li): # 索引 # print(i) # 输出索引 0,1,2,

Python生成器深度解析:构建强大的数据处理管道

# 前言 生成器是Python的一种核心特性,允许我们在请求新元素时再生成这些元素,而不是在开始时就生成所有元素。它在处理大规模数据集、实现节省内存的算法和构建复杂的迭代器模式等多种情况下都有着广泛的应用。在本篇文章中,我们将从理论和实践两方面来探索Python生成器的深度用法。 ## 生成器的定义

搜索EE场景排序链路升级

EE模块是搜索系统中改善生态、探索商品的重要链路,其目标是缓解数据马太效应导致模型对商品排序丰富性、探索性不足,带来的系统非最优解问题。以下分别从模型迭代、在线实验指标、离线评估体系介绍相应模块的优化。

3.0 Python 迭代器与生成器

当我们需要处理一个大量的数据集合时,一次性将其全部读入内存并处理可能会导致内存溢出。此时,我们可以采用迭代器`Iterator`和生成器`Generator`的方法,逐个地处理数据,从而避免内存溢出的问题。迭代器是一个可以逐个访问元素的对象,它实现了`python`的迭代协议,即实现了`__iter__()`和`__next__()`方法。通过调用`__next__()`方法,我们可以逐个访问迭代

Generator(生成器),入门初基,Coroutine(原生协程),登峰造极,Python3.10并发异步编程async底层实现

普遍意义上讲,生成器是一种特殊的迭代器,它可以在执行过程中暂停并在恢复执行时保留它的状态。而协程,则可以让一个函数在执行过程中暂停并在恢复执行时保留它的状态,在Python3.10中,原生协程的实现手段,就是生成器,或者说的更具体一些:协程就是一种特殊的生成器,而生成器,就是协程的入门心法。 协程底

利用代码生成工具快速生成基于SqlSugar框架的Winform界面项目

我们接触一个新事物的时候,如果一个事物能够给我们带来非常直观的感官认识,那么我们就很容易接受,反之可能需要很长时间的潜移默化的了解认识才能接受。万物化繁为简,透过本质看表象,往往也是一个认知迭代深入的过程。在我介绍很多篇随笔《SqlSugar开发框架》,能够看完的肯定不会是一开始就学习的人员,毕竟技术的陈述是比较枯燥无味的,而最好的认识来自于一些快速的项目演示,本篇随笔介绍利用《代码生成工具Dat

【.NET 8】ASP.NET Core计划 - 支持更完善的AOT发布

.NET7.0刚发布不久,.NET社区开始了.NET8.0的开发,重心重新回到了新功能的迭代。 我们知道在.NET7.0中一个令人激动的特新就是支持了NativeAOT,我们可以通过NativeAOT生成本机程序,由于无需JIT编译,所以无需安装.NET Runtime,也进一步的提升了.程序的启动

京喜APP - 图片库优化

京喜APP早期开发主要是快速原生化迭代替代原有H5,提高用户体验,在这期间也积累了不少性能问题。之后我们开始进行一些性能优化相关的工作,本文主要是介绍京喜图片库相关优化策略以及关于图片相关的一些关联知识。

【云享·人物】华为云AI高级专家白小龙:AI如何释放应用生产力,向AI工程化前行?

摘要:AI技术发展,正由应用落地阶段向效率化生产阶段演进,AI工程化能力将会不断深入业务,释放企业生产力。 本文分享自华为云社区《【云享·人物】华为云AI高级专家白小龙:AI如何释放应用生产力,向AI工程化前行?》,作者: 华为云社区精选。 在新科技革命和产业变革的大环境中,人工智能技术迭代和商业化

[转帖]中国混沌工程调查报告2021(观点摘要,调查背景和混沌工程应用现状)

https://www.jianshu.com/p/9de94066ab46 随着分布式架构的普及以及云计算技术的成熟,国内企业应用云原生化推进业务系统的迭代速度越来越快,后端系统架构日趋复杂,服务间的依赖越来越多,调用的链路越来越长。宕机引发巨额损失、严重影响用户体验的新闻层出不穷,为了让云基础设