python函式之協程與面向過程程式設計

2022-02-20 19:28:58 字數 4193 閱讀 4529

初步了解協程

def

eater():

print('

start to eat')

while

true:

food=yield

print('

is eating food:%s

'%food)

defproducer():

dog=eater()

next(dog)

#先next一次喚醒協程函式

#然後下面的操作都是dog.send(值)

food1='

北京烤鴨

'food2='

魚香肉絲

'dog.send(food1)

dog.send(food2)

producer()

輸出結果:

start to eat

iseating food:北京烤鴨

is eating food:魚香肉絲

如果有多個多個協程函式都需要初始化的話,我們用裝飾器

def

init(func):

def warpper(*args,**kwargs):

g=func(*args,**kwargs)

next(g)

return

g

return

warpper

@init

#eater=init(eater) #eater=warpper

defeater():

print('

start to eat')

while

true:

food=yield

print('

is eating food:%s

' %food)

e=eater()#

e=warpper()

e.send('

北京烤鴨')

輸出結果:

start to eat

is eating food:北京烤鴨

如果我們在寫專案的時候,並且有多個協程函式,我們需要寫注釋,該怎麼寫:

錯誤示例:

def

init(func):

def warpper(*args,**kwargs):

'我是warpper函式

'g=func(*args,**kwargs)

next(g)

return

g

return

warpper

@init

#eater=init(eater) #eater=warpper

defeater():

'我是eater函式

'print('

start to eat')

while

true:

food=yield

print('

is eating food:%s

' %food)

print

(help(eater))

輸出結果:

help on function warpper

in module __main__

:warpper(*args, **kwargs)

我是warpper函式

none

我們看的是eater函式的幫助資訊,返回的卻是warpper函式資訊的幫助

view code

正確示例:

import

functools

definit(func):

@functools.wraps(func)

#讓warpper的幫助資訊同eater相同

def warpper(*args,**kwargs):

'我是warpper函式

'g=func(*args,**kwargs)

next(g)

return

g

return

warpper

@init

#eater=init(eater) #eater=warpper

defeater():

'我是eater函式

'print('

start to eat')

while

true:

food=yield

print('

is eating food:%s

' %food)

print

(help(eater))

輸出結果:

help on function eater

in module __main__

:eater()

我是eater函式

none

view code

#實現grep -rl 'python' /root/

import

osimport

functools

definit(func):

@functools.wraps(func)

#讓warpper的幫助資訊同eater相同

def warpper(*args,**kwargs):

'我是warpper函式

'g=func(*args,**kwargs)

next(g)

return

g

return

warpper

#面向過程的程式設計

#擴充套件性差

defget_file(abs_path,target):

'''生產乙個個檔案

:param abs_path:傳進來的決對路徑

:param target: 下乙個目標

:return: 返回絕對檔案的路徑

'''g=os.walk(abs_path)

for top_dir,current_dir,files in

g:

for file in

files:

abs_file_path=r'

%s\%s

' %(top_dir,file)

target.send(abs_file_path)

@init

defopener(target):

'''開啟檔案

:return: 返回控制代碼

:param target 下乙個目標

'''while

true:

abs_file_path=yield

with open(abs_file_path) as f:

target.send((f,abs_file_path))

@init

defget_lines(target):

'''讀取每一行的內容

:param target: 下乙個目標

:return:返回每一行的內容

'''while

true:

f,abs_file_path=yield

for line in

f: target.send((line,abs_file_path))

@init

defgrep(pattern,target):

'''過濾關鍵字

:param pattern:匹配關鍵字

:param target: 下乙個目標

:return: 返回檔案

'''while

true:

line,abs_file_path=yield

if pattern in

line:

target.send(abs_file_path)

@init

defprinter():

'''列印功能

:return:輸出資訊

'''while

true:

abs_file_path=yield

print

(abs_file_path)

get_file(r

'd:\test

',opener(get_lines(grep('

zzl',printer()))))

Python之協程函式

python之協程函式 什麼是協程函式 如果乙個函式內部yield的使用方法是表示式形式的話,如x yield,那麼該函式成為協程函式。def eater name print s start to eat food name food list while true food yield food...

python協程與非同步協程

在前面幾個部落格中我們一一對應解決了消費者消費的速度跟不上生產者,浪費我們大量的時間去等待的問題,在這裡,針對業務邏輯比較耗時間的問題,我們還有除了多程序之外更優的解決方式,那就是協程和非同步協程。在引入這個概念之前我們先看 看這個圖 從這個我們可以看出來,假如來了9個任務,即使我們開了多程序,在業...

python協程函式

例項 def menu x print welcome s to shaxian restaurant x men list while true print men list food yield men list print s start to eat s x,food g menu 張三 n...