首页 > 其他分享 >迭代器、生成器、模块和包知识点总结

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

时间:2023-09-19 11:22:51浏览次数:29  
标签:__ 知识点 迭代 li21 生成器 iter next print

第一部分:迭代器

 例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)))  

运行截图:

 

标签:__,知识点,迭代,li21,生成器,iter,next,print
From: https://www.cnblogs.com/xiaogan-520/p/17714146.html

相关文章

  • STL迭代器(iterator)
    http://c.biancheng.net/view/6675.html迭代器类别常用的迭代器按功能强弱分为输入迭代器、输出迭代器、前向迭代器、双向迭代器、随机访问迭代器 5种。 迭代器的定义方式尽管不同容器对应着不同类别的迭代器,但这些迭代器有着较为统一的定义方式,具体分为4种,如表1所示......
  • MyCode代码生成器v1.0.0.2(BCB版)
    BCB开发管理系统之类的软件非常方便,而管理系统离不开数据库,对于我们开发人员而言,编写数据库操作代码比较繁琐,每次一个项目都得重新或大部分编写数据库操作代码,同时还得面对代码中可能存在的bug,有鉴于此,本人编写了MyCode-代码生成器,让我们一键生成对数据库操作的代码(cpp、h文件),直接......
  • 4-微信小程序 相关知识点代码示例
    基于上篇文章的理论文本的介绍来进行相关代码的演示和例子该篇文章需注意,在微信小程序的使用时,应先熟悉里面每个文件的作用,在第二篇文章有详细记载,一般用的比较多的是wxml、wxss、ws.js对应网站的开发就是html、css、js、页面的内容及框架、页面的美化、页面的基本功能1.数据......
  • 2020-2-3-coding新建迭代
    layout:posttitle:coding新建迭代categories:coding-posttag:codingapicoding新建迭代接口URLhttps://<team-name>.coding.net/api/project/<project-id>/iterations请注意,是项目id非名称,id可通过获取项目列表查询请求方式POST请求Content-Typeapplication/json......
  • 2020-2-3-coding迭代查询
    layout:posttitle:coding迭代查询categories:coding-posttag:codingapicoding迭代查询接口URLhttps://<team-name>.coding.net/api/project/<project-id>/iterations?page=1&pageSize=20&keywords=&sortBy=CODE%3ADESC请求方式GET请求header参数:cookie......
  • 2020-2-3-coding删除迭代
    layout:posttitle:coding删除迭代categories:coding-posttag:codingapicoding删除迭代接口URLhttps://<team-name>.coding.net/api/project/<project-id>/iterations/<iterations_id>请求方式DELETE请求header参数:cookie:eid成功返回参数参数示例值参数描......
  • python语言基础与核心技巧知识点总结
    一、python语言基础python基础语言的详细操作演示1.1变量变量.png1.2数据类型数据类型.png1.3序列序列分类:可变序列list,不可变序列tuple、str。在python中,内建了6中序列:列表、元组、字符串、unicode字符串、buffer对象、xrange对象。(1)list列表list列表.png(2)tuple元祖tuple.png(......
  • 知识点:交互题
    介绍交互题的做法:先放两道交互题https://codeforces.com/group/L9GOcnr1dm/contest/473585/problem/Ahttps://codeforces.com/group/L9GOcnr1dm/contest/472110/problem/D交互题其实就是你问系统问题,然后根据系统的回答得到答案。有点像那个海龟汤。感觉其实交互题的思路一般......
  • ECMA Script Module(ES module)知识点
    1、给script加type=module,就可以以ESModule的标准执行JS代码<scripttype="module"></script> 2、每个ESModule都是运行在单独的私有作用,ESM自动采用严格模式,忽略usestrict<scripttype="module">console.log(this);// thisundefined私有域,不能访问全局变量......
  • 迭代器模式
    迭代器能在不暴露复杂数据结构内部细节的情况下遍历其中所有的元素。packagemainimport"fmt"typeIteratorinterface{ hasNext()bool getNext()*User}typeCollectioninterface{ createIterator()Iterator}typeUserstruct{ namestring ageint}t......