python第二阶段第五天额外增加
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python第二阶段第五天额外增加相关的知识,希望对你有一定的参考价值。
迭代器
概念:
迭代的概念:重复+上一次迭代的结果为下一次迭代的初始值
重复的过程称为迭代,每次重复即一次迭代,
并且每次迭代的结果是下一次迭代的初始值
可迭代对象:只有iter方法,执行该方法得到的迭代器对象
迭代协议:
对象有next
对象有iter,对于迭代器对象来说,执行iter方法,得到的结果仍然是它本身
可以作为for 循环的被循环体 都是可迭代对象;
li=[1,2,3,4,5]
a=li.__iter__() -->生成迭代器
print (a.__next__())
print (a.__next__())
print (a.__next__())
print (a.__next__())
上面和
for i in li:
print (i)
是一样的,只不过 for 循环 捕捉了 报错,然后停掉了
迭代器的优点和缺点
优点:
1.提供了一种不依赖下标的迭代方式
2.就跌迭代器本身来说,更节省内存
缺点:
- 无法获取迭代器对象的长度
- 不如序列类型取值灵活,是一次性的,只能往后取值,不能往前退
生成器
#生成器函数:只要函数体包含yield关键字,该函数就是生成器函数
#生成器就是迭代器
def A():
print (‘----1‘)
yield 1
print (‘-----2‘)
yield 2
print (‘-------3‘)
yield 3
JG=A()
print (JG.__next__())
print (JG.__next__())
print (JG.__next__())
yield和return 相比 同样是返回值
但是 return 相当于break
而yield 还可以通过 next 方法调用下面
demo grep -rl ‘python‘ /root 功能 的实现
import os
def init(func):
def wrapper(*args,**kwargs):
res=func(*args,**kwargs)
next(res)
return res
return wrapper
@init
def search(target):
while True:
search_path=yield
g=os.walk(search_path)
for par_dir,_,files in g:
for file in files:
file_abs_path=r‘%s\%s‘ %(par_dir,file)
# print(file_abs_path)
target.send(file_abs_path)
@init
def opener(target):
while True:
file_abs_path=yield
# print(‘opener func==>‘,file_abs_path)
with open(file_abs_path,encoding=‘utf-8‘) as f:
target.send((file_abs_path,f))
@init
def cat(target):
while True:
file_abs_path,f=yield #(file_abs_path,f)
for line in f:
tag=target.send((file_abs_path,line))
if tag:
break
@init
def grep(target,pattern):
tag=False
while True:
file_abs_path,line=yield tag
tag=False
if pattern in line:
tag=True
target.send(file_abs_path)
@init
def printer():
while True:
file_abs_path=yield
print(file_abs_path)
x=r‘C:UsersAdministratorPycharmProjectsday5a‘
g=search(opener(cat(grep(printer(),‘python‘))))
print(g)
g.send(x)
以上是关于python第二阶段第五天额外增加的主要内容,如果未能解决你的问题,请参考以下文章