本日知识点:

###################################
#一、上节课复习:在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. jenkins+maven+svn 自动化部署

    背景: 公司的web平台使用JAVA写的,但是不是用Tomcat部署的,代码内部自带了Web服务器,所以只需要有JAVA环境,将代码打包上传,启动脚本就可以. 项目是根据pom.xml打包成的是.zi ...

  2. LeetCode_6

    问题: 6. Z字形变换 链接:https://leetcode-cn.com/problems/zigzag-conversion/description/ 分析: A 仿真方法 直接模拟整个过程, ...

  3. jquery图片切换插件jquery.cycle.js参数详解

    转自:国人的力量 blog.163.com/xz551@126/blog/static/821257972012101541835491/ 自从使用了jquery.cycle.js,我觉得再也不用自己 ...

  4. Java多线程之Deque与LinkedBlockingDeque深入分析

    有大小的队列就叫有界队列 如 ArrayBlockingquue, 反之是无界队列 如 LinkedBlockingDeque. 单词写错了.  是的,LinkedBlockingDeque 永远满不 ...

  5. Python模块(三)(正则,re,模块与包)

    1. 正则表达式 匹配字符串 元字符 .   除了换行 \w  数字, 字母, 下划线 \d  数字 \s  空白符 \n 换行符 \t  制表符 \b  单词的边界 \W  \D \S 非xxx [ ...

  6. stm32L0系列学习(一)

    开发用到的具体芯片是stm32L011F3 stm32L0总体特性,定位: 可见容量是比较少的,功耗很低,adc12位,7种低功耗模式 jlink和sdk的引脚关系图: HAL的库框图 官方给出的HA ...

  7. C#语言入门

    1.基础知识 2.数据类型 3.控制语句 4.

  8. poj 1017 装箱子问题 贪心算法

    题意:有1*1到6*6的的东西,需要用6*6的箱子将它们装起来.问:至少需要多少个6*6箱子 思路: 一个瓶子怎么装东西最多?先装石头,在装沙子,然后装水. 同样放在本题就是先装6*6然后5*5... ...

  9. Linux学习-什么是 daemon 与服务 (service)

    『常驻在记体体中的程序,且可以提供 一些系统或网络功能,那就是服务』.而服务一般的英文说法是『 service 』. 那么 daemon 与 service 有关啰?否则为什么都能够提供 某些系统或网 ...

  10. SQL_4_函数

    在SQL的函数中可以执行一些诸如对某一些进行汇总或将一个字符串中的字符转换为大写的操作等: 函数有:汇总函数.日期与时间函数.数学函数.字符函数.转换函数与其他函数. 汇总函数 这是一组函数,它们返回 ...