迭代器与生成器

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日

相关文章

  • django中APIView里的dispatch和as_view方法分析

    位置: from rest_framework.views import APIView 继承APIView类视图形式的路由: path(‘booksapiview/’, views.BooksAPIView.as_view()), #在这个地方应该写个函数内存地址 继承APIView类的视图函数: from rest_framework.views imp…

    Python开发 2023年4月2日
    00
  • django中的cookie、session和token

    发展史 1.早期的时候,网站都没有保存用户功能的需求,所有用户访问网站返回的结果都是一样的,比如新闻、文章等网站! 2.但是,随着网站的发展,出现了一些需要保存用户信息的网站,比如:淘宝、京东、个人博客等! 3.以登录功能为例,如果不保存用户登录的信息,就意味着用户每次都需要重新登录网站,为此非常的麻烦。 4.为了解决上述的麻烦,便产生了cookie和ses…

    2023年4月2日
    00
  • django中的auth模块与admin后台管理

    1. auth模块 在创建完django项目之后,执行数据库迁移之后,数据库里会增加很多新表,其中有一张名为auth_user的表,当访问django自带的路由admin的时候,需要输入用户名和密码,其参照的就是auth_user表 使用python3 manage.py crataesupperuser 可以创建超级管理员用户,同时在auth_user表里…

    2023年4月2日
    00
  • 数据库配置限)不用root用户操作数据库了(为数据库创建用户,并赋予权限)

    步骤 1.为路飞项目创建数据库 在mysql终端输入以下代码: create database luffy charset=utf8; 2.创建数据库用户 create user ‘username’@’host’ identified by ‘password’; 其中username为自定义的用户名;host为登录域名,host为’%’时表示为 任意IP…

    Python开发 2023年4月2日
    00
  • CORS跨域资源共享问题

    同源策略介绍 同源策略(Same origin policy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响。可以说Web是构建在同源策略基础之上的,浏览器只是针对同源策略的一种实现 请求的url地址,必须与浏览器上的url地址处于同域上,也就是域名,端口,协议相同. 比如:我在本地上的域名是127.0…

    Python开发 2023年4月2日
    00
  • celery的介绍和使用

    celery介绍 celery是一个异步任务框架,它可以执行异步任务、延迟任务、定时任务 异步任务框架简述: 1)celery可以不依赖任何服务器,通过自身命令,启动服务(内部支持socket) 2)celery服务为为其他项目服务提供异步解决任务需求的 注:会有两个服务同时运行,一个是项目服务,一个是celery服务,项目服务将需要异步处理的任务交给cel…

    2023年4月2日
    00
  • django中有关ajax的部分

    Django_ajax 1 简介 AJAX(Asynchronous Javascript And XML)翻译成中文就是“异步Javascript和XML”。即使用Javascript语言与服务器进行异步交互,传输的数据为XML(当然,传输的数据不只是XML)。 同步交互:客户端发出一个请求后,需要等待服务器响应结束后,才能发出第二个请求; 异步交互:客户…

    Python开发 2023年4月2日
    00
  • django中视图函数的FBV和CBV

    1.什么是FBV和CBV FBV是指视图函数以普通函数的形式;CBV是指视图函数以类的方式。 2.普通FBV形式 def index(request): return HttpResponse(‘index’) 3.CBV形式 3.1 CBV形式的路由 path(r’^login/’,views.MyLogin.as_view()) 3.2 CBV形式的视图…

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