Python(day8)迭代器、生成器

一 什么是迭代

1 重复

2 下一次重复是基于上一次的结果

# while True:
#     cmd=input(‘>>: ‘)
#     print(cmd)

# l=[‘a‘,‘b‘,‘c‘,‘d‘]
# count=0
# while count < len(l):
#     print(l[count])
#     count+=1

#
# l=[‘a‘,‘b‘,‘c‘,‘d‘]
# for count in range(len(l)):
#     print(l[count])

# d={‘a‘:1,‘b‘:2,‘c‘:3}
#
# for k in d:
#     print(k)

python为了提供一种不依赖于索引的迭代方式,
python会为一些对象内置__iter__方法
obj.__iter__称为可迭代的对象

二 可迭代对象:obj.__iter__

三 迭代器:iter1=obj.__iter__()

1 iter1.__next__

2 iter1.__iter__

iter1.__next__()

迭代器的优点
1:提供了一种不依赖于索引的取值方式
2:惰性计算。节省内存

迭代器的缺点:
1:取值不如按照索引取值方便
2:一次性的。只能往后走不能往前退
3:无法获取长度

l=[1,2,3]
for item in l: #i=l.__iter__()
    print(item)
l=[‘x‘,‘y‘,‘z‘]
# print(l[2])
# print(l[0])

# i=l.__iter__()
# print(i.__next__())
# print(i.__next__())
# print(i.__next__())

  

#得到的迭代器:既有__iter__又有一个__next__方法
# d={‘a‘:1,‘b‘:2,‘c‘:3}
#
# i=d.__iter__() #i叫迭代器
# print(i)
# print(i.__next__())
# print(i.__next__())
# print(i.__next__())
# print(i.__next__()) #StopIteration

  

  

iterator判断是否为迭代器对象

iterabl判断是否为可迭代对象

迭代对象需要.__iter__()转换成迭代器,才能迭代

迭代器对象可以直接迭代

迭代器的应用:

1 提供了一种不依赖索引的统一的迭代方法

2 惰性计算,比如取文件的每一行

四、生成器

1、生成器函数:函数体内包含有yield关键字,该函数执行的结果是生成器

def foo():
    print(‘first------>‘)
    yield 1
    print(‘second----->‘)
    yield 2
    print(‘third----->‘)
    yield 3
    print(‘fouth----->‘)

g=foo()

2、生成器就是迭代器

 

# print(g.__next__())
# print(g.__next__())
# print(g.__next__())
# print(g.__next__())

# for i in g: #obj=g.__iter__() #obj.__next__()
#     print(i)

3、

yield的功能:
1.与return类似,都可以返回值,但不一样的地方在于yield返回多次值,而return只能返回一次值
2.为函数封装好了__iter__和__next__方法,把函数的执行结果做成了迭代器
3.遵循迭代器的取值方式obj.__next__(),触发的函数的执行,函数暂停与再继续的状态都是由yield保存的

def countdown(n):
    print(‘starting countdown‘)

    while n > 0:
        yield n
        n-=1
    print(‘stop countdown‘)
g=countdown(5)
# print(g)
# print(g.__next__())
# print(g.__next__())
# print(g.__next__())
# print(g.__next__())
# print(g.__next__())
# print(g.__next__())

#
# for i in g:
#     print(i)

例题:

#1 编写 tail -f a.txt |grep ‘error‘ |grep ‘404‘命令,周一默写
import time
def tail(filepath,encoding=‘utf-8‘):
    with open(filepath,encoding=encoding) as f:
        f.seek(0,2)
        while True:
            line=f.readline()
            if line:
                yield line
            else:
                time.sleep(0.5)

def grep(lines,pattern):
    for line in lines:
        if pattern in line:
            #print(line)
            yield line

g1=tail(‘a.txt‘)
g2=grep(g1,‘error‘)
g3=grep(g2,‘404‘)
for i in g3:
    print(i)

总结:

1.迭代器协议是指:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就引起一个StopIteration异常,以终止迭代 (只能往后走不能往前退)

2.可迭代对象:实现了迭代器协议的对象(如何实现:对象内部定义一个__iter__()方法)

3.协议是一种约定,可迭代对象实现了迭代器协议,python的内部工具(如for循环,sum,min,max函数等)使用迭代器协议访问对象。

4.for循环的本质:循环所有对象,全都是使用迭代器协议。

5.(字符串,列表,元组,字典,集合,文件对象)这些都不是可迭代对象,只不过在for循环式,调用了他们内部的__iter__方法,把他们变成了可迭代对象

然后for循环调用可迭代对象的__next__方法去取值,而且for循环会捕捉StopIteration异常,以终止迭代

6.生成器:可以理解为一种数据类型,这种数据类型自动实现了迭代器协议(其他的数据类型需要调用自己内置的__iter__方法),所以生成器就是可迭代对象

7.可以理解为一种数据类型,这种数据类型自动实现了迭代器协议(其他的数据类型需要调用自己内置的__iter__方法),所以生成器就是可迭代对象

8.为何使用生成器之生成器的优点

Python使用生成器对延迟操作提供了支持。所谓延迟操作,是指在需要的时候才产生结果,而不是立即产生结果。这也是生成器的主要好处。

9.生成器小结:

1).是可迭代对象

2).实现了延迟计算,省内存啊

3).生成器本质和其他的数据类型一样,都是实现了迭代器协议,只不过生成器附加了一个延迟计算省内存的好处,其余的可迭代对象可没有这点好处

时间: 2024-10-08 09:45:01

Python(day8)迭代器、生成器的相关文章

python 【迭代器 生成器 列表推导式】

