python 教材为什么喜欢用spam举例_Python3学习之路(第五章)

一、表达式形式的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

1134765-20170603083040883-1261834705.png

ContractedBlock.gif

ExpandedBlockStart.gif

<

<

<

<

<

ContractedBlock.gif

ExpandedBlockStart.gif

19217264230385030.jpg?param=50y50&quality=100

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值