码迷,mamicode.com
首页 > 编程语言 > 详细

python学习之生成器yield

时间:2018-10-13 10:54:09      阅读:165      评论:0      收藏:0      [点我收藏+]

标签:pyhton   text   python学习   读取   print   内部测试   休眠   access   参考手册   

python学习之生成器yield

**yield的作用是使函数生成一个结果序列而不是一个值,任何使用yield的函数都称为生成器,调用生成器会创建一个对象,该对象通过连续调用next()或者__next__()方法生成结果序列**

一般情况

>>> def count(n,m):
>>>     print(‘这是一个循环外部测试‘)
>>>     while n>0:
>>>         print(‘这是一个循环内部测试‘)
>>>         yield n,m
>>>         n-=1


>>> c=count(5,2)
>>> c.__next__()
这是一个循环外部测试
这是一个循环内部测试
5,2

首先我定义了生成器,利用了yield关键词,但是注意,我没有像其它列子一样使用单个参数,yield的后面是两个参数,这里就是为了提醒,yield后面可以跟多个参数,他的后面参数表示要传给yield的这个关键词的参数,甚至可以用表达式,但是一定要用括号括起来,比如yield (n+3),这样的参数也可以

  1. 当初次调用count的时候,该函数什么也不做,因为他知道这是个yield的函数,所以也不会打印“这是一个外部循环测试"这段文字,但是,当调用__next__()之后,函数开始执行,执行到yield关键词,然后停止执行,函数的返回值就是要传给yield关键词的参数(其实用yield关键词相当于古时候的驿站,参数过来歇歇脚,然后继续上路,每遇到一次yield就要歇脚一次,调用一次__next__(),相当于开始赶路一次),就是如上图返回的5,2
  2. 当再次执行时,该函数从yield处开始执行,执行减一操作,然后继续循环,遇到yield停止
>>> c.__next__()
这是一个循环内部测试
4,2
>>> c.__next__()
这是一个内部循环测试
3,2
>>> c.__next__()
这是一个内部循环测试
2,2

下面一个python参考手册上的一个列子

利用pyhton实现linux上的tail -f |grep python这个命令

import time
def tail(f):
    f.seek(0,2) #移动到EOF
    while True:
    line=f.readline()
    if not line:
        time.sleep(0.1) #尝试读取一个文件,如果没有,休眠并继续
        continue
    yield line

def grep(lines,searchtext):
    for line in lines:
        if searchtext in line:yield line


wwwlog=tail(open(‘access-log‘))
pylines=grep(wwwlog,‘python‘)
for line in pylines:
    print(line)

python学习之生成器yield

标签:pyhton   text   python学习   读取   print   内部测试   休眠   access   参考手册   

原文地址:https://www.cnblogs.com/missed-forest/p/9782118.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!