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中,一边 ...
随机推荐
- Linux基础命令---ckconfig
chkconfig 启动或者关闭系统服务,设置服务的运行级别,该指令并不会立刻启动或者停止服务,而是在开机的时候发生效果. chkconfig提供了一个简单的命令行工具,用于维护/etc/rc[0-6 ...
- Linux中Postfix基于SSL收发邮件(九)
其中在整个一套邮件服务器中,默认信息传输都是明文传输的,所以这个在安全性上面就不是那么好.但是如果说一封邮件从发生到对方接受想要全程做到加密处理这个也是很难的.因为一封邮件从一个域转到另外一个域服务器 ...
- 用户可在Messenger内读书并与角色互动
畅销小说作家 James Patterson 与 Facebook 合作,为新书<The Chef>在 Messenger 推出互动体验版. 10 月 30 日下午消息,据<香港经济 ...
- 文件系统、服务、防火墙、SELINUX——安全四大金刚
一提到安全,大家都会想到防火墙,和文件系统权限.而实际工作环境中,我们在Linux的安全配置,会涉及到四个级别.我们思考一个场景,你要在百度盘中存放一个文件,这个动作需要考虑下面四个权限. 1 fir ...
- MySQL笔记(五)MySQL 角色与SQL CHECK约束
MySQL ROLE MySQL 8.0 Reference Manual / Security / MySQL User Account Management / Using Roles ...
- P3374 【模板】树状数组 1(cdq)
P3374 [模板]树状数组 1 cdq分治 刚学了cdq分治(dyf神犇强力安利下),发现可以做这种题,当然是来试水了(逃 cdq好像只能离线的样子 cdq分治(转) 以下是摘录的几句: 在合并的时 ...
- P2322 [HNOI2006]最短母串问题
P2322 [HNOI2006]最短母串问题 AC自动机+bfs 题目要求:在AC自动机建的Trie图上找到一条最短链,包含所有带结尾标记的点 因为n<12,所以我们可以用二进制保存状态:某个带 ...
- CentOS7安装redis5.0
下载好redis5.0后解压在/tmp目录 cd /tmp/redis-/ make make过程中可能出现make[1]: *** [adlist.o] 错误 127,这是因为CentOS7默认没有 ...
- NRF24L01通信频率
RF-CH 共包括六位,这六位决定了不同的工作方式频率,nRF24L01无线通信模块中工作通道频率由RF-CH寄存器的内容确定, 可由以下公式计算得出:Fo=(2400+RF-CH)MHz. 扩展:射 ...
- Delphi XE5 for Android (四)
在Delphi中窗体与窗体之间的交互与调用非常简单,在FMX中这个优势得到了充分体现,先建立一个主窗体和一个需要调用的窗体: 在主窗体上放的按钮事件如下: - private { Pr ...