python [迭代器  生成器  列表推导式] 一.迭代器 1.迭代器如何从列表.字典中取值的 index索引 ,key for循环凡是可以使用for循环取值的都是可迭代的可迭代协议 :内部含有__iter__方法的都是可迭代的迭代器协议 :内部含有__iter__方法和__next__方法的都是迭代器 print(dir([1,2,3])) lst_iter = [1,2,3].__iter__() print(lst_iter.__next__()) print(lst_iter.__ne

python之迭代器生成器和内置函数,匿名函数

今天学习了迭代器生成器以及内置函数和匿名函数,说实话有些懵圈,有些难度了. 一.迭代器和生成器 1.如何从列表.字典中取值的: index索引 for循环 凡是可以使用for循环取值的都是可迭代的 (1)可迭代协议:内部含有__iter__方法的都是可迭代的 (2)迭代器协议:内部含有__iter__方法和__next__方法的都是迭代器 什么是可迭代的:内部含有__iter__方法的都是可迭代的 什么是迭代器:迭代器=iter(可迭代的),自带一个__next__方法 可迭代最大的优势:节省内

【Python】 迭代器&amp;生成器

迭代器 任何一个类,只要其实现了__iter__方法,就算是一个可迭代对象.可迭代对象的__iter__方法返回的对象是迭代器,迭代器类需要实现next方法.一般来说,实现了__iter__方法的类肯定还会顺便实现next方法,也就是说这个类既是一个可迭代对象也是个迭代器. 一个迭代器ite可用ite.next()方法来返回其定义好的以某种算法找到的下一个元素,内建的iter(...)函数可把可迭代对象转化为迭代器.最常见的利用可迭代对象和迭代器的就是for语句了: for item in it

[python]--迭代器,生成器补充

在python中,list,string,dict都是可迭代对象,可以通过for语句遍历. 迭代器 迭代器对象要求支持迭代器协议的对象,在python中,支持迭代器协议就算实现对象的__iter__()和next()方法.其中__iter__()方法返回迭代器对象本身; next()方法返回容器的下一个元素,在结尾时引发StopIteration异常 __iter__()和next()方法 这两个方法是迭代器最基本的方法,一个用来获得迭代器对象,一个用来获取容器中的下一个元素. 对于可迭代对象,

python中的生成器和迭代器

1. 迭代器 迭代器是访问集合元素的一种方式.迭代器对象从集合的第一个元素开始访问,知道所有的元素被访问完结束.迭代器只能往前不会后退,不过这也没什么,因为人们很少在迭代途中往后退. 1.1 使用迭代器的优点 对于原生支持随机访问的数据结构(如tuple.list),迭代器和经典for循环的索引访问相比并无优势,反而丢失了索引值(可以使用内建函数enumerate()找回这个索引值).但对于无法随机访问的数据结构(比如set)而言,迭代器是唯一的访问元素的方式. 另外,迭代器的一大优点是不要求事

python 迭代器 生成器 (转)

转帖: 原文写的不错! 原文地址:http://www.cnblogs.com/kaituorensheng/p/3826911.html#_label0 阅读目录 1. 迭代器 2. 生成器 3. 参考 回到顶部 1. 迭代器 迭代器是访问集合元素的一种方式.迭代器对象从集合的第一个元素开始访问,知道所有的元素被访问完结束.迭代器只能往前不会后退,不过这也没什么,因为人们很少在迭代途中往后退. 1.1 使用迭代器的优点 对于原生支持随机访问的数据结构(如tuple.list),迭代器和经典fo

Python的迭代器与生成器

Python中的生成器和迭代器方便好用,但是平时对生成器和迭代器的特性掌握的不是很到位,今天将这方面的知识整理一下. 迭代器 为了更好的理解迭代器和生成,我们需要简单的回顾一下迭代器协议的概念. 迭代器协议 1.迭代器协议是指:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就引起一个StopIteration异常,以终止迭代 (只能往后走不能往前退) 2.可迭代对象:实现了迭代器协议的对象(如何实现:对象内部定义一个__iter__()方法) 3.协议是一种约定,可迭代对象

Python(四)装饰器、迭代器&生成器、re正则表达式、字符串格式化

本章内容: 装饰器 迭代器 & 生成器 re 正则表达式 字符串格式化 装饰器 装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志.性能测试.事务处理等.装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量函数中与函数功能本身无关的雷同代码并继续重用.概括的讲,装饰器的作用就是为已经存在的对象添加额外的功能. 先定义一个基本的装饰器: ########## 基本装饰器 ########## def orter(func):    #定义装饰器     de

Python之迭代器、生成器、装饰器和递归

一.迭代器&生成器 1.迭代器 迭代器是访问集合元素的一种方式.迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束. 迭代器只能往前不会后退,迭代器的一大优点是不要求事先准备好整个迭代过程中所有的元素.迭代器仅仅在迭代到某个元素时才计算该元素,而在这之前或之后,元素可以不存在或者被销毁.这个特点使得它特别适合用于遍历一些巨大的或是无限的集合,比如几个G的文件 特点: 访问者不需要关心迭代器内部的结构,仅需通过next()方法不断去取下一个内容 不能随机访问集合中的某个值 ,只能从头

4.python的迭代器与生成器

一.什么玩意是迭代器? 先说说什么是迭代吧,迭代就是一件事情重复很多次,比如说for循环. for循环可以对一切有__iter__方法的对象进行迭代,那么什么是__iter__方法呢? 一个对象是否可迭代,全都取决于这个对象是否有__iter__方法,调用对象的__iter__方法,就回返回一个迭代器,这个迭代器一定具有next方法,在调用这个迭代器的next方法时,迭代器就回返回它的下一个值,当迭代器中没有值可以返回了,就回抛出一个名为StopIteration的异常,停止迭代. 迭代器还有个