首页 > 代码库 > day05 协程函数,递归函数,匿名函数lambda,内置函数map reduce filter max min zip sorted,匿名函数lambda和内置函数结合使用,面向过程编程与函数编程,模块与包的使用,re模块内置函数

day05 协程函数,递归函数,匿名函数lambda,内置函数map reduce filter max min zip sorted,匿名函数lambda和内置函数结合使用,面向过程编程与函数编程,模块与包的使用,re模块内置函数

 

   

基础篇


本章大纲:

协程函数

递归函数
 
匿名函数lambda
 
内置函数map reduce filter  max min zip sorted

匿名函数lambda和内置函数结合使用

面向过程编程与函数编程

模块与包的使用

re模块内置函数
 

一,协程函数
 
注意:函数先定义,后使用。这是函数第一原则。函数主要分为定义,调用

1.1,什么是协程函数
      协程函数特点:yield变为表达式,可以通过g.send(value)传值,用send传值时协程函数需要初始化,也可以说是生成器函数的一种
 
1.2,协程函数的初识
def eater(name):
    print(‘%s 开始吃了‘ %name)
    while True:
        food=yield
        print(‘%s开始吃%s‘%(name,food))



g=eater(‘alex‘)
next(g)

 断点分析为什么需要next()

技术分享

技术分享

  第一步用next作用:

      a,因为yeild的原因程序肯定是暂停的。只有next程序才能执行。

      b,而send是先发送一个值给yeild然后在next,显然程序都不能开始了。从何说起接收send发送的值呀。所以第一步next让程序先走到yeild停等待send发值状态

 

  第二步send作用:

      a,通过send把值发送给暂停的yeild

      b,当yeild接收到了send发送的值,他会自动next()一次生成器

 
 
1.3,通过yeild表达式保存协程函数状态
 
 
def eater(name):
    print(‘%s 开始吃了‘ %name)
    list1=[]
    while True:
        food=yield list1
        print(‘%s开始吃%s‘%(name,food))
        list1.append(food)


g=eater(‘alex‘)
next(g)
res=g.send(‘苹果‘)
res=g.send(‘橘子‘)
res=g.send(‘香蕉‘)
print(res)

  

 1.4通过装饰器解决协程函数第一次next问题
def zhuangshi(func):
    def neibu(*args,**kwargs):
        g=func(*args,**kwargs)
        next(g)
        return g
    return neibu
@zhuangshi      #eater=neibu
def eater(name):
    print(‘%s 开始吃了‘ %name)
    list1=[]
    while True:
        food=yield list1
        print(‘%s开始吃%s‘%(name,food))
        list1.append(food)


g=eater(‘alex‘)
res=g.send(‘苹果‘)
res=g.send(‘橘子‘)
res=g.send(‘香蕉‘)
print(res)

 1.5 利用yeild实现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)

  

二,递归函数
 2.1,什么是递归函数

  递归调用顾名思义即在函数内部调用函数(自己调用自己),通常用它来计算阶乘,累加等
 
 2.2,递归函数计算1-100
 
 
 2.3,递归函数的递归层级问题
 
 
 2.4,怎么避免递归层级过问题
 
 
 2.5,递归函数优化方向尾递归
 
Python介绍


Python介绍


Python介绍


Python介绍


Python介绍


Python介绍


Python介绍


Python介绍


Python介绍


Python介绍


Python介绍


Python介绍


Python介绍


Python介绍


Python介绍


Python介绍


day05 协程函数,递归函数,匿名函数lambda,内置函数map reduce filter max min zip sorted,匿名函数lambda和内置函数结合使用,面向过程编程与函数编程,模块与包的使用,re模块内置函数