#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
@version: 3.5
@author: morgana
@license: Apache Licence
@contact: vipmorgana@gmail.com
@site:
@software: PyCharm
@file: notes.py
@time: 2017/6/19 上午8:51
""" # 1.yield的表达式形成的应用
# 2.面向过程编程:grep -rl 'root' /etc
# 3.递归
# 4.内置函数
#
# 三元表达式:res=True if 1>2 else False
# 列表解析:[i for i in range(10) if i>5]
# 生成器表达式:(i for i in range(10) if i>5)
# 生成器:函数函数内部有yield关键字,那函数执行的结果就是生成器 # def init(func):
# def warpper(*args,**kwargs):
# g=func(*args,**kwargs)
# next(g)
# return g
# return warpper
#
# @init
# def foo():
# print('starting')
# while True:
# x=yield
# print('value: ',x) #send的效果
#1.先从为暂停位置的那个yield传一个值,然后yield会把值赋值x
#2:与next的功能一样 # g=foo()
# print(g)
# next(g)
# print('='*30)
# print(g.send(1))
# print('='*30)
# print(g.send(2))
# print(g.send(3))
# print(g.send(3)) # # @init
# def eater(name):
# print('%s read to eat ' %name)
# food_list=[]
# while True:
# food=yield food_list
# food_list.append(food)
# print("%s start to eat %s" %(name,food))
#
#
#
# e=eater('alex')
# e.send("shit")
# e.send("dog shit") #
# def init(func):
# def warpper(*args,**kwargs):
# g=func(*args,**kwargs)
# next(g)
# return g
# return warpper
#
#
# @init
# def eater(name):
# print("%s eat " %(name))
# food_list=[]
# while True:
# food=yield food_list
# food_list.append(food)
# print("%s eat %s" %(name,food))
#
#
# def make_shit(people,n):
# for i in range(n):
# people.send("shit %s" %i)
#
# e=eater("alex")
# make_shit(e,5) #1.找到文件
#2.把文件找到 绝对路径 send()-》
#3.遍历文件内容
#判断 import os
def init(func):
def warpper(*args,**kwargs):
g=func(*args,**kwargs)
next(g)
return g
return warpper # 阶段一:递归找文件绝对路径,把路径发给阶段二
def search(target, start_path):
'serch file abpath'
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)
file_path = '%s%s' % (par_dir, file)
#print(file_path)
target.send(file_path) # 阶段二:收到文件路径,打开文件获取对象,把文件对象发给阶段三
@init
def opener(target):
'get file obj 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):
# 'cat file'
while True:
file_path, f = yield
for line in f: target.send((file_path,line)) # 阶段四:收到一行内容,判断root是否在这一行中,如果在,则把文件名发给阶段五
@init
def grep(target, pattern):
while True:
file_path, line = yield
if pattern in line:
target.send(file_path) # 阶段五:收到文件名打印结果
@init
def printer():
# 'print function'
while True:
filename = yield
print(filename) start_path ='/Users/shuanggai/PycharmProjects/git/python/20170619_yield_recursion/homework/'
search(opener(cat(grep(printer(),'root'))),start_path)

morgana

python_class21的更多相关文章

随机推荐

  1. linux基础(4)-常用命令

    常用命令ls ls #查看当前目录下的文件和目录 ls -l #显示详细信息 ls -a #显示所有文件 ls -t #按修改时间排序 ls -S #按文件大小排序   常用命令pwd pwd #显示 ...

  2. apache实现http自动转为https

    1.确认此服务器apache已经配置过证书可以用https访问到 2.确认/etc/apache2/ports.conf 下有 Listen 80Listen 443(此条) 3.配置虚礼主机定将域名 ...

  3. java连接SQL数据库(JDBC)相关设置

    2016-06-14 一.SQL server中的相关设置(以sql server 2012 版本为例) 建立一个SQL server 身份认证的服务器登录名 首先启动SQL客户端,以windows身 ...

  4. linux下如何查看某个软件 是否安装??? 安装路径在哪???

    <1>.在linux下如何判断是否已经安装某个软件? 我的系统是red hat 我用命令rpm查是否安装了某个软件(例如: matlab 与 fluent ),得到了如下的结果: 我用rp ...

  5. Merge 2

    在SQL2008中,新增了一个关键字:Merge,这个和Oracle的Merge的用法差不多,只是新增了一个delete方法而已.下面就是具体的使用说明: 首先是对merge的使用说明: merge ...

  6. (链接)xcode7,ios9 部分兼容设置

    xcode7,ios9 部分兼容设置 http://www.cnblogs.com/loganv/p/4647833.html

  7. MySQL分片 --转自Peter Zaitsev对MySQL分片的建议

    本文作者Peter Zaitsev是知名数据库专家,2006年联合创立了Percona.负责维护网站“MySQL性能”.同时,他也是<高性能MySQL>一书的联合作者.以下是他对MySQL ...

  8. AngularJS-webapp($q)

    $q延迟加载: 当一个数据需要请求多次,后面一个数据需要前面请求的数据时,我们就可以通过延迟加载进行数据传递 如下代码: 首先:我们需要得到职位信息: { "id": " ...

  9. L123

    My heart, the bird of the wilderness, has found its sky in your eyes. 我的心是旷野的鸟,在你的双眼中找到了天空.His main ...

  10. 机械硬盘运行VMWare虚拟机太卡的解决办法

    VMWare有个运行机制是:在硬盘生成内存的镜像文件以降低内存的使用量,而这个是可以配置的,如果你的内存足够大的话,就可以不使用这个内存镜像,从而提高运行效率:配置方法如下: 1.单个虚拟机的配置,修 ...