函数4—迭代器与生成器

基础概念迭代器:    为什么: 提供了一种不依赖于索引的取值方式,如字典,集合,文件等没有索引的类型需要循环取出元素             迭代器是惰性计算,更节省内存,迭代器在内存中只是一个内存地址,一次只取一个值

缺点:永远无法获取迭代器的长度,使用不如列表索引取值灵活          一次性的,只能往后取值    可迭代的:对象本身有__iter__方法    i = iter(n)   or  i = n.__iter__()     i 为n的迭代器    next(i)   or  i.__next__()             利用迭代器输出内容,一次输出一个

生成器:     定义:   函数中包含yield语句        将生成器函数(有yield)返回的g作为迭代器使用,这个g就是生成器, 每次next生成器,就执行一次函数        即 将整个函数作为迭代器     yield与return 的区别:        return只能执行一次函数就彻底结束,yield 能多次返回值     yield的作用:                把函数的返回值变成迭代器 ---------》生成器                将iter  next函数封装到函数内部, 将函数变为一个迭代器对象(将函数变成了一个类似序列类型的对象)                多次输出函数运行结果                每次触发就运行一次函数,保存函数在暂停及继续下一次运行时的状态

协程函数  本质是一种生成器函数,函数中的yield由表达式所写      面向过程编程的主要形式       e.send()  与 next(e)的区别:           二者的共同之处是度可以让函数在上次暂停的位置继续运行           二者都可以返回yield后面的返回值           如果函数内yield是表达式形式,那么必须先next(e)           send在触发下一次next的时候会给上次的yield传值所有的生成器函数都只能通过next  send  和for循环来逐次运行函数,且生成器函数本身不会运行

迭代器 与生成器的相同:生成器是迭代器的一种,生成器具有迭代器全部的功能   惰性计算                 不同:                      迭代器只是每次返回一个已知序列的值                      生成器保存了一个算法,比迭代器多了一个功能是边运行边计算,返回一个运算过的序列的值

迭代器---------->生成器---------->生成器的表达式应用:协程函数----------->面向过程的编程:利用了函数式编程的思想
l = [‘a‘,‘b‘,‘c‘,‘d‘]#while循环列表i =0while i < len(l):    print(l[i])    i += 1# for 循环列表for i in range(len(l)):      #使用索引取出元素    print(l[i])

for i in l:   #使用for自带的迭代器取出元素    print(i)

d = {‘a‘:1,‘b‘:2,‘c‘:3}#while 循环字典g = d.__iter__()         #迭代器gprint(type(g))while True:    try:   #捕捉异常        print(next(g))     #迭代器的方法__next__()    except StopIteration:        break

#for 循环字典

for i in g:   #g已经是一个迭代器,但for循环中的自动转迭代器不会影响遍历字典    print(i)

for i in d:    #for循环内包含了iter ,next ,和 自动捕捉异常的函数    print(i)

#while循环文件while True:    try:        print(next(f))    except StopIteration:        break#for循环文件with open(‘a.txt‘) as f:    for line in f:        print(line.strip())

f = open(‘a.txt‘)f.__iter__()            #文件本身就是一个迭代器print(f.__next__())

s = ‘hello‘l = [1,2,3]t = (1,2,3)d = {‘a‘:1}s = {‘a‘,‘b‘}f = open(‘a.txt‘)# 查看可迭代对象from collections import Iterables.__iter__()print(isinstance(l,Iterable))#查看迭代器对象from collections import Iteratorf.__next__()print(isinstance(l,Iterator))

#生成器def test():               #生成器函数    print(‘one‘)    yield 1    print(‘two‘)    yield 2    print(‘three‘)    yield 3    print(‘four‘)    yield 4    print(‘five‘)g = test()     #返回一个生成器 同时也是一个迭代器,可以作为迭代器使用

g.__next__()g.__next__()g.__next__()g.__next__()#生成器的应用def countdown(n):    print(‘start‘)    while n > 0:        yield n        n -= 1    print(‘done‘)g = countdown(5)

# 生成器中迭代器的应用print(next(g))print(next(g))print(next(g))print(next(g))print(next(g))

while True:    try:        print(next(g))    except StopIteration:        break

for i in g:    print(i)#生成器有个迭代器的属性:惰性计算  如下函数  生成器可以一直运行,而且内存不会卡def func():    n = 0    while True:        yield n        n += 1g = func()#print(next(f))for i in g:    print(i)

print(isinstance((x for x in range(10)),Iterable))#生成器应用:随时监听文件中的错误日志#/usr/bin/env pythonimport timedef tail(file_path):    with open(file_path) as f:        f.seek(0,2)        while True:            line = f.readline()            if not line:                time.sleep(0.5)                continue            else:                #print(line,end=‘‘)                yield linedef grep(pattern,lines):    for line in lines:        if pattern in line:            yield lineg1=tail(‘/tmp/a.txt‘)g2=grep(‘error‘,g1)for i in g2:    print(i)

#生成器的表达式应用:协程函数def eater(name):    print(‘%s start to eat food‘%name)    food_list=[]    while True:                            #必须加while循环,为每次生成器发送的值创造循环条件        food = yield food_list        print(‘%s got %s to start eat‘%(name,food))        food_list.append(food)    print(‘done‘)

e = eater(‘gangdan‘)

print(next(e))print(e.send(‘baozi‘))        #生成器在向函数发送参数时,以元组的形式发送,所以发送多个参数时,要加上()表示元组print(e.send(‘miantiao‘))print(e.send(‘mifan‘))

#为生成器添加装饰器def nextn(func):    def wrapper(*args,**kwargs):        res = func(*args,**kwargs)        next(res)        return res    return wrapper@nextndef eater(name):    print(‘%s start to eat food‘%name)    food_list=[]    while True:        food = yield food_list        print(‘%s got %s to start eat‘%(name,food))        food_list.append(food)    print(‘done‘)

e = eater(‘liuliu‘)e.send(‘baozi‘)
#迭代器应用:实现功能 cat a,txt | grep appleimport timedef cat():    while True:        with open(‘a.txt‘) as f:            lines = f.readline()            if not lines:                time.sleep(1)                continue            else:                yield lines

def grep(pattern,lines):    for i in lines:        if pattern in i:            print(i)            exit()

g = cat()grep(‘apple‘,g)

#生成器应用: 把下面的函数改成生成器的形式,执行生成器函数得到一个生成器g,然后每次g.send(url),#              打印页面内容,利用g可以无限sendfrom urllib.request import urlopendef opener(url):    while True:        print(urlopen(url).read())        url=yieldg = opener(‘http://www.baidu.com‘)next(g)g.send(‘http://www.360.com‘)

def get(url):    while True:        def index():            res = urlopen(url).read()            print(res)        index()        url = yield

g = get(‘http://www.baidu.com‘)next(g)g.send(‘http://www.360.com‘)
时间: 2024-10-20 11:41:54

函数4—迭代器与生成器的相关文章

python函数:迭代器和生成器

python函数:迭代器和生成器 迭代器和生成器是函数中的一大重点,务必掌握,何为迭代?何为迭代器? 预习: 处理文件,用户指定要查找的文件和内容,将文件中包含要查找内容的每一行都输出到屏幕(使用生成器) 一.迭代器 for i in 50:     print(i) #运行结果: # Traceback (most recent call last): #   File "G:/python/python代码/八月/day2 迭代器生成器/3迭代器.py", line 8, in &

重修课程day12(函数之迭代器和生成器)

一  迭代器 集合的目的:去重,关系运算. # a={1,2,3,4,5,6,7} # b={41,52,5,26,7,4,2,9,} # print(a-b) isinstance:判断数据的类型,还可以判断是否可迭代. iterable:形容词  可迭代的:from collections import Iterable:用来检测一个对象是否可以迭代. # from collections import Iterable # print(isinstance('fadda',Iterable

Learn Python—函数(迭代器、生成器)

迭代器iterator 可迭代协议-只要含有__iter__方法的,都是可迭代的iterable 迭代器协议-内部含有__next__方法和__iter__方法的就是迭代器 只要能被for循环的数据类型,就一定拥有__iter__方法,for循环其实就是在使用迭代器 只要是迭代器就一定可以迭代 可迭代对象.__iter__() == 迭代器 迭代器中的__next__()方法可以一个一个的获取值 迭代器对象可以使用常规for语句进行遍历: list=[1,2,3,4] it = iter(lis

函数四--迭代器和生成器

一.迭代器 迭代器协议:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么引起一个StopIteration异常,以终止迭代(只能往后走,不能往前走). 实现了迭代器协议的对象(对象内部定义了一个__iter__()方法) python中的内部工具(如for循环,sum,min,max函数等)都是基于迭代器协议访问对象 只要含有__iter__方法的都是可迭代的-----可迭代协议:迭代器协议:内部含有__next__和__iter__方法的就是迭代器 只要是迭代器就一定可迭代

Python基础——函数的迭代器和生成器

等待更新…………………… 后面再写 原文地址:https://www.cnblogs.com/mashangsir/p/11330235.html

python函数、装饰器、迭代器、生成器

5月21日,请假结婚,然后性格惰性来了,不怎么想看视频和笔记,性格中的弱点开始出现,开始做的不错,渐渐开始松懈,直至放弃--- 函数补充进阶 函数对象 函数的嵌套 名称空间与作用域 闭包函数 函数之装饰器 函数之迭代器 函数之生成器 内置函数 一.函数补充进阶 1.函数对象:  函数是第一类对象,即函数可以当作数据传递,它的应用形式也被称为高阶函数,函数的特性如下: a. 可以被引用 1 # def foo(): 2 # print('from foo') 3 # 4 # func = foo

迭代器和生成器函数

引入: l = [1,2,3,4,5] s = {1,2,3,4} for i in l: print(i) 如果代码是: for i in 50: print(i) 这个运行不了.输出结果是 'int' object is not iterable iterable是可迭代的意思. 哪些可以迭代呢?这些可以str.list.tuple.set.dic等 可迭代的标志是  _iter_. 那我们如何判断是否可以迭代呢? print('__iter__' in dir([1,2,3])) 双下划线

python迭代器和生成器(3元运算,列表生成式,生成器表达式,生成器函数)

1.1迭代器 什么是迭代器: 迭代器是一个可以记住遍历的位置对象 迭代器对象从集合的第一个元素元素开始访问,直到所有元素被访问完结束,迭代器只能往前不会后退. 迭代器有两个基本方法:iter ,next 方法 内置函数iter(),next()  本质上都是用的对象.__iter__(),__next__()的方法 内置函数 iter(iterable),表示把可迭代对象 变成迭代器(iterator) 内置函数next(iterator) ,表示查看下一次迭代的值(当然也可以用 iterato

python基础----迭代器、生成器、协程函数

一.什么是迭代器协议 1.迭代器协议是指:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就引起一个StopIteration异常,以终止迭代 (只能往后走不能往前退) 2.可迭代对象:实现了迭代器协议的对象(如何实现:对象内部定义一个__iter__()方法) 3.协议是一种约定,可迭代对象实现了迭代器协议,python的内部工具(如for循环,sum,min,max函数等)使用迭代器协议访问对象. 二,为什么要用迭代器 优点: 1:迭代器提供了一种不依赖于索引的取值方式,