zoukankan      html  css  js  c++  java
  • python生成器

    什么是生成器(就是自定义的迭代器)

    只要在函数体代码出现yield关键字,那么再执行函数就不会执行函数体代码,会得到一个结果,该结果就是生成器。

    def func():
        print("====>1")
        yield 1
        print("====>2")
        yield 2
        print("====>3")
        yield 3
    
    #生成器就是迭代器
    g=func()
    # g.__iter__()
    # g.__next__()
    
    res=next(g)
    print(res)
    #执行结果
    ====>1
    1

    yield功能:

    #1、yield为我们提供了一种自定义迭代器的方法
    #2、yield与return的区别:
        #1、yield可以返回多次值 
        #2、函数暂停与再继续的状态是由yield帮我们保存的

    示例:自定义range功能

    #代码
    def my_range(start,end,step=1):
        while start < end:yield start
            start+=step
    
    res=my_range(1,10)
    for i in res:
        print(i)

    示例:tail -f access.log |grep "404"

    import time
    def tail(file_path):
        with open(file_path,"rb") as f:
            f.seek(0,2)
            while True:
                line=f.readline()
                if line:
                    # print(line.decode("utf-8"),end="")
                    yield line
                else:
                    time.sleep(0.05)
    def grep(lines,pattern):
        for line in lines:
            line=line.decode("utf-8")
            if pattern in line:
                print(line,end="")
    lines=tail("file.txt")
    grep(lines,"404")

    了解:yield表达式形式的用法:

    示例一:表达式形式

    def eater(name):
        print("{} ready eat".format(name))
        while True:
            food=yield
            print("{} start eat {}".format(name,food))
    
    e=eater("alex")
    
    #首先要初始化一下
    next(e)      #第一次到yield暂停,等同于e.send(None)
    #然后e.send()传值:1、从暂停的位置将值传给yiled,2、与next一样
    e.send("apple")
    e.send("鱼香肉丝")
    e.close() #关闭
    #e.send("米饭") #关闭后再send传值就报错了StopIteration
    //执行结果 alex ready eat alex start eat apple alex start eat 鱼香肉丝

    示例二:表达式形式+返回值形式(yield返回多个值可以用逗号隔开,返回的是元组)

    def eater(name):
        print("{} ready eat".format(name))
        eat_list=[]
        while True:
            food=yield eat_list    #先将send传的值给yield,再由yield传给food,当暂停的时候将eat_list返回
            eat_list.append(food)
            print("{} start eat {}".format(name,food))
    
    e=eater("alex")
    
    #首先要初始化一下
    next(e)      #第一次到yield暂停,等同于e.send(None)
    #然后e.send()传值:1、从暂停的位置将值传给yiled,2、与next一样
    print(e.send("apple"))
    print(e.send("鱼香肉丝"))
    //执行结果
    alex ready eat
    alex start eat apple
    ['apple']
    alex start eat 鱼香肉丝
    ['apple', '鱼香肉丝']
  • 相关阅读:
    (笔记)Mysql命令mysqldump:备份数据库
    (笔记)Mysql命令rename:修改表名
    (笔记)Mysql命令alter add:增加表的字段
    (笔记)Mysql命令update set:修改表中的数据
    (笔记)Mysql命令delete from:删除记录
    (笔记)Mysql命令select from:查询表中的数据(记录)
    psutil库
    生成器 yield
    高阶函数map(),filter(),reduce()
    logging模块
  • 原文地址:https://www.cnblogs.com/baicai37/p/12559364.html
Copyright © 2011-2022 走看看