一、表达式形式的yield
def deco(func):
def wrapper(*args,**kwargs):
res=func(*args,**kwargs)
next(res)
return res
return wrapper
@deco
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))
g=eater('alex')
# print(g)
# next(g) #等同于 g.send(None)
#
# g.send('手指头')
# g.send('脚指头')
# g.send('别人的手指头')
# g.send('别人的脚指头')
# print(g)
print(g.send('脚趾头1'))
print(g.send('脚趾头2'))
print(g.send('脚趾头3'))
#x=yield
#g.send('1111'),先把1111传给yield,由yield赋值给x
# 然后再往下执行,直到再次碰到yield,然后把yield后的返回值返回
二、 表达式形式yield的应用与面向过程编程
模拟一个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:\Users\Administrator\PycharmProjects\python17期\day5\a'
g=search(opener(cat(grep(printer(),'python'))))
print(g)
g.send(x)
面向过程的程序设计:是一种流水线式的编程思路,是机械式
优点:
程序的结构清晰,可以把复杂的问题简单
缺点:
1 扩展性差
应用场景:
1 linux内核,git,httpd
三、匿名函数与zip,max,min,sorted
#max,min,zip,sorted的用法
salaries={
'egon':3000,
'alex':100000000,
'wupeiqi':10000,
'yuanhao':2000
}
def func(k):
return salaries[k]
print(max(salaries,key=lambda k:salaries[k]))
print(min(salaries,key=lambda k:salaries[k]))
print(sorted(salaries,key=lambda x:salaries[x]))
print(sorted(salaries,key=lambda x:salaries[x],reverse=True))
四、map,reduce,filter
map:把列表内每个元素后面加SB
l=['alex','wupeiqi','yuanhao']
res=map(lambda x:x+'_SB',l)print(list(res))
输出内容:
['alex_SB', 'wupeiqi_SB', 'yuanhao_SB']
map:把列表中每个元素做平方操作
1 nums=(2,4,9,10)2 res1=map(lambda x:x**2,nums)3 print(list(res1))4
5 输出内容:6 [4, 16, 81, 100]
reduce:需要先导入functools模块
from functools import reduce
reduce:做一个求和运算
1 from functools importreduce2 l=[1,2,3,4,5]3 print(reduce(lambda x,y:x+y,l))4
5 输出结果:6 15
7
8
9 可以加初始值(比如初始值10):10 from functools importreduce11 l=[1,2,3,4,5]12 print(reduce(lambda x,y:x+y,l,10))13
14 输出结果:15 25
filter:过滤出以SB结尾的元素
1 l=['alex_SB','wupeiqi_SB','yuanhao_SB','egon']2 res=filter(lambda x:x.endswith('SB'),l)3 print(list(res))4
5 输出内容:6 ['alex_SB', 'wupeiqi_SB', 'yuanhao_SB']
五、递归与二分法
递归调用:在函数调用过程中,直接或间接地调用了函数本身,这就是函数的递归调用
递归:问年龄,每个人比前一个人大两岁,第五个人18
1 defage(n):2 if n == 1:3 return 18
4 return age(n-1)+2
5 print(age(5))6
7 输出内容:8 26
二分法:找到指定的数字
1 defsearch(find_num,seq):2 if len(seq) ==0:3 print('not exists')4 return
5 mid_index=len(seq)//2
6 mid_num=seq[mid_index]7 #print(seq,mid_num)
8 if find_num >mid_num:9 #in the right
10 seq=seq[mid_index+1:]11 search(find_num,seq)12 elif find_num
<
<
<
<
<