生成器和面向编程
admin
2023-07-20 23:02:25
0
            生成器
只要在函数体内出现yield关键字,那么再执行函数就不会执行函数代码,会得到一个结果,该结果就是生成器。
生成器就是迭代器。
def foo():
    print('add')
    yield 1
    print('sidhi')
    yield 2
g=foo()
next(g)

res1=next(g)
print(res1)

yield的功能:
1.yield为我们提供了一种自定义迭代器对象的方法。
2.yield与retuen的区别,yield可以返回多次值,所以函数的暂停与继续的转态由yield帮我们保存的。

例:range的编写 #range(1,10,2)
def bar(x,y,z):
    while x <= y:
        yield x              
        x+=z
g=bar(1,10,2)       
print(next(g))

案例:编写tail -f error.log |grep 'abc'
import time 
def foo(file):
    with open(file,'rb') as f:
        f.seek(0,2)  #光标直接到末尾
        while Ture:
            line=f.readline()  #.readline()每次只读一行
            if line:
                yield line
            else:
                time.sleep(0.03)    

def grep(line,pater):
for i in line:
    i=i.decode('utf-8')
    if pater in i:
        yield i

g=grep(foo('error.log'),'abc')
for i in g:
    print(i)

yiled表达式形式的用法:
def foo():
    print('%s is pig' %name)
    while Ture:
        bar=yield    #bar=yield='1111'
        print('%s is pig %s' %(name,bar))

g=foo('abc')
netx(g)  #初始化,也可以使用g.send(None)
然后g.send(),从代码执行到暂停的位置再将值传给yield ,与next一样。
g.send('1111')
g.send('2222')

面向过程编程:  过程指的是解决问题的步骤,即先设计框架,基于该思路编写程序,是一种机械式方式。
优点:复杂问题流程化,进而简单化。
缺点:可扩展性差

案例:编写grep -rl 'python' /etc
import os  
def init(funce):
    def titi(*args,**kawrgs):
        g=funce(*args,**kawrgs)
        next(g)
        return g
    return titi
@init #foo=titi

def foo(targrt):
    while Ture:
        path_a=yield
        g=os.wal(path_a)  #绝对路径模块
        for a,b,c in g:
            for c1 in c:
                abc_path=r'%s/%s ' %s(a,c)
                targrt.send(abc_path)
@init   
def opener(targrt):
    while Ture:
        abc_path=yield
        with open(abc_path,'rb') as f:
            targrt.send(abc_path,f)

@init 
def cat(targrt):
    while Ture:
        abc_path,f=yield
        for line in f:
            res=targrt.send((abc_path,line))
            if res:
                  break

@init
def grep(targrt,pate):
    pate=pate.encode('utf-8')
    res=False
    while Ture:
        abc_path,line=yield res
        res=False 
        if pate  in line:
            res=Ture
            targrt.send(abc_path)   

@init
def printer():
    while Ture:
        abc_path=yield
        print('%s' %abc_path)

g=foo(opener(cat(grep(printer(),'python'))))
g.send(r'/home')

相关内容

热门资讯

电脑为什么没声音怎么办 电脑没有声音是一个比较常见的问题,在日常的使用中难免会碰到这种情况。下面我将从硬件和软件两个方面介绍...
石家庄电视机故障 石家庄市是河北省的省会城市,也是一个经济、文化和交通中心,拥有良好的基础设施和发达的经济。在这个城市...
春兰空调维修价格表 对于春兰空调的维修价格表,需要根据具体的故障情况进行评估。下面介绍一些常见的春兰空调维修项目及价格参...
惠而浦空调j1故障 惠而浦空调j1故障通常指的是室外机的故障。该故障可能会导致空调无法正常运行,需要进行修理或更换故障部...
志高空调显示p7怎么办 志高空调显示P7是指空调室内温度传感器失效造成的故障。这种故障会导致空调不能正常运作,用户需要及时处...
英国两列火车相撞,目击者:有人... 据凤凰卫视报道,英国中部贝德福德地区6月19日发生两列火车相撞事故,已造成1人死亡,89人受伤。当地...
中介费12万、彩礼26万,男子... 近日,《今日说法》栏目播出一起婚恋诈骗案:2025年年初,河南省南阳市社旗县的刘峰(化名)经网络婚介...
奥巴马质疑特朗普:伊朗战争后,... 当地时间6月19日,美国全国广播公司(NBC)《今日秀》节目播出对美国前总统奥巴马的采访。奥巴马对特...
假期打虎!朱昌杰被查 中央纪委国家监委网站讯 新疆维吾尔自治区政府原党组成员、副主席朱昌杰涉嫌严重违纪违法,目前正接受中央...
王树国:福耀科技大学数学用的是... 2025年高考招生季,福耀科技大学面向福建、河南、江西、湖南、广西五省(自治区)共招收50名优秀本科...