Day9:yield的表达式形式、面向过程编程(grep -rl 'root' /etc)

一.yield的表达式

def foo():
    print(‘starting‘)
    while True:
        x=yield None#return 2
        print(‘value :‘,x)
g=foo()
print(next(g))
print(g.send(2))

运行结果:
starting  #运行函数,打印starting后碰到yield停住
None    #next()触发后 yield将None赋值给x,打印None后循环碰到yield停住
value : 2  #g.send(2)将2赋值给yield,yield将2赋值给x,继续循环打印出2碰到yield停住
None      #碰到yield停住并返回None,print的结果就是None

以上将yield接受到的值赋值给了x,这样形式就叫做yield的表达式形式。

函数foo中有yield,那它就是迭代器。可以使用next()。yield可以返回结果,默认为None。

g.send()前生成器必须先next一次才能发送值。所以写一个装饰器,让foo自动next一次。

def init(func):
    def wrapper(*args,**kwargs):
        g=func(*args,**kwargs)
        next(g)
        return g
    return wrapper

@init #foo=init(foo)
def foo():
    print(‘starting‘)
    while True:
        x=yield
        print(‘value :‘,x)
g=foo() #wrapper()
g.send(2)

运行结果:
starting
value :2

send的效果:
1:先从为暂停位置的那个yield传一个值,然后yield会把值赋值x
2:与next的功能一样

# _*_ coding:utf-8 _*_
def init(func):
    def wrapper(*args,**kwargs):
        g=func(*args,**kwargs)
        next(g)
        return g
    return wrapper
@init
def eater(name):
    print(‘%s ready to eat‘%name)
    food_list=[]
    while True:
        food=yield food_list
        food_list.append(food)
        print(‘%s start to eat %s‘%(name,food))

e=eater(‘alex‘)
print(e.send(‘food1‘))
print(e.send(‘food2‘))
print(e.send(‘food3‘))

运行结果:
alex ready to eat
alex start to eat food1
[‘food1‘]
alex start to eat food2
[‘food1‘, ‘food2‘]
alex start to eat food3
[‘food1‘, ‘food2‘, ‘food3‘]

二.面向过程编程

应用:grep -rl ‘root‘  /etc

实现打印出/etc目录下所有包含‘root’的文件的文件路径

分析完成功能的阶段:

阶段一:递归地找出目录下所有文件的绝对路径,把路径发给阶段二

阶段二:收到文件路径,打开文件获取文件对象,把文件对象发给阶段三

阶段三:收到文件对象,for循环读取文件的每一行内容,把每一行内容发给阶段四

阶段四:收到一行内容,判断root是否在这一行中,如果在,则把文件名发给阶段五

阶段五:收到文件名,打印结果

import os
#装饰器,自动next()
def init(func):
    def wrapper(*args,**kwargs):
        g = func(*args,**kwargs)
        next(g)
        return g
    return wrapper
#j阶段一:递归地找出目录下所有文件的绝对路径,把路径发给阶段二
@init
def search(target):
    ‘search file abspath‘
    while True:
        start_path=yield
        g = os.walk(start_path)
        for par_dir,_,files in g:
            for file in files:
                file_path = r‘%s\%s‘ %(par_dir,file)
                target.send(file_path)
#阶段二:收到文件路径,打开文件获取文件对象,把文件对象发给阶段三
@init
def opener(target):
    while True:
        file_path = yield
        with open(file_path,encoding = ‘utf-8‘) as f:
            target.send((file_path,f))
#阶段三:收到文件对象,for循环读取文件的每一行内容,把每一行内容发给阶段四
@init
def cat(target):
    while True:
        file_path,f = yield
        for line in f:
            res=target.send((file_path,line))
            if res:
                break
#阶段四:收到一行内容,判断root是否在这一行中,如果在,则把文件名发给阶段五
@init
def grep(target,pattern):
    tag=False
    while True:
        filepath,line=yield tag
        tag=False
        if pattern in line:
            target.send(filepath)
            tag=True
#阶段五:收到文件名,打印结果
@init
def printer():
    while True:
        filename = yield
        print(filename)
start_path = r‘E:\PycharmProjects\qz5\day9‘
# search(opener(cat(grep(printer(),‘Jack‘))),start_path)
g=search(opener(cat(grep(printer(),‘Jack‘))))
g.send(start_path)

Day9:yield的表达式形式、面向过程编程(grep -rl 'root' /etc)

