Day 22 (06/19)yield的表达式、 生成器

yield的表达式:

# def init(func):
# def wrapper(*args,**kwargs):
# g=func(*args,**kwargs)
# next(g)
# return g
# return wrapper
#
# @init #foo=init(foo)
# def foo():
# print(‘starting‘)
# while True:
# x=yield None#return 1
# print(‘value : ‘,x)
#
#
#
#
# g=foo() #wrapper()
#
# g.send(2)

#send的效果:
# 1:先从为暂停位置的那个yield传一个值,然后yield会把值赋值x
# 2:与next的功能一样

# print(g)
#
# next(g)
# print(‘=‘*30)
# print(g.send(1))
# print(‘=‘*30)
# print(g.send(2))
# print(‘=‘*30)
# print(next(g))
# print(‘=‘*30)
# print(g.send(None)) #g.send(None)等同于next(g)

# g.send(None) # next(g)

# g.send(2)

def init(func):
def wrapper(*args,**kwargs):
g=func(*args,**kwargs)
next(g)
return g
return wrapper
@init
def eater(name):
print(‘%s ready to eat‘ %name)
food_list=[]
while True:
food=yield food_list#return None
food_list.append(food)
print(‘%s start to eat %s‘ %(name,food))

# e=eater(‘alex‘)
# print(e.send(‘狗屎‘))
# print(e.send(‘猫屎‘))
# print(e.send(‘alex屎‘))

# def make_shit(people,n):
# for i in range(n):
# people.send(‘shit%s‘ %i)
#
# e=eater(‘alex‘)
# make_shit(e,5)

#应用:grep -rl ‘root‘ /etc
import os
def init(func):
def wrapper(*args,**kwargs):
g=func(*args,**kwargs)
next(g)
return g
return wrapper
#阶段一:递归地找文件的绝对路径,把路径发给阶段二
@init
def search(target):
‘search file abspath‘
while True:
start_path=yield
g = os.walk(start_path)
for par_dir, _, files in g:
# print(par_dir,files)
for file in files:
file_path = r‘%s\%s‘ % (par_dir, file)
target.send(file_path)
#阶段二:收到文件路径,打开文件获取获取对象,把文件对象发给阶段三
@init
def opener(target):
‘get file obj: f=open(filepath)‘
while True:
file_path=yield
with open(file_path,encoding=‘utf-8‘) as f:
target.send((file_path,f))

#阶段三:收到文件对象,for循环读取文件的每一行内容,把每一行内容发给阶段四
@init
def cat(target):
‘read file‘
while True:
filepath,f=yield
for line in f:
res=target.send((filepath,line))
if res:
break

#阶段四:收到一行内容,判断root是否在这一行中,如果在,则把文件名发给阶段五
@init
def grep(target,pattern):
‘grep function‘
tag=False
while True:
filepath,line=yield tag #target.send((filepath,line))
tag=False
if pattern in line:
target.send(filepath)
tag=True
#阶段五:收到文件名,打印结果
@init
def printer():
‘print function‘
while True:
filename=yield
print(filename)

start_path1=r‘C:\Users\Administrator\PycharmProjects\python5期\a‘
start_path2=r‘C:\Users\Administrator\PycharmProjects\python5期\a\b‘
g=search(opener(cat(grep(printer(),‘root‘))))

print(g)
# g.send(start_path1)
g.send(start_path2)

#
# def init(func):
# def wrapper(*args,**kwargs):
# g=func(*args,**kwargs)
# next(g)
# return g
# return wrapper
# @init
# def func():
# tag=False
# while True:
# x=yield tag #g.send(‘b‘) #x=‘b‘
# tag=False
# if ‘root‘ in x:
# print(x)
# tag=True
# g=func()
#
# print(g.send(‘a‘))
# print(g.send(‘root123‘))
# print(g.send(‘b‘))
# print(g.send(‘c‘))
# print(g.send(‘d‘))
# print(g.send(‘e‘))

内置函数:

 

 

时间: 2024-08-29 22:04:10

Day 22 (06/19)yield的表达式、 生成器的相关文章

Net作业调度(一) -Quartz.Net入门 Quartz表达式生成器 [转]

