zoukankan      html  css  js  c++  java
  • Day 22 生成器yield表达式及内置函数(一丢丢)

     

    本日知识点:

    ###################################
    #一、上节课复习:在for循环式,调用对象内部的__iter__方法,
    #       把他们变成了可迭代对象然后for循环调用可迭代对象的__next__方法去取值,
    #       而且for循环会捕捉StopIteration异常,以终止迭代
    ###################################
    
    # def func(n):
    #     while n > 0:
    #         yield n
    #         print("*"*6)
    #         n -= 1
    #
    # g=func(5)
    # #第一个
    # print(next(g))
    # print(next(g))
    # print(next(g))
    # print(next(g))
    # print(next(g))
    # #第二个 等价于前面第一个
    # for i in g: #next(g)
    #     print(i)
    
    ###################################
    #二、send的效果:
        # 1:先从为暂停位置的那个yield传一个值,然后yield会把值赋值x
        # 2:与next的功能一样
        #注意:要先启动,执行到yield的位置处
    ###################################
    
    # def init(func):
    #     '''
    #     装饰器:预启动生成器,到位置yield处,以便send传值
    #     :param func:
    #     :return:
    #     '''
    #     def wrapper(*args,**kwargs):
    #         g=func(*args,**kwargs)
    #         next(g)
    #         return g
    #     return wrapper
    #
    # @init #foo=init(foo)
    # def foo():
    #     '''
    #     函数:测试send对yield的传值效果
    #     :return:
    #     '''
    #     print('starting')
    #     while True:
    #         print("*"*8)
    #         x=yield #return 1
    #         print("8"*8)
    #         print('value :   ',x)
    #
    # 测试部分:**********************************
    # g = foo()
    # print(next(g))            #赋值后,迭代器开始迭代
    # print(next(g))
    
    # print(next(foo()))      #!!!!!!!每次相当于从头开始
    # print(next(foo()))
    
    # g.send(2)          #要先启动,所以编写装饰器,预启动
    # print(g)
    #
    # print('='*30)
    # print(g.send(1))
    # print('='*30)
    # print(g.send(2))
    # print('='*30)
    # print(next(g))
    # print('='*30)
    # print(g.send(None)) #g.send(None)等同于next(g)
    
    
    ###################################
    #    二、应用:生成器表达式:含yield的函数!  yield 不仅可以返回值还可以接收值。注意,开始需要预启动(send)
    ###################################
    
    # 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(next(e))            #通过装饰器,解决这个语句!
    # print(e.send("狗屎"))
    # print(e.send("猫屎"))
    # print(e.send("alex屎粑粑"))
    
    #其二 ************************************举例:自动供应食材,并输出吃饭过程
    # def init(func):
    #     '''
    #     装饰器:预启动函数
    #     :param func:
    #     :return:
    #     '''
    #     def wrapper(*args,**kwargs):
    #         # print("修饰")
    #         g = func(*args,**kwargs)
    #         next(g)
    #         return g
    #     return wrapper
    #
    # @init
    # def eat_food(name):
    #     '''
    #     生成器:迭代执行
    #     :param name:
    #     :return:
    #     '''
    #     print("开始吃饭了=======》 ")
    #     food_list = []
    #     while True:
    #         x = yield food_list
    #         food_list.append(x)
    #         print("%s 现在吃 %s" %(name,x))
    #         print(food_list)
    #
    # # gg = eat_food("dachao")
    # # gg.send("鸡腿")
    #
    # def make_food(people,n):
    #     '''
    #     自动生成食材
    #     :param people:
    #     :param n:
    #     :return:
    #     '''
    #     print("*"*10)
    #     for i in range(n):
    #         people.send("SHIT %s" %(i))
    #
    # gg = eat_food("alex")
    # make_food(gg,10)
    
    ###################################
    #   yield 功能嵌套,多函数协作 面向过程编程思想!
    #   应用:模拟功能===》 grep -rl 'root' /etc    便览文件目录,并把含关键字的文件地址返回打印
    ###################################
    
    import os
    
    def init(func):
        '''
        装饰器:预启动
        :param func: 
        :return: 
        '''
        def wrapper(*args,**kwargs):x
            g = func(*args,**kwargs)
            next(g)
            return g
        return wrapper
    
    #阶段一:递归地找文件的绝对路径,把路径发给阶段二
    def search_1(target,start_path):
        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:
            file_path,line = yield tag
            tag = False
            if pattern in line:
                target.send(file_path)
                tag = True
    
    #阶段五:收到文件名,打印结果
    @init
    def printer():
        while True:
            file_path = yield
            print(file_path)
    
    start_path =r"D:PythonstudyDay_10a_10"
    search_1(opener(cat(grep(printer(),"dachao"))),start_path)
    knowledge

    作业:

    ###################################
    #   yield 功能嵌套,多函数协作 面向过程编程思想!
    #   应用:模拟功能===》 grep -rl 'root' /etc    便览文件目录,并把含关键字的文件地址返回打印
    ###################################
    
    import os
    
    def init(func):
        def wrapper(*args,**kwargs):
            g = func(*args,**kwargs)
            next(g)
            return g
        return wrapper
    
    #阶段一:递归地找文件的绝对路径,把路径发给阶段二
    
    def search_path(target,file_path):
        g = os.walk(file_path)                  #获取绝对路径
        for path_1,_,path_3 in g:
            for file in path_3:
                res = r"%s\%s" %(path_1,file)
                target.send(res)
    
    #阶段二:收到文件路径,打开文件获取获取对象,把文件对象发给阶段三
    @init
    def open_path(target):
        while True:
            file_path = yield
            with open(file_path,encoding="utf-8") as f:
                target.send((file_path,f))
    
    
    #阶段三:收到文件对象,for循环读取文件的每一行内容,把每一行内容发给阶段四
    @init
    def read_file(target):
        while True:
            file_path,f = yield
            for i in f:
                res = target.send((file_path,i))
                if res:
                    break
    
    
    #阶段四:收到一行内容,判断root是否在这一行中,如果在,则把文件名发给阶段五
    @init
    def grep_file(target,content):
        tag = False
        while True:
    
            file_path,i = yield tag    #True停止迭代
            tag = False
            if content in i:
                target.send(file_path)
                tag = True
    
    #阶段五:收到文件名,打印结果
    @init
    def printer():
        while True:
            file_path = yield
            print(file_path)
    
    file_path = r"D:PythonstudyDay_10a_10"
    search_path(open_path(read_file(grep_file(printer(),"dachao"))),file_path)
    
    
    #########################################
    # 选做作业
    #     l=[1,2,[3,[4,5,6,[7,8,[9,10,[11,12,13,[14,15]]]]]]]
    #     一个列表嵌套很多层,用递归取出所有的值
    #########################################
    
    # l=[1,2,[3,[4,5,6,[7,8,[9,10,[11,12,13,[14,15]]]]]]]
    #
    #
    # def get_list(list):
    #     for i in list:
    #         if isinstance(i,int):     #isinstance 函数
    #             print(i,end=",")
    #         else:
    #             get_list(i)
    #
    # get_list(l)
    work
  • 相关阅读:
    mysql 主从配置 读写分离
    interface接口
    http结构
    call_user_func函数
    pcntl_fork 进程
    数据库事务
    php 之 ob缓冲
    shell脚本
    php 守护进程
    ssdb zset
  • 原文地址:https://www.cnblogs.com/LiChaoAI/p/7051005.html
Copyright © 2011-2022 走看看