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

    只要函数体内有yield,执行该函数体代码时就不会执行函数体代码,会得到一个结果,该结果就是生成器(generator

    def func():
        print('=================>1')
        yield 1
        print('=================>2')
        yield 2
        print('=================>3')
        yield 3
        print('=================>4')
        yield 4
    func()

    该函数执行结果如下所示:

    生成器就是迭代器

    def func():
        print('=================>1')
        yield 1
        print('=================>2')
        yield 2
        print('=================>3')
        yield 3
        print('=================>4')
        yield 4
    #生成器就是迭代器 
    
    x=func()
    next(x)
    next(x)
    next(x)
    next(x)
    
    

     yield的功能

    1   yield为我们提供一种自定义迭代器对象的方法

    2   yield与return的区别

        2.1yield可以返回多次值

        2.2函数暂停与再继续的状态是由yield帮我们保存的

    函数体代码示范1

    def my_range(start,end,step):
        yield 1
        yield 2
        yield 3
    
    g=my_range(1,5,2)
    print(next(g))
    print(next(g))
    print(next(g))
    View Code

     函数体代码示范2

    #只要函数体代码内有yield   该函数体代码就不会运行,会被当做生成器
    <generator object my_range at 0x030A9EA0>

    def
    my_range(start,end,step): while start<end: yield start start+=step res=my_range(1,5,2) print(next(res)) print(next(res))

    函数体代码示范3

    def my_range(start,end,step=1):
        while start<end:
            yield start
            start=start+step
    res=my_range(1,7,2)    #<generator object my_range at 0x00569060>
    print(res)
    
    for i in my_range(1,9,2):
        print(i)

    函数体代码示范4

    # 实现tail -f access.log | grep 404的功能

    #写入文件代码
    
    with open('access.log','a',encoding='utf-8') as f:
        f.write('aaaaa
    ')
        f.flush()
    #执行文件端代码
    
    import time
    def tail(filepath):
        with open(filepath,'rb') as f:
            f.seek(0,2)
            while True:
                line=f.readline()
                if line:
                    yield line
                else:
                    time.sleep(0.5)
    line=tail('access.log')
    for i in line:
        print(i)

    yield附加案例

    def eater(name):
    print('%s is ready to eat'%name)
    while True:
    food=yield
    print('%s is start to eat %s'%(name,food))


    e=eater('nod')


    #首先初始化
    next(e) #此处可以写成e.send(None)

    #然后send从第一步e暂停的地方开始继续往下执行
    e.send('一只鸡')
    e.send('一只鸭')


  • 相关阅读:
    16-hadoop-mapreduce简介
    centos7-windows10 双系统安装
    5.4 RDD编程---综合案例
    8.2 数据结构---字符串(查找)
    8.1 数据结构---字符串
    5.3 RDD编程---数据读写
    5.2 RDD编程---键值对RDD
    5.1 RDD编程
    4.Spark环境搭建和使用方法
    3.3 Spark的部署和应用方式
  • 原文地址:https://www.cnblogs.com/nodchen/p/8747165.html
Copyright © 2011-2022 走看看