背景 很多时候,项目需要在不同个时刻,执行一个或很多个不同的作业. Windows执行计划这时并不能很好的满足需求了. 这时候需要一个更为强大,方便管理,集部署的作业调度了. 介绍 Quartz一个开源的作业调度框架,OpenSymphony的开源项目.Quartz.Net 是Quartz的C#移植版本. 它一些很好的特性: 1:支持集群,作业分组,作业远程管理. 2:自定义精细的时间触发器,使用简单,作业和触发分离. 3:数据库支持,可以寄宿Windows服务,WebSite,winform等

yield的表达式形式、面向过程编程(grep -rl 'root' /etc)

一.yield的表达形式 def foo(): print('starting') while True: x=yield None#return 2 print('value :',x) g=foo() print(next(g)) print(g.send(2)) 运行结果: starting #运行函数,打印starting后碰到yield停住 None #next()触发后 yield将None赋值给x,打印None后循环碰到yield停住 value : 2 #g.send(2)将2赋

yield的表达式形式与内置函数

yield的功能: 1. 与return类似,都可以返回值,不一样在于,yield可以返回多个值而且可暂停,再次执行可继续下一步操作,return到了就停止不在继续运行. 2.为封装好的的函数能够使用__iter__和__next__方法, 3.遵循迭代器的取值方式 .__next__(),触发函数的执行和函数的保存都是通过yeild保存的.  . 一:yield的表达式形式 def foo(): print('starting') while True: x=yield #yield的表达式形

Day9:yield的表达式形式、面向过程编程(grep -rl 'root' /etc)

一.yield的表达式 def foo(): print('starting') while True: x=yield None#return 2 print('value :',x) g=foo() print(next(g)) print(g.send(2)) 运行结果: starting #运行函数,打印starting后碰到yield停住 None #next()触发后 yield将None赋值给x,打印None后循环碰到yield停住 value : 2 #g.send(2)将2赋值

python函数(五)—yield的表达式形式

函数体内含有yield关键字,那该函数的执行结果是生成器对象 生成器对象的本质就是迭代器,所以yield的功能是 1.把函数的执行结果做成迭代器 2.可以返回多次值,而return只能返回一次值 3.可以挂起函数的执行 ======================================= yield语句形式 yield 1 yield的表达式形式 x=yield next(g) g.send('xxx') 示例 def deco(func): def wrapper(*args,**k

python_day04 函数嵌套 名称空间和作用域 闭包 装饰器 迭代器 生成器 列表解析 三元表达式 生成器表达式

本节课重要知识点内容如下: 函数嵌套 名称空间和作用域 闭包 装饰器 迭代器 生成器 列表解析 三元表达式 生成器表达式 1.函数嵌套 函数的嵌套调用:在调用一个函数的过程中,又调用了其他函数函数的嵌套定义:在一个函数的内部,又定义另外一个函数 def bar(): print('from nbar')def foo(): print('from foo') bar()foo()def max2(x,y): if x > y: return x else: return ydef max4(a,

Python基础第十天——yield的表达式形式的应用、面向过程编程、内置函数

鸡汤: 首先,我一定要怀着一颗感恩的心,感谢这个世界上与我接触的人,不管你们对我是关心.是帮助.是冷漠.甚至是厌恶,我都感谢你们. 因为关心和帮助让我感受到了对爱的希望, 因为冷漠和厌恶让我感悟到了人生的残酷, 让恨的怒气和爱的力量化作一股永生不灭的的动力,使我在这条未知的人生道路上   继续写下新的篇章. --奔跑吧小白 一.yield的表达式形式的应用 send():具有传值和next的效果.先暂停的位置传值,再next生成器 send(None):表示不传值,只有next的效果,相当于直接

迭代器|三元表达式|生成器

import numpy as np '''迭代:每次获得的结果都基于上次结果来的(更新换代)迭代器协议:对象必须提供一个next方法 ,执行该方法,要么返回迭代器的下一项,要么引起异常迭代对象(节省内存):实现迭代器协议的对象(内部:__iter__()方法) for循环的本质:循环所有对象,全部使用迭代器协议for循环可以遍历(序列[字符串.列表.元祖].非序列[字典.集合.文件对象])''''''疑问解答:(字符串.列表.元祖.字典.集合.文件对象)都不是可迭代对象,只是for循环调用了他

Util应用程序框架公共操作类(十一):表达式生成器

本篇介绍的表达式生成器,用于动态创建表达式. 在Util项目Lambdas目录中,添加ExpressionBuilder,代码如下. using System; using System.Linq.Expressions; namespace Util.Lambdas { /// <summary> /// 表达式生成器 /// </summary> public class ExpressionBuilder<TEntity> { /// <summary>