#!/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. MySQL数据库的安装以及配置过程

    首先,下载 MySQL 数据库的安装包:mysql-5.7.17.msi.(百度一下自己下吧) 然后点击这里,啊哈哈哈哈哈哈哈. ----------------------------------- ...

  2. Python ssh 远程执行shell命令

    工具 python paramiko 远程执行命令 import paramiko ssh = paramiko.SSHClient() key = paramiko.AutoAddPolicy() ...

  3. vs 2005/2008/2010 ATL ActiveX控件显示XP风格

    vs 2005/2008/2010 ATL ActiveX控件在IE浏览器中控件显示的是原始的风格,要显示XP风格只要进行以下操作 一.在Stdafx.h中增加下以内容 #if defined _M_ ...

  4. nodejs--vue

    nodejs--vue 基础知识认识: 前端工程化 最近才兴起,nodejs(包的管理更加方便),webpack 数据双向绑定 mvm 数据驱动vue,vue改变数据 组件化开发 vue 中的常见 概 ...

  5. git常用命令收藏

    git init //初始化本地git环境 git clone XXX//克隆一份代码到本地仓库 git pull //把远程库的代码更新到工作台 git pull --rebase origin m ...

  6. matrix-gui-2.0 将javascript文件夹改成js文件夹

    /******************************************************************************** * matrix-gui-2.0 将 ...

  7. windows下matplotlib的安装

    在上一篇中我想用matplotlib,无奈一直装不上,就在卸了又装装了又卸,反反复复之后,终于装好了. 初学python,首先就装了numpy,倒也没有多复杂,有需要的朋友可以直接http://sou ...

  8. BZOJ - 1036 树的统计Count (树链剖分+线段树)

    题目链接 #include<bits/stdc++.h> using namespace std; typedef long long ll; ,inf=0x3f3f3f3f; ],mx[ ...

  9. 【redis】redis的 key的命名规则

    key的命名规则 定义为 MS-TEN:SESSION_KEY_IN_LOGIN_NAME:fqh 使用:进行分割,这样存入redis的是有层次结构的,如下

  10. 继《关于讯飞语音SDK开发学习》之打包过程中遇到小问题

    关于讯飞语音SDK开发学习 使用vs自带打包,具体怎么操作就不说了,网上关于这方面的资料挺多的.例如:winform 打包部署,VS2010程序打包操作(超详细的),关键是桌面上创建快捷方式中的&qu ...