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 ...
随机推荐
- 【Git版本控制】git将单个文件回退到某一版本
暂定此文件为a.jsp 1.进入到a.jsp所在目录,通过 git log a.jsp查看a.jsp的更改记录 2.找到想要回退的版本号:例如 fcd2093 通过 git reset fcd2 ...
- Docker 容器的网络连接 & 容器互联
1. Docker 容器网络基础架构 Docker0 ifconfig查看到的 docker0 是linux的虚拟网桥(OSI数据链路层) docker0 地址划分: 172.17.42.1 255. ...
- GOPATH和GOROOT
安装指定版本golang apt-get purge golang* //删除之前安装的文件 add-apt-repository ppa:evarlast/golang-1.8 apt-get up ...
- java代码导出数据到Excel、js导出数据到Excel(三)
jsp内容忽略,仅写个出发按钮: <button style="width: 100px" onclick="expertExcel()&quo ...
- SPOJ QTREE4 - Query on a tree IV 树分治
题意: 给出一棵边带权的树,初始树上所有节点都是白色. 有两种操作: C x,改变节点x的颜色,即白变黑,黑变白 A,询问树中最远的两个白色节点的距离,这两个白色节点可以重合(此时距离为0). 分析: ...
- java静态代理模式
代理模式分为动态代理和静态代理. 静态代理简述: 1.为其他对象提供一种代理,以控制对这个对象的访问. 2.代理对象会起到中介的作用,可以增加些功能,也可以去掉某些功能. 静态代理: 代理和被代理对象 ...
- Java-列出所有系统属性
package com.tj; import java.util.Enumeration; import java.util.Properties; public class MyClass impl ...
- luogu2158 [SDOI2008]仪仗队 欧拉函数
点 $ (i,j) $ 会看不见当有 $ k|i $ 且 $ k|j$ 时. 然后就成了求欧拉函数了. #include <iostream> #include <cstring&g ...
- xcode8.1 autolayout 找不到 Update Frames 按钮
- python 时间、日期、时间戳的转换
在实际开发中经常遇到时间格式的转换,例如: 前端传递的时间格式是字符串格式,我们需要将其转换为时间戳,或者前台传递的时间格式和我们数据库中的格式不对应,我们需要对其进行转换才能与数据库的时间进行匹配等 ...