字典、集合,文件都没有索引。
装饰器
一:开放封闭原则,对扩展是开放的,对修改是封闭的
二:装饰器,装饰器可以是任意可调用对象,被装饰的对象也可以是任意可调用对象,
三:原则:
1.不修改源代码
2.不修改调用方法
1、迭代器:
1、Zip,min ,max 都是迭代器。
2、数字不可迭代。
3、next 触发迭代器的执行。
def func(n):
while True:
yield n
n-=1
g=func(5)
print(next(g))
查看是否可迭代:
# print(hasattr(d,'__iter__')) #适合python3
For取值
for i in d:
print(i)
while取值
obj=d.__iter__()
while True:
try:
print(obj.__next__())
except StopIteration:
break
2、生成器
Yield
把__iter__和__next__方法封到函数里。
- 包含yield关键字的函数叫生成器。
- 生成器本质就是迭代器。
- 生成器的用途:模拟管道,惰性计算。
Yield的表达式形式
send
Send基于暂停的yield,给yield传一个值,再继续往下执行。表达式形式的yield,第一件事应该是初始化,让生成器走到一个暂停的位置。
写个装饰器,功能是初始化生成器。
def init(func):
def wrapper(*args,**kwargs):
x=func(*args,**kwargs)
next(x)
return x
return wrapper
@init
def eater(name):
print('%s please ready' % name)
food_list=[]
while True:
food = yield food_list
food_list.append(food)
print('please %s eat %s' %(name,food))
def make_food(people,n):
for i in range(n):
people.send('food%s' %i)
eater('alex').send('tudou')
make_food(eater('alex'),5)
应用:grep –rl ‘root’ /etc
Day22 ==》3面向过程编程
#!/usr/bin/env python
# coding:utf-8
import os
def init(func):
def wrapper(*args,**kwargs):
g=func(*args,**kwargs)
next(g)
return g
return wrapper
#阶段一:递归地找文件的绝对路径,把路径发给阶段二。
def search(target,start_path):
'search file
obspath'
g = os.walk(start_path)
for par_dir,_,files in g:
#print(par_dir,files)
for file in files:
file_path = r'%s\%s' % (par_dir,file)
target.send(file_path)
#阶段二:收到文件路径,打开文件获取对象,把文件对象发给阶段三。
@init
def opener(target):
'get file obj:
f=open(filepath'
while True:
file_path=yield
with open(file_path) as f:
target.send((file_path,f)) #需要以元组的形式
#阶段三:收到文件对象,for循环读取文件的每一行内容,把每一行内容发给阶段四.
@init
def cat(target):
'read file'
while True:
filepath,f=yield
for line in f:
target.send((filepath,line))
#阶段四:收到一行内容,判断root是否在这一行中,如果在,则把文件名发给阶段五。
@init
def grep(target,pattern):
'grep function'
while True:
filepath,line=yield
if pattern in line:
target.send(filepath)
#阶段五:
@init
def printer():
'print function'
while True:
filename=yield
print(filename)
start_path=r'd:dddd'
search(opener(cat(grep(printer(),'root'))),start_path)
厨师做包子给吃货(yield,面向过程,)
#!/usr/bin/env python
#coding:GBK
#厨师 , count:造多少个包子
import time
import random
def init(func):
def wrapper(*args,**kwargs):
res=func(*args,**kwargs)
next(res)
return res
return wrapper
def producer(target,count):
for i in range(count):
time.sleep(random.randrange(1,3))
print('