迭代器与生成器

yizhihongxing

1.什么是迭代器

迭代器是用来迭代取值的工具,而迭代的意思是一个重复的过程,每一次的重复都是基于上一次的结果继续的,单纯的重复并不是迭代

2.为何要有迭代器

在python中涉及到需要把多个值循环取出来的类型有:字符串、列表、元组、字典、集合、打开文件等,我们可以考虑使用while循环的方式来循环取出多个值,例如:

list=['egon','lin',11]
i=0
while i<len(list):
    print(l[i])
    i+=1

但是使用while方式迭代取值的方式只适合于有索引的数据类型,比如字符串、元组、列表。

因此python必须提供一种不依赖索引的取值方式!这就是迭代器!

可迭代对象:但凡内置有__iter__方法的都称之为可迭代对象,字符串、字典、列表、元组、集合、文件都是可迭代对象,内部都封装了__iner__方法!

迭代器对象:内置有__next__()和__iter__()方法的对象

可迭代对象调用__iter__方法返回的是一个迭代器对象,迭代器对象下有一个__next__()方法就可以取到可迭代对象的值,没有值可取就会报stopiteration错。

d={'a':1,'b':2,'c':3}
d_iterator=d.__iter__()  #调用__iter__()把字典转换为迭代器对象
d_iterator.__next__()   #依次取出字典d中的key,每次取一个,取完继续取则报错

3.如何用迭代器

for循环的工作原理:

for k in d:
    print(k)

1.调用对象的__iter__()方法得到一个迭代器对象
2.调用迭代器对象的__next__()方法拿到一个返回值,然后将返回值赋值给k
3.循环第二步,直到抛出stopiteration异常,for循环补捉到异常break结束循环

4.迭代器的优缺点

优点:

1)可以迭代没有索引的可迭代对象
2)迭代的时候是每迭代一次,读取一次,不会把内容全部一次读取出来,这样会损耗内存

缺点:

1)不可以像索引那样针对性的取值,总是一次性的迭代完!

5,自定义迭代器(生成器)

5.1 如何得到自定义迭代器

在函数体内存在yield,在调用函数时并不会执行函数体代码,而是会返回一个生成器,即自定义的迭代器!

def func():
    print('第一次')
    yield 1
    print('第二次')
    yield 2
    print('第三次')

d = func()
res1=next(d) 
print(res1)
res2=d.__next__()
print(res2)
# __next__()就等于next(),调用了next方法会触发函数体代码运行,然后遇见yield停下来,将yield后面的值返回,如果在调用了next方法之后没有返回值了就会报错!

5.2 yield的表达式

def dog(name):
    print('%s正在吃东西'%name)
    while True:
        x = yield 1111
        print('%s正在吃%s'%(name,x))

g=dog() # 函数里遇见yield说明不在是一个函数,而是返回了一个生成器
# 需要用send方法需要先初始化一下,即:seng里面传一个none等同于调用了next(g)方法
g.send(None) # 此时函数停在了yield的地方
res=g.send('一根骨头')  # 把send里面的值传给yield(只能传一个值,可以是列表等),yield在传给x 
# 如果yield后面有值,则g.send()有返回值,没有则返回none
print(res)

## 扩展:其实返回值可以后面放个列表,字典等,每次操作就往列表里加一个值

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:迭代器与生成器 - Python技术站

(0)
上一篇 2023年4月2日
下一篇 2023年4月2日

相关文章

  • 进程

    1 什么是进程 进程是系统进行资源分配和调度的基本单位,进程表示程序正在执行的过程,是‘活的’,而程序就是一推躺在硬盘上的代码,是‘死的’。 2 进程的调度 1.先来先服务调度算法:对长作业有利,对短作业无利2.短作业优先调度算法:对短作业有利,对长作业无利3.时间片轮转法+多级反馈队列该方法是指,将时间片切成n份,每一份表示一个时间片,这些时间片有一个优先…

    2023年4月2日
    00
  • 基础数据类型之字典

    1.字典的定义 使用{}定义字典,括号内用逗号分隔开多个key:value,其中value可以是任意类型,但是key必须是不可变类型且不能重复,是无序的! info=[ [‘name’,’zhang’], (‘age’,19) [‘gender’,’男’] ] d={} # 第一种方式定义 d=dict(x=1,y=2) #第二种,dict里面也可以穿一个i…

    Python开发 2023年4月2日
    00
  • django中操作mysql数据库

    1.准备工作(django连接数据库) 1.本机电脑下载好mysql数据库2.打开django,修改setting.py中的DATABASES配置项 DATABASES = { ‘default’: { ‘ENGINE’: ‘django.db.backends.mysql’, ‘NAME’: ‘python’, ‘USER’: ‘root’, ‘PASSW…

    2023年4月2日
    00
  • 过滤组件、排序组件、全局异常处理、自己封装的response对象

    过滤组件 查询所有才涉及到过滤,其他接口都不需要restful规范中有一条,请求地址中带过滤条件:分页、排序、过滤统称为过滤 内置过滤类 使用内置过滤类的步骤 from rest_framework.filters import OrderingFilter,SearchFilter 必须是继承GenericAPIView+ListModelMixin的之类…

    2023年4月2日
    00
  • 线程

    1. 什么是线程 线程就是进程里面的执行单位,每一个进程肯定都自带一个线程,真正被cpu执行的是线程,线程是代码的执行过程,该过程中需要的资源都找对应的进程要 进程是资源的单位,线程是执行单位! 补充:同一个进程里面的多个线程资源是共享的! 2. 为啥要有线程 一个进程里面可以开设多个线程,而开设线程是不需要申请内存空间的(进程需要),因此,开设线程的消耗远…

    2023年4月2日
    00
  • django自带的序列化组件

    1.什么是序列化组件 在django中,自带一个序列化组件,它是用来将数据进行整理、转化成特定的为一个特定的格式(比如json数据格式),然后传输给前端,以便前端对数据进行处理操作。 2.为什么要用序列化组件 当我们从数据库取出一些数据时,我们需要将数据转成特定的格式,比如列表套字典的形式,然后将这些数据序列化成json的格式传输给前端,这就需要我们在后端把…

    Python开发 2023年4月2日
    00
  • python中的三大主流wed框架简介

    1.django 特点:大而全,自带的功能特别特别多,类似于航空母舰 不足之处:有时候过于笨重 django中web框架的三个部分: socket部分:用的wsgiref模块路由与视图函数的对应关系:自己写的模板语法:自己写的 2.flask 特点:小而精,自带的功能特别少,类似于轻骑兵 但是它的第三方模块特别特别的多,如果把第三方模块加起来完全可以盖过dj…

    Python开发 2023年4月2日
    00
  • 文章的评论(跟评论与子评论的制作)

    文章的评论制作 先做跟评论,在做子评论 发表评论框的制作:前端渲染发表评论框: {# 评论功能开始#} {% if request.user.is_authenticated %} <div> <p><span class=”glyphicon glyphicon-comment”>发表评论:</span>&l…

    2023年4月2日
    00
合作推广
合作推广
分享本页
返回顶部