时间: 2024-10-29 10:46:15

Day9:yield的表达式形式、面向过程编程(grep -rl 'root' /etc)的相关文章

yield的表达式形式、面向过程编程(grep -rl 'root' /etc)

一.yield的表达形式 def foo(): print('starting') while True: x=yield None#return 2 print('value :',x) g=foo() print(next(g)) print(g.send(2)) 运行结果: starting #运行函数,打印starting后碰到yield停住 None #next()触发后 yield将None赋值给x,打印None后循环碰到yield停住 value : 2 #g.send(2)将2赋

Python基础第十天——yield的表达式形式的应用、面向过程编程、内置函数

鸡汤: 首先,我一定要怀着一颗感恩的心,感谢这个世界上与我接触的人,不管你们对我是关心.是帮助.是冷漠.甚至是厌恶,我都感谢你们. 因为关心和帮助让我感受到了对爱的希望, 因为冷漠和厌恶让我感悟到了人生的残酷, 让恨的怒气和爱的力量化作一股永生不灭的的动力,使我在这条未知的人生道路上   继续写下新的篇章. --奔跑吧小白 一.yield的表达式形式的应用 send():具有传值和next的效果.先暂停的位置传值,再next生成器 send(None):表示不传值,只有next的效果,相当于直接

python函数(五)—yield的表达式形式

函数体内含有yield关键字,那该函数的执行结果是生成器对象 生成器对象的本质就是迭代器,所以yield的功能是 1.把函数的执行结果做成迭代器 2.可以返回多次值,而return只能返回一次值 3.可以挂起函数的执行 ======================================= yield语句形式 yield 1 yield的表达式形式 x=yield next(g) g.send('xxx') 示例 def deco(func): def wrapper(*args,**k

yield的表达式形式与内置函数

yield的功能: 1. 与return类似,都可以返回值,不一样在于,yield可以返回多个值而且可暂停,再次执行可继续下一步操作,return到了就停止不在继续运行. 2.为封装好的的函数能够使用__iter__和__next__方法, 3.遵循迭代器的取值方式 .__next__(),触发函数的执行和函数的保存都是通过yeild保存的.  . 一:yield的表达式形式 def foo(): print('starting') while True: x=yield #yield的表达式形

Python基础------生成器表达式形式、面向过程编程、内置函数部分

生成器表达式形式 直接上代码 1 # yield的表达式形式 2 def foo(): 3 print('starting') 4 while True: 5 x=yield #默认返回为空,实际上为x=yield None 6 print('value',x) 7 g=foo() 8 print(g.__next__()) #停到yield位置,生成器初始化,遇到yield返回一个None 9 print('---分割线君---') 10 print(g.send(1)) #传值给yield,

python基础之生成器表达式形式、面向过程编程、内置函数部分

生成器表达式形式 直接上代码 1 # yield的表达式形式 2 def foo(): 3 print('starting') 4 while True: 5 x=yield #默认返回为空,实际上为x=yield None 6 print('value',x) 7 g=foo() 8 print(g.__next__()) #停到yield位置,生成器初始化,遇到yield返回一个None 9 print('---分割线君---') 10 print(g.send(1)) #传值给yield,

22、yield表达式形式和面向过程编程

一 yield的表达式 def foo(): print('starting') while True: x=yield None#return 2 print('value :',x) g=foo() print(next(g)) print(g.send(2)) 运行结果: starting #运行函数,打印starting后碰到yield停住 None #next()触发后 yield将None赋值给x,打印None后循环碰到yield停住 value : 2 #g.send(2)将2赋值

yield表达式形式

首先了解 1.iterator iterator叫做迭代器,用来遍历可以序列化的数据,比如一个list,set 等,当然如果对象想要能够使用迭代器来遍历,只要在该对象的类中添加__iter__()方法,该方法返回一个迭代器对象,迭代器对象中需要实现next()方法 for example: >>> class sequenceClass(object):   ...     def __init__(self, *args):   ...             self._data =

day22:yield的表达形式,面向过程变成

一.yield的表达形式 def foo(): print('starting') while True: x=yield None#return 2 print('value :',x) g=foo() print(next(g)) print(g.send(2)) 运行结果: starting #运行函数,打印starting后碰到yield停住 None #next()触发后 yield将None赋值给x,打印None后循环碰到yield停住 value : 2 #g.send(2)将2赋