博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python——迭代器和生成器
阅读量:7040 次
发布时间:2019-06-28

本文共 3363 字,大约阅读时间需要 11 分钟。

一、可迭代协议:可以被迭代要满足要求的就叫做可迭代协议。内部实现了__iter__方法

  iterable:可迭代的------对应的标志

  什么叫迭代?:一个一个取值,就像for循环一样取值

       字符串,列表,元组,集合,字典都是可迭代的

二、迭代器协议:内部实现了__iter__,__next__方法

  迭代器大部分都是在python的内部去使用的,我们直接拿来用就行了

  迭代器的优点:如果用了迭代器,节约内存,方便操作

   dir([1,2].__iter__())是列表迭代器中实现的所有的方法,而dir([1,2])是列表中实现的所有方法,

   都是以列表的方式返回给我们,为了方便看清楚,我们把他们转换成集合,然后取差集

     

print(dir([1,2].__iter__()))#查看列表迭代器的所有方法print(dir([1,2]))#查看列表的所有方法print(set(dir([1,2].__iter__()))-set(dir([1,2])))

  

iter_l=[1,2,3,4,5,6].__iter__()print(iter_l.__length_hint__())#获取迭代器中元素的长度# print(iter_l.__setstate__(4))#根据索引指定从哪里开始迭代print(iter_l.__next__())print(iter_l.__next__())print(iter_l.__next__())#一个一个的取值print(next(iter_l))#next(iter_l)这个方法和iter_l.__next__()方法一样,推荐用next(iter_l)这个
l=[1,2,3,4,5]a=l.__iter__()# print(next(a))# print(next(a))# print(next(a))# print(next(a))# print(next(a))# print(next(a))   #上面的列表长度只有5个,而你多打印了,就会报错。处理的情况如下,就不会报错了while True:    try:        item=a.__next__()        print(item)    except StopIteration: # 异常处理        break

三、可迭代和迭代器的相同点:都可以用for循环

四、可迭代和迭代器的不同点:就是迭代器内部多实现了一个__next__方法

五、判断迭代器和可迭代的方法:

  第一种:判断内部是不是实现了__next__方法

'__iter__' in dir(str)#如果__iter__在这个方法里面,就是可迭代的。

第二种:

    Iterable 判断是不是可迭代对象

    Iterator 判断是不是迭代器

    用法:

from collections import Iterable  from collections import Iterator#比如给一个字符串s='abc'print(isinstance(s,Iterable))#isinstance判断类型的print(isinstance(s,Iterator))

判断range函数

 

s=range(100)#是一个可迭代的,但是不是迭代器print(isinstance(s,Iterable))print(isinstance(s,Iterator))

五、生成器函数:

  常规定义函数,但是,使用yield语句而不是return语句返回结果。

  yield语句一次返回一个结果。

  生成器的好处,就是一下子不会在内存中生成太多的数据

python中提供的生成器:

1.生成器函数    2.生成器表达式

生成器的本质:就是一个迭代器

def  func(): #这是一个简单的函数        a=1        return aprint(func())def func():    print('aaaaaaaaaaa')    a = 1    yield a  # 返回第一个值    print('bbbbbb')    yield 12  # 返回第二个值ret = func()  # 得拿到一个生成器# print(ret)#返回的是一个地址print(next(ret))#取第一个值print(next(ret))# 取第二个值print(next(ret))# 取第三个值,会报错,因为没有yield第三个值
初始生成器

例如:

假如我想让工厂给学生做校服,生产2000000件衣服,我和工厂一说,工厂应该是先答应下来,然后再去生产,

我可以一件一件的要,也可以根据学生一批一批的找工厂拿。

而不能是一说要生产2000000件衣服,工厂就先去做生产2000000件衣服,等回来做好了,学生都毕业了。。。

def make_cloth():    for i in range(1,20000):        yield '第%s件衣服'%(i)ret = make_cloth()print(next(ret))print(next(ret))print(next(ret))for i in range(100):    print(next(ret))
import timedef tail(filename):    f = open(filename)    f.seek(0, 2) #从文件末尾算起    while True:        line = f.readline()  # 读取文件中新的文本行        if not line:            time.sleep(0.1)            continue        yield linetail_g = tail('tmp')for line in tail_g:    print(line)生成器监听文件例子

六、yield  from

def func():    # for i in 'AB':    #     yield i    yield from 'AB'     yield from 'AB'就相当于上面的for循环,吧循环简化了    yield from [1,2,3]g=func()print(list(g))# print(next(g))# print(next(g))
yield from

七、列表推导式:

# ======一层循环======l = [i*i for i in range(1,10)]print(l)# 上面的列表推倒式就相当于下面的l  = []for i in range(1,10):    l.append(i*i)print(l)l = []# ======多层循环========# 1.列表推倒式l = [i*j for i in range(1,10) for j in range(1,10)]print(l)# 2.循环l = []for i in range(1,10):    for j in range(1,10):        s = i*j        l.append(s)print(l)
View Code

八、生成器表达式:类似于列表推倒式,就是把列表推导式的【】改为了()

l=[{
'name':'v1','age':'22'},{
'name':'v2'}]name_list=(dic['name'] for dic in l)#吧列表生成器的[]改成()print(name_list)#取出的是一个生成器,而不是要取得值,所以得加上nextprint(next(name_list))print(next(name_list))# print(next(name_list))
生成器表达

 

转载于:https://www.cnblogs.com/d97272015/p/8719227.html

你可能感兴趣的文章
【hive】——Hive sql语法详解
查看>>
python 全栈开发,Day50(Javascript简介,第一个JavaScript代码,数据类型,运算符,数据类型转换,流程控制,百度换肤,显示隐藏)...
查看>>
一篇网络流的好blog
查看>>
Python基础之继承与派生
查看>>
filter、map、every函数的使用
查看>>
黑马程序员——iOS学习——UITableView表视图单元样式
查看>>
Bash基础——减号-
查看>>
Android适配文件dimen自动生成代码
查看>>
走马观花--快餐学python笔记
查看>>
jquery轻量级富文本编辑器Trumbowyg
查看>>
VMware Workstation 不可恢复错误 (vcpu-0)
查看>>
数据对齐笔记
查看>>
Linux 常用命令
查看>>
Web应用配置虚拟主机(www.baidu.com)
查看>>
还为代码编写愁吗?代码生成器将让你编写代码测试代码速度极大提升
查看>>
菜单联动
查看>>
(二十八)static关键字
查看>>
PLSQL_PLSQL读和写XML文件方式(案例)
查看>>
Asp.Net 网站访问人数及在线人数
查看>>
[转]LCD之调色板
查看>>