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 ...
随机推荐
- C/C++字符串笔试知识点及实例
一.C字符串与C++字符串的深入理解 对于C语言,需要区分C字符串和C字符数组. C字符串:以字符NULL('\0')结尾的字符数组: C字符数组:数组元素类型为字符类型. C字符串的的初始化:c ...
- redis代理集群(Twemproxy)(1)
redis主从+哨兵模式只解决了读的分布式操作,大大提高了性能:但是写操作,只有主主机器才能进行,从机器无法进行写操作.此时,Twemproxy也就出现了. 这个模式单纯的安装有些复杂,需要引入很多的 ...
- LeetCode(279)Perfect Squares
题目 Given a positive integer n, find the least number of perfect square numbers (for example, 1, 4, 9 ...
- 监控网络流量iftop和nethogs安装
服务器环境是centos7,centos下通常使用iftop,或者nethogs来进行网络流量监控.这2个工具都需要先安装epel,因为这个库通常操作系统是不自带的.那么就先安装epel,使用的命令是 ...
- POJ - 2250 Compromise (LCS打印序列)
题意:给你两个单词序列,求出他们的最长公共子序列. 多组数据输入,单词序列长度<=100,单词长度<=30 因为所有组成LCS的单词都是通过 a[i] == b[j] 更新的. 打印序列的 ...
- hdu 5441
Travel Time Limit: 1500/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Total Su ...
- Java + golang 爬取B站up主粉丝数
自从学习了爬虫,就想在B站爬取点什么数据,最近看到一些个up主涨粉很快,于是对up主的粉丝数量产生了好奇,所以就有了标题~ 首先,我天真的以为通过up主个人空间的地址就能爬到 https://spac ...
- alidoing --使用JS实现多语言框架、喜欢的请进、、瓦特平台!
大家好! 多语言实现的案例:http://alidoing.com/或者http://www.alidoing.com/ 图:切换语言界面 JS代码实现: 1.首先新建一个对象langobj,当然对象 ...
- Selenium WebDriver-网页的前进、后退、刷新、最大化、获取窗口位置、设置窗口大小、获取页面title、获取网页源码、获取Url等基本操作
通过selenium webdriver操作网页前进.后退.刷新.最大化.获取窗口位置.设置窗口大小.获取页面title.获取网页源码.获取Url等基本操作 from selenium import ...
- 聊聊、Nginx 参数合法性
我们接着上篇文章来讲讲 ngx_get_options 函数. 这个函数就在 nginx.c 文件中,我们来看看. 参数 argc,argv 我们在前面的文章中都已经提到了,在这里我们看 ngx_ge ...