生成器

生成器

1、重点

  生成器,要生成,首先想到return

  生成器是迭代器,是可迭代对象,是生成器

  迭代器是迭代器,是可迭代对象

  可迭代对象指示可迭代对象

2、生成器与return有何区别?

  生成器就是一个函数的内存地址,这个函数内包含有yield这个关键字

  return只能返回一次函数就彻底结束了,而yield能返回多次返回值

  yield和return一样能返回任意值,多个值也是以元组返回

  再循环中的yield是第一次的终点,以后每次的起点和终点,

3、yield干了哪些事?

  yield把函数变成(生成器,生成器就是)迭代器相当于yield把iter()和next()封装到函数内部

  用return返回只能返回一次,而yield返回多次

  函数在暂停以及继续下一次运行时的状态由yield保存

  yield有两种形式,一种是语句形式(生成器函数)就是和return差不多的,另一个是表达式形式(协程函数其实也是生成器原理)

4、生成器理解示例

 1 def test():
 2     print("first")
 3     yield 1  # return 1
 4     yield 2
 5     yield 3
 6
 7
 8 g = test()  # g是生成器,是可迭代对象是迭代器
 9 print(g)
10 next(g)
11 next(g)  # next超出范围还是会报错
12 print(next(g))  # next可以触发迭代器往下走
13 # 运行原理如下:
14 # print(next(g))
15 # print(next(test())
16 # 运行test()先print("first")然后碰到yield返回1
17 # 然后结束运行
18
19 # 用for循环输出g
20 for i in g:  #
21     print(i)
22
23
24 def countdown(n):
25     print("start")
26     while n > 0:
27         yield n
28         n -= 1
29     print("done")
30
31
32 g = countdown(5)  # g是生成器,是可迭代对象是迭代器
33 # 用next一步一步输出g
34 print(next(g))
35 print(next(g))
36 print(next(g))
37 print(next(g))
38 print(next(g))
39 print(next(g))  # 超出范围,打印done后报错StopIteration
40 # 用for循环g
41 for i in g:
42     print(i)
43 # 用while循环输出g
44 while True:
45     try:
46         print(next(g))
47     except StopIteration:
48         break
49         # 因为迭代器是一次性的,所以上边三种循环输出方式只能同时用一种

5、利用生成器的特点实现tail -f /tmp/a.txt |grep ‘error‘的功能

 1 #/usr/bin/env python
 2 #定义阶段:定义两个生成器函数
 3 import time
 4 def tail(file_path):
 5     with open(file_path,encoding="utf8") as f:
 6         f.seek(0,2)
 7         while True:
 8             line=f.readline()
 9             if not line:
10                 time.sleep(0.5)
11                 continue
12             else:
13                 yield line
14 def grep(pattern,target):
15     for line in target:
16         if pattern in line:
17             yield line
18 #调用阶段:得到两个生成器对象
19 g1=tail("/tmp/a.txt")
20 g2=grep("error",g1)
21 #next触发执行改g2生成器函数 ,用for循环或者while循环来
22 for i in g2:
23     print(i)
时间: 2024-11-03 05:30:16

生成器的相关文章

Day4 - 迭代器&生成器、装饰器、Json & pickle 数据序列化、软件目录结构规范

---恢复内容开始--- 本节内容 迭代器&生成器 装饰器 Json & pickle 数据序列化 软件目录结构规范 作业:ATM项目开发 1.列表生成式,迭代器&生成器 列表生成式 需求:列表a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],要求把列表里的每个值加1 1 a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 2 b = [] 3 for i in a: 4 b.append(i+1) 5 a = b 6 print(a) 普通青

装饰器、生成器、迭代器

装饰器的前奏 装饰器:本质是函数 功能:就是装饰成其他函数  就是为其他函数添加附加功能的 高阶函数+嵌套函数=装饰器 原则:1.不能修改被装饰的函数的源代码 2.不能修改被装饰的函数的调用方式 总结一句话:装饰器对被装饰的函数是完全透明的 实现装饰器的只是储备: 1.函数名即"变量"   将函数体赋值给变量   和内存回收机制一样 2.高阶函数 2.1.把函数名作为实参传递给形参(可返回被修饰函数的地址)(不修改源代码的情况可添加新的功能) 2.2返回值中包含函数地址(不修改函数的调

Python面试题之生成器/迭代器

1.为什么要有生成器? 通过列表生成式,我们可以直接创建一个列表.但是,受到内存限制,列表容量肯定是有限的.而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了.所以,如果列表元素可以按照某种算法推算出来,那我们是否可以... 在循环的过程中不断推算出后续的元素,这样就不必创建完整的list,从而节省大量的空间.在Python中,这种一边循环一边计算的机制,称为生成器:generator. 第一种方法很简单,只

4.利用python生成器实现简单的“生产者消费者”模型

假如说,没有生成器这种对象,那么如何实现这种简单的"生产者消费者"模型呢? import time def producer(): pro_list = [] for i in range(10000): print "包子%s制作ing" %(i) time.sleep(0.5) pro_list.append("包子%s" %i) return pro_list def consumer(pro_list): for index,stuffe

Python之路22-列表生成式和函数生成器

#列表生成式 list1 = [i*2 for i in range(1,11)] #生成器,在调用时才会生成相应的数据 list = (x*2 for x in range(1,1000000)) #list.__next__() #函数生成器 def fib(max):     n,a,b = 0,0,1     while n < max:         #print (b)         yield b         a,b = b,a+b         n = n + 1   

Python高级特性:迭代器和生成器 -转

在Python中,很多对象都是可以通过for语句来直接遍历的,例如list.string.dict等等,这些对象都可以被称为可迭代对象.至于说哪些对象是可以被迭代访问的,就要了解一下迭代器相关的知识了. 迭代器 迭代器对象要求支持迭代器协议的对象,在Python中,支持迭代器协议就是实现对象的__iter__()和next()方法.其中__iter__()方法返回迭代器对象本身:next()方法返回容器的下一个元素,在结尾时引发StopIteration异常. __iter__()和next()

yield生成器及字符串的格式化

一.生成器 1 def ran(): 2 print('Hello world') 3 yield 'F1' 4 5 print('Hey there!') 6 yield 'F2' 7 8 print('goodbye') 9 yield 'F3' 10 11 ret = ran() # ran()称为生成器函数,ret才是生成器,仅仅具有一种生成能力,函数内部要有关键字yield 12 print(ret) 13 14 res = ret.__next__() #对生成器进行循环操作,遇到y

python-学习笔记之-Day5 双层装饰器 字符串格式化 python模块 递归 生成器 迭代器 序列化

1.双层装饰器 #!/usr/bin/env python # -*- coding: utf-8 -*- # author:zml LOGIN_INFO = False IS_ADMIN = False   def check_log(func): def inner(): res = func() if LOGIN_INFO: print('验证成功!') return res else: print('验证失败!') return inner   def check_admin(func)

彩票生成器--36选7(不重复)

import java.util.Random; public class suijishu { /** * @param args */ public static void main(String[] args) { // TODO 自动生成的方法存根 //36选7,不重复 //第一步,初始化 定义数组,建随机数组生成器 int []caiPiao=new int[7]; Random ran = new Random(); //第二步,生成 //随机生成7个数 for(int i=0;i<

iOS设计模式——生成器模式

选择建造自己的房子的人会把工程外包给承包商.单一承包商不能建造整个房子,他将其分解为几个部分,然后转包给几个实际的建筑商,他们懂得如何将零部件组装起来.房子由由风格.颜色和尺寸各不相同的部件组成.客户告诉承包商房子里都要有什么,然后承包商协调各房屋建筑商,决定需要做什么.应该如何建造,建筑商就如何施工.建房子是个复杂过程,单凭一双手就想建房子,即便可能也非常困难.如果承包商(指导者)与懂得如何建造的建筑商相互协调,这一过程简单得多且更易管理. 有时,构建某些对象有多种不同方式.如果这些逻辑包含在