本日知识点:

###################################
#一、上节课复习:在for循环式,调用对象内部的__iter__方法,
# 把他们变成了可迭代对象然后for循环调用可迭代对象的__next__方法去取值,
# 而且for循环会捕捉StopIteration异常,以终止迭代
################################### # def func(n):
# while n > 0:
# yield n
# print("*"*6)
# n -= 1
#
# g=func(5)
# #第一个
# print(next(g))
# print(next(g))
# print(next(g))
# print(next(g))
# print(next(g))
# #第二个 等价于前面第一个
# for i in g: #next(g)
# print(i) ###################################
#二、send的效果:
# 1:先从为暂停位置的那个yield传一个值,然后yield会把值赋值x
# 2:与next的功能一样
#注意:要先启动,执行到yield的位置处
################################### # def init(func):
# '''
# 装饰器:预启动生成器,到位置yield处,以便send传值
# :param func:
# :return:
# '''
# def wrapper(*args,**kwargs):
# g=func(*args,**kwargs)
# next(g)
# return g
# return wrapper
#
# @init #foo=init(foo)
# def foo():
# '''
# 函数:测试send对yield的传值效果
# :return:
# '''
# print('starting')
# while True:
# print("*"*8)
# x=yield #return 1
# print("8"*8)
# print('value : ',x)
#
# 测试部分:**********************************
# g = foo()
# print(next(g)) #赋值后,迭代器开始迭代
# print(next(g)) # print(next(foo())) #!!!!!!!每次相当于从头开始
# print(next(foo())) # g.send(2) #要先启动,所以编写装饰器,预启动
# print(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) ###################################
# 二、应用:生成器表达式:含yield的函数! yield 不仅可以返回值还可以接收值。注意,开始需要预启动(send)
################################### # 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
# food_list.append(food)
# print("%s start to eat %s" %(name,food))
#
# e = eater("alex")
#
# print(next(e)) #通过装饰器,解决这个语句!
# print(e.send("狗屎"))
# print(e.send("猫屎"))
# print(e.send("alex屎粑粑")) #其二 ************************************举例:自动供应食材,并输出吃饭过程
# def init(func):
# '''
# 装饰器:预启动函数
# :param func:
# :return:
# '''
# def wrapper(*args,**kwargs):
# # print("修饰")
# g = func(*args,**kwargs)
# next(g)
# return g
# return wrapper
#
# @init
# def eat_food(name):
# '''
# 生成器:迭代执行
# :param name:
# :return:
# '''
# print("开始吃饭了=======》 ")
# food_list = []
# while True:
# x = yield food_list
# food_list.append(x)
# print("%s 现在吃 %s" %(name,x))
# print(food_list)
#
# # gg = eat_food("dachao")
# # gg.send("鸡腿")
#
# def make_food(people,n):
# '''
# 自动生成食材
# :param people:
# :param n:
# :return:
# '''
# print("*"*10)
# for i in range(n):
# people.send("SHIT %s" %(i))
#
# gg = eat_food("alex")
# make_food(gg,10) ###################################
# yield 功能嵌套,多函数协作 面向过程编程思想!
# 应用:模拟功能===》 grep -rl 'root' /etc 便览文件目录,并把含关键字的文件地址返回打印
################################### import os def init(func):
'''
装饰器:预启动
:param func:
:return:
'''
def wrapper(*args,**kwargs):x
g = func(*args,**kwargs)
next(g)
return g
return wrapper #阶段一:递归地找文件的绝对路径,把路径发给阶段二
def search_1(target,start_path):
g = os.walk(start_path)
for par_dir,_,files in g:
for file in files:
file_path = r"%s\%s" %(par_dir,file)
target.send(file_path) #阶段二:收到文件路径,打开文件获取获取对象,把文件对象发给阶段三
@init
def opener(target):
while True:
file_path = yield
with open(file_path,encoding="utf-8") as f:
target.send((file_path,f)) #阶段三:收到文件对象,for循环读取文件的每一行内容,把每一行内容发给阶段四
@init
def cat(target):
while True:
file_path,f = yield
for line in f :
res = target.send((file_path,line))
if res:
break #阶段四:收到一行内容,判断root是否在这一行中,如果在,则把文件名发给阶段五
@init
def grep(target,pattern):
tag = False
while True:
file_path,line = yield tag
tag = False
if pattern in line:
target.send(file_path)
tag = True #阶段五:收到文件名,打印结果
@init
def printer():
while True:
file_path = yield
print(file_path) start_path =r"D:\Python\study\Day_10\a_10"
search_1(opener(cat(grep(printer(),"dachao"))),start_path)

knowledge

作业:

###################################
# yield 功能嵌套,多函数协作 面向过程编程思想!
# 应用:模拟功能===》 grep -rl 'root' /etc 便览文件目录,并把含关键字的文件地址返回打印
################################### import os def init(func):
def wrapper(*args,**kwargs):
g = func(*args,**kwargs)
next(g)
return g
return wrapper #阶段一:递归地找文件的绝对路径,把路径发给阶段二 def search_path(target,file_path):
g = os.walk(file_path) #获取绝对路径
for path_1,_,path_3 in g:
for file in path_3:
res = r"%s\%s" %(path_1,file)
target.send(res) #阶段二:收到文件路径,打开文件获取获取对象,把文件对象发给阶段三
@init
def open_path(target):
while True:
file_path = yield
with open(file_path,encoding="utf-8") as f:
target.send((file_path,f)) #阶段三:收到文件对象,for循环读取文件的每一行内容,把每一行内容发给阶段四
@init
def read_file(target):
while True:
file_path,f = yield
for i in f:
res = target.send((file_path,i))
if res:
break #阶段四:收到一行内容,判断root是否在这一行中,如果在,则把文件名发给阶段五
@init
def grep_file(target,content):
tag = False
while True: file_path,i = yield tag #True停止迭代
tag = False
if content in i:
target.send(file_path)
tag = True #阶段五:收到文件名,打印结果
@init
def printer():
while True:
file_path = yield
print(file_path) file_path = r"D:\Python\study\Day_10\a_10"
search_path(open_path(read_file(grep_file(printer(),"dachao"))),file_path) #########################################
# 选做作业
# l=[1,2,[3,[4,5,6,[7,8,[9,10,[11,12,13,[14,15]]]]]]]
# 一个列表嵌套很多层,用递归取出所有的值
######################################### # l=[1,2,[3,[4,5,6,[7,8,[9,10,[11,12,13,[14,15]]]]]]]
#
#
# def get_list(list):
# for i in list:
# if isinstance(i,int): #isinstance 函数
# print(i,end=",")
# else:
# get_list(i)
#
# get_list(l)

work

Day 22 生成器yield表达式及内置函数(一丢丢)的更多相关文章

  1. python第十二天 生成器,迭代器,内置函数

    第二模块学习:  生成器,迭代器,内置函数 生成器特点:只有在调用时才会生成相应的数据,运行的速度快! 示例: def fil(max):#斐波那契数 n,a,b=0,0,1 #定义初始数据 whil ...

  2. 第四章 函数之lambda 表达式和内置函数

    4.5 lambda 表达式 用于表示简单的函数. # 三元运算,为了解决简单的if else的情况,如:if 1 == 1:    a = 123else:    a = 456# 相当于a = 1 ...

  3. lambda 表达式+python内置函数

    #函数 def f1(a,b): retrun  a+b #lambda方式,形参(a,b):返回值(a+b) f2=lambda a,b : a+b 在一些比较简单的过程计算就可以用lambda p ...

  4. Python3基础(4)匿名函数、装饰器、生成器、迭代器、内置函数、json&pickle序列化、软件目录开发规范、不同目录间模块调用

    ---------------个人学习笔记--------------- ----------------本文作者吴疆-------------- ------点击此处链接至博客园原文------ 1 ...

  5. day11 - 15(装饰器、生成器、迭代器、内置函数、推导式)

    day11:装饰器(装饰器形成.装饰器作用.@语法糖.原则.固定模式) 装饰器形成:最简单的.有返回值的.有一个参数的.万能参数 函数起的作用:装饰器用于在已经完成的函数前后增加功能 语法糖:使代码变 ...

  6. lambda表达式、内置函数、进制和文件操作

    lambda表达式 定义函数(普通方式)def f1(): return 123 f2 = lambda : 123 def f3(a1,a2): return a1+a2 定义函数(lambda表达 ...

  7. python — lambda表达式与内置函数

    目录 1 lambda表达式 (匿名函数) 2 内置函数 1 lambda表达式 (匿名函数) 用于表示简单的函数 lambda表达式,为了解决简单函数的情况: def func(a1,a2): == ...

  8. 【Python全栈笔记】04 [模块二] 18 Oct lambda表达式, 内置函数

    lambda表达式 lambda表达式是函数的一种简化,如下面两种函数定义方法,实际上效果是一样的. 使用lambda表达式的函数,func2是函数名,lambda: 后面的123 即为返回值. de ...

  9. python入门之lambda表达式、内置函数

    lambda 简单的函数就可以用lambda表达式 格式: abc = lambda a1,a2:a1+a2 其中,传参是a1和a2,返回值是a1+a2 内置函数 abs(a) #取绝对值 all(a ...

随机推荐

  1. OI杂记

    从今天开始记录一下为数不多天的OI历程 8.25 上 今天举行了难得的五校联考,模拟noip,题目的解压密码竟然是$aKnoIp2o18$,对你没有看错!!! 7:50老师?啊啊啊啊,收不到题目啊,还 ...

  2. C语言中sizeof的用法

    今天同学问我sizeof可不可以计算结构体的大小,我竟然忘了C语言还有sizeof这个函数,我是多久没有写程序了啊!!!惭愧,上研究生后写嵌入式方面的程序就特别少了,看来以后还要经常来练练手才行.现在 ...

  3. 五一4天就背这些Python面试题了,Python面试题No12

    第1题: Python 中的 os 模块常见方法? os 属于 python内置模块,所以细节在官网有详细的说明,本道面试题考察的是基础能力了,所以把你知道的都告诉面试官吧 官网地址 https:// ...

  4. Django之cookie、session

    会话跟踪技术 可以把会话理解为客户端与服务器之间的一次会晤,在一次会晤中可能会包含多次请求和响应. 一次会话过程中,我们应该注意的是什么呢? 那就是,一些操作要保证用户操作的是用户自己个人的数据.举个 ...

  5. 水题:51Nod1095-Anigram单词

    1095 Anigram单词 基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题 Description 一个单词a如果通过交换单词中字母的顺序可以得到另外的单词b,那 ...

  6. Wannafly挑战赛21 机器人

    从前在月球上有一个机器人.月球可以看作一个 n*m 的网格图,每个格子有三种可能:空地,障碍,机器人(有且仅有一个),现在地面指挥中心想让机器人在月球上行走,每次可以发送一个指令,为 U-往上走.D- ...

  7. Git for Windows 工具的使用(一)

    如果你还不知道什么是Git,只知道GitHub,但是还不会用,我想这个教程会帮助你. 前言 鉴于网上目前的教材都太落后,GitHub for Windows已经更新了多个版本,好多界面都发生了变化,所 ...

  8. 查看 EGLIBC 版本

    $ ldd --versionldd (Debian EGLIBC 2.13-38+deb7u1) 2.13

  9. Linux学习-CentOS 7.x 预设启动的服务简易说明

    这里 仅介绍几个很常见的 daemons 而已,更多的信息呢,就得要麻烦你自己使用 systemctl list-unit-files --type=service 去查询.底下的建议主要是针对 Li ...

  10. UVa 11552 DP Fewest Flops

    题解 #include <cstdio> #include <cstring> #include <algorithm> using namespace std; ...