python-day17--生成器
1.本质:就是迭代器
2.生成器函数:
def func():
a=1
b=2
yield a #要返回的第一个值
yield b #要返回的第二个值
ret = func() #拿到一个生成器
print(next(ret)) #取第一个值
print(next(ret)) #取第二个值
print(next(ret)) #取第三个值 会报错 因为没有第三个值 3.
def f():
for i in range(1,10):
yield '生产了%s件'%i
s=f()
for j in range(3):
print(next(s))
# 生产了1件
# 生产了2件
# 生产了3件
4.
import time
def tail(filename):
with open(filename) as f:
f.seek(0, 2) #从文件末尾算起
while True:
line = f.readline() # 读取文件中新的文本行
if not line:
time.sleep(0.1)
continue
yield line
print(next(tail('tmp_file')))
5.#计算移动平均值
def init(func): #在调用被装饰生成器函数的时候首先用next激活生成器
def inner(*args,**kwargs):
g = func(*args,**kwargs)
next(g)
return g
return inner
@init
def averager():
total = 0.0
count = 0
average = None
while True:
term = yield average
total += term
count += 1
average = total/count
g_avg = averager()
# next(g_avg) 在装饰器中执行了next方法
print(g_avg.send(10))
print(g_avg.send(30))
print(g_avg.send(5))
6.yield from 方法
def func():
# for i in 'AB':
# yield i
yield from 'AB'
yield from [1,2,3]
g = func()
l = []
l.append(next(g))
l.append(next(g))
l.append(next(g))
l.append(next(g))
l.append(next(g))
print(l)
#['A', 'B', 1, 2, 3]
7.生成器面试题:
def demo():
for i in range(4):
yield i g=demo() g1=(i for i in g)
g2=(i for i in g1) print(list(g1))
print(list(g2))
1
def add(n,i):
return n+i def test():
for i in range(4):
yield i g=test()
for n in [1,10]:
g=(add(n,i) for i in g) print(list(g))
2
import os def init(func):
def wrapper(*args,**kwargs):
g=func(*args,**kwargs)
next(g)
return g
return wrapper @init
def list_files(target):
while 1:
dir_to_search=yield
for top_dir,dir,files in os.walk(dir_to_search):
for file in files:
target.send(os.path.join(top_dir,file))
@init
def opener(target):
while 1:
file=yield
fn=open(file)
target.send((file,fn))
@init
def cat(target):
while 1:
file,fn=yield
for line in fn:
target.send((file,line)) @init
def grep(pattern,target):
while 1:
file,line=yield
if pattern in line:
target.send(file)
@init
def printer():
while 1:
file=yield
if file:
print(file) g=list_files(opener(cat(grep('python',printer())))) g.send('/test1') 协程应用:grep -rl /dir
3
8.上面2题的 思路
# g=(add(n,i) for i in (add(n,i) for i in g)) #当n=1 时,生成器未执行,只是把式子带过来了
# print(list(g))
# import os
#
# def init(func): #预激活生成器的一个装饰器
# def wrapper(*args,**kwargs):
# g=func(*args,**kwargs) #func是一个生成器函数,返回的g是一个生成器
# next(g) #预激活生成器
# return g #返回激活后的生成器g
# return wrapper
#
# @init #list_files = init(list_files) == wrapper
# def list_files(target): #target = opener_g
# while 1:
# dir_to_search=yield
# for top_dir,dir,files in os.walk(dir_to_search): #os.walk (路径,文件夹,文件)
# for file in files: #从文件列表中获取一个一个的文件
# target.send(os.path.join(top_dir,file)) #把文件的绝对路径传给了opener_g
# @init #opener = init(opener) == wrapper
# def opener(target): #target = cat_g
# while 1:
# file=yield #拿到了一个文件的路径
# fn=open(file,encoding='utf-8') #打开文件获取了一个文件句柄
# target.send((file,fn)) #cat_g发送了一个文件的路径和句柄
# @init #cat = init(cat) == wrapper
# def cat(target): #target = grep_g
# while 1:
# file,fn=yield #文件路径和文件的句柄
# for line in fn:
# target.send((file,line)) #文件路径,文件中的一行
# @init #grep = init(grep) == wrapper
# def grep(pattern,target): #要搜索的关键字,printer_g
# lst = []
# while 1:
# file,line=yield #文件的路径和每一行
# if pattern in line and file not in lst: #判断关键字是否在当前行
# lst.append(file)
# target.send(file) #printer_g.send文件路径
# @init #printer = init(printer) == wrapper
# def printer():
# while 1:
# file=yield #获取一个文件路径
# if file:
# print(file) #打印文件的路径:文件里包含了要搜索的关键字
#
# g=list_files(opener(cat(grep('python',printer()))))
# # g=list_files(opener(cat(grep('python',printer_g))))
# # g=list_files(opener(cat(grep_g)))
# # g=list_files(opener(catg)))
# # g=list_files(opener_g)
# g.send('D:\Python代码文件存放目录\S6\day18') #用户给一个路径和关键字
#可以从一个文件路径中找到所有包含关键字的文件
面试题3 答案
python-day17--生成器的更多相关文章
- python 列表生成器
python 列表生成器 列表生成式即List Comprehensions,是Python内置的非常简单却强大的可以用来创建list的生成式. 一个循环 在C语言等其他语言中,for循环一般是这样的 ...
- python 迭代器 生成器
迭代器 生成器 一 什么是迭代器协议 1.迭代器协议是指:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就引起一个StopIteration异常,以终止迭代 (只能往后走不能往前 ...
- python中和生成器协程相关的yield from之最详最强解释,一看就懂(四)
如果认真读过上文的朋友,应该已经明白了yield from实现的底层generator到caller的上传数据通道是什么了.本文重点讲yield from所实现的caller到coroutine的向下 ...
- python中和生成器协程相关yield from之最详最强解释,一看就懂(二)
一. 从列表中yield 语法形式:yield from <可迭代的对象实例> python中的列表是可迭代的, 如果想构造一个生成器逐一产生list中元素,按之前的yield语法,是在 ...
- python中和生成器协程相关的yield之最详最强解释,一看就懂(一)
yield是python中一个非常重要的关键词,所有迭代器都是yield实现的,学习python,如果不把这个yield的意思和用法彻底搞清楚,学习python的生成器,协程和异步io的时候,就会彻底 ...
- Python中生成器和迭代器的区别(代码在Python3.5下测试):
https://blog.csdn.net/u014745194/article/details/70176117 Python中生成器和迭代器的区别(代码在Python3.5下测试):Num01–& ...
- Python的生成器进阶玩法
Python的生成器进阶玩法 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.yield的表达式形式 #!/usr/bin/env python #_*_coding:utf-8 ...
- python中“生成器”、“迭代器”、“闭包”、“装饰器”的深入理解
一.生成器 1.什么是生成器? 在python中,一边循环一边计算的机制,称为生成器:generator. 2.生成器有什么优点? 1.节约内存.python在使用生成器时对延迟操作提供了支持.所谓延 ...
- python中生成器对象和return 还有循环的区别
python中生成器对象和return 还有循环的区别 在python中存在这么一个关键字yield,这个关键字在项目中经常被用到,比如我写一个函数不想它只返回一次就结束那我们就不能用return,因 ...
- python中“生成器”、“迭代器”、“闭包”、“装饰器”的深入理解
python中"生成器"."迭代器"."闭包"."装饰器"的深入理解 一.生成器 1.生成器定义:在python中,一边 ...
随机推荐
- python之路----包
包 包是一种通过使用‘.模块名’来组织python模块名称空间的方式. 1. 无论是import形式还是from...import形式,凡是在导入语句中(而不是在使用时)遇到带点的,都要第一时间提高警 ...
- I/O复习
I/O流之字符流 问题:字节流和字符流区别? java1.0只提供了字节流,分为输出流(Inputstream)和输入流(Outputstream), 以字节为单位来读取或写入数据,以二进制来处理数据 ...
- vc编辑器常用设置
代码格式化 1.选中代码: 2.ctrl+K: 3.ctrl+F; 显示行号
- 01: 安装zabbix server
目录:Django其他篇 01: 安装zabbix server 02:zabbix-agent安装配置 及 web界面管理 03: zabbix API接口 对 主机.主机组.模板.应用集.监控项. ...
- 02: DOM 实例
1.1 Event 对象 <body> <a id="myAnchor" href="http://www.microsoft.com"> ...
- xdebug安装方法
打开网址:https://xdebug.org/wizard.php 把phpinfo页面中输出的所有内容复制过来,粘贴在此处点下面那个按钮,系统会分析出你需要下载哪个版本的x-debug,还会告诉你 ...
- windows下的 gvim - su'blime text 的使用
su'blime [s2'blaim] adj. n. 崇高的, 高尚的, 令人尊敬的; 壮丽的, 宏伟的; 出众的; 崇高的人, 壮丽的事物等等. a sublime mission. a subl ...
- luoguP2572 [SCOI2010]序列操作
题目&&链接 反正数据都是一样的,luogu比较友好 luogu bzoj lxhgww最近收到了一个01序列,序列里面包含了n个数,这些数要么是0,要么是1,现在对于这个序列有五种变 ...
- POJ1251 Jungle Roads (最小生成树&Kruskal&Prim)题解
题意: 输入n,然后接下来有n-1行表示边的加边的权值情况.如A 2 B 12 I 25 表示A有两个邻点,B和I,A-B权值是12,A-I权值是25.求连接这棵树的最小权值. 思路: 一开始是在做莫 ...
- 'curl' is not recognized as an internal or external command
使用everything搜索本地的curl.exe发现如下 官网查看最新版本https://curl.haxx.se/windows/ 2019-03-06 最新版本7.64.0 curl-7.64. ...