Day 22 生成器yield表达式及内置函数(一丢丢)
本日知识点:
###################################
#一、上节课复习:在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表达式及内置函数(一丢丢)的更多相关文章
- python第十二天 生成器,迭代器,内置函数
第二模块学习: 生成器,迭代器,内置函数 生成器特点:只有在调用时才会生成相应的数据,运行的速度快! 示例: def fil(max):#斐波那契数 n,a,b=0,0,1 #定义初始数据 whil ...
- 第四章 函数之lambda 表达式和内置函数
4.5 lambda 表达式 用于表示简单的函数. # 三元运算,为了解决简单的if else的情况,如:if 1 == 1: a = 123else: a = 456# 相当于a = 1 ...
- lambda 表达式+python内置函数
#函数 def f1(a,b): retrun a+b #lambda方式,形参(a,b):返回值(a+b) f2=lambda a,b : a+b 在一些比较简单的过程计算就可以用lambda p ...
- Python3基础(4)匿名函数、装饰器、生成器、迭代器、内置函数、json&pickle序列化、软件目录开发规范、不同目录间模块调用
---------------个人学习笔记--------------- ----------------本文作者吴疆-------------- ------点击此处链接至博客园原文------ 1 ...
- day11 - 15(装饰器、生成器、迭代器、内置函数、推导式)
day11:装饰器(装饰器形成.装饰器作用.@语法糖.原则.固定模式) 装饰器形成:最简单的.有返回值的.有一个参数的.万能参数 函数起的作用:装饰器用于在已经完成的函数前后增加功能 语法糖:使代码变 ...
- lambda表达式、内置函数、进制和文件操作
lambda表达式 定义函数(普通方式)def f1(): return 123 f2 = lambda : 123 def f3(a1,a2): return a1+a2 定义函数(lambda表达 ...
- python — lambda表达式与内置函数
目录 1 lambda表达式 (匿名函数) 2 内置函数 1 lambda表达式 (匿名函数) 用于表示简单的函数 lambda表达式,为了解决简单函数的情况: def func(a1,a2): == ...
- 【Python全栈笔记】04 [模块二] 18 Oct lambda表达式, 内置函数
lambda表达式 lambda表达式是函数的一种简化,如下面两种函数定义方法,实际上效果是一样的. 使用lambda表达式的函数,func2是函数名,lambda: 后面的123 即为返回值. de ...
- python入门之lambda表达式、内置函数
lambda 简单的函数就可以用lambda表达式 格式: abc = lambda a1,a2:a1+a2 其中,传参是a1和a2,返回值是a1+a2 内置函数 abs(a) #取绝对值 all(a ...
随机推荐
- Noip 训练指南
目录 Noip 训练指南 图论 数据结构 位运算 期望 题解 Noip 训练指南 目前完成 \(4 / 72\) 图论 [ ] 跳楼机 [ ] 墨墨的等式 [ ] 最优贸易 [ ] 泥泞的道路 [ ] ...
- Applied Nonparametric Statistics-lec6
Ref: https://onlinecourses.science.psu.edu/stat464/print/book/export/html/8 前面都是对一两个样本的检查,现在考虑k个样本的情 ...
- 算法导论 第七章 快速排序(python)
用的最多的排序 平均性能:O(nlogn){随机化nlogn} 原地址排序 稳定性:不稳定 思想:分治 (切分左右) 学习方式:自己在纸上走一遍 def PARTITION(A,p,r): x = ...
- debian 7 stable 不能编译android源码
rebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.8-linaro/bin/arm-linux-androideabi-gcc: /lib/x86_ ...
- Android CTS - Cannot run program "aapt"/ Fail to run aapt on .../apk installed but AaptParser failed
今天同事碰到cts的一些问题,跑到某个apk的时候,就提示如下错误: Cannot run program "aapt": error=2. No such file or dir ...
- ModelViewSet的继承关系
- js 常用判断
JS三元运算符 三元运算符: 如名字表示的三元运算符需要三个操作数. 语法是 条件 ? 结果1 : 结果2;. 这里你把条件写在问号(?)的前面后面跟着用冒号(:)分隔的结果1和结果2.满足条件时结果 ...
- Java连接Access数据库的那些坑
Java 使用 JDBC 连接Access数据库 需要掌握的技能 1.Java SE基本技术 2.懂点JDBC技术 能够学到如何使用Java正确的连接JDBC 环境 window8.1 64位 jdk ...
- 大数据学习——spark安装
一主多从 1 上传压缩包 2 解压 -bin-hadoop2..tgz 删除安装包 -bin-hadoop2..tgz 重命名 mv spark-1.6.2-bin-hadoop2.6/ spark ...
- “万恶”的break
写这篇随笔主要是希望自己长点记性,break的作用是跳出当次循环,每次用break都有点忘记break后面的条件提前. 正常是这样: exit_flag=Falsefor i in range(10) ...