python_递归_协程函数(yield关键字)_匿名函数_模块

协程函数(yield)

协程函数:生成器:yield关键字的另一种用法

例:装饰器自动初始化函数(生成器函数)deco

 1 yield的语句形式: yield 1
 2 #yield的表达式形式: x=yield
 3
 4
 5
 6 #协程函数
 7
 8 def deco(func):
 9     def wrapper(*args,**kwargs):
10         res=func(*args,**kwargs)
11         next(res)
12         return res
13     return wrapper
14
15 @deco
16 def eater(name):
17     print(‘%s ready to eat‘ %name)
18     food_list=[]
19     while True:
20         food=yield food_list
21         food_list.append(food)
22         print(‘%s start to eat %s‘ %(name,food))
23
24
25 g=eater(‘alex‘)
26 # print(g)
27 # next(g) #等同于 g.send(None)
28
29 #
30
31 # g.send(‘手指头‘)
32 # g.send(‘脚指头‘)
33 # g.send(‘别人的手指头‘)
34 # g.send(‘别人的脚指头‘)
35
36 # print(g)
37 print(g.send(‘脚趾头1‘))
38 print(g.send(‘脚趾头2‘))
39 print(g.send(‘脚趾头3‘))
40
41
42
43
44 #x=yield
45 #g.send(‘1111‘),先把1111传给yield,由yield赋值给x
46 # 然后再往下执行,直到再次碰到yield,然后把yield后的返回值返回

协程函数示例

表达式形式的yield的用途:

示例:模仿grep -rl <dir>;递归过滤文件和文件内容;os.walk(r;原生字符串,python解释器跳过解释;<dir>)

 1 #grep -rl ‘python‘ /root
 2
 3
 4 import os
 5
 6 def init(func):
 7     def wrapper(*args,**kwargs):
 8         res=func(*args,**kwargs)
 9         next(res)
10         return res
11     return wrapper
12
13 @init
14 def search(target):
15     while True:
16         search_path=yield
17         g=os.walk(search_path)
18         for par_dir,_,files in g:
19             for file in files:
20                 file_abs_path=r‘%s\%s‘ %(par_dir,file)
21                 # print(file_abs_path)
22                 target.send(file_abs_path)
23
24 @init
25 def opener(target):
26     while True:
27         file_abs_path=yield
28         # print(‘opener func==>‘,file_abs_path)
29         with open(file_abs_path,encoding=‘utf-8‘) as f:
30             target.send((file_abs_path,f))
31
32 @init
33 def cat(target):
34     while True:
35         file_abs_path,f=yield  #(file_abs_path,f)
36         for line in f:
37             tag=target.send((file_abs_path,line))
38             if tag:
39                 break
40 @init
41 def grep(target,pattern):
42     tag=False
43     while True:
44         file_abs_path,line=yield tag
45         tag=False
46         if pattern in line:
47             tag=True
48             target.send(file_abs_path)
49
50 @init
51 def printer():
52     while True:
53         file_abs_path=yield
54         print(file_abs_path)
55
56
57
58 x=r‘C:\Users\Administrator\PycharmProjects\python17期\day5\a‘
59
60
61
62 g=search(opener(cat(grep(printer(),‘python‘))))
63 print(g)
64
65 g.send(x)

表达式_grep -rl

匿名函数 lambda

匿名函数:与函数有相同的作用域,但是匿名意味着引用计数为0,使用一次就释放,除非让其有名字

示例:

有名函数:

def func (x,y):

  return x+y

匿名函数

lanbda x,y:x+y

匿名函数常用场景:max,min,sorted,map,reduce,filter

 1 #匿名函数
 2 # f=lambda x,y:x+y
 3 # print(f)
 4 #
 5 # print(f(1,2))
 6 #
 7 # lambda x,y:x+y
 8
 9
10 #max,min,zip,sorted的用法
11 salaries={
12 ‘egon‘:3000,
13 ‘alex‘:100000000,
14 ‘wupeiqi‘:10000,
15 ‘yuanhao‘:2000
16 }
17
18 # print(max(salaries))
19 # res=zip(salaries.values(),salaries.keys())
20 #
21 # # print(list(res))
22 # print(max(res))
23
24 # def func(k):
25 #     return salaries[k]
26
27 # print(max(salaries,key=func))
28 # print(max(salaries,key=lambda k:salaries[k]))
29 # print(min(salaries,key=lambda k:salaries[k]))
30
31 # print(sorted(salaries)) #默认的排序结果是从小到到
32 # print(sorted(salaries,key=lambda x:salaries[x])) #默认的排序结果是从小到到
33 # print(sorted(salaries,key=lambda x:salaries[x],reverse=True)) #默认的排序结果是从小到到
34 #
35
36
37
38
39 # x=1000
40 # def f1():
41 #     # global x
42 #     x=0
43 #
44 # f1()
45 # print(x)
46
47
48
49
50 ‘‘‘
51 4. 内置函数
52     map
53     reduce
54     filter
55 ‘‘‘
56
57
58 # def func(f):
59 #     return f
60 #
61 # res=func(max)
62 # print(res)
63
64
65 # l=[‘alex‘,‘wupeiqi‘,‘yuanhao‘]
66 #
67 #
68 # res=map(lambda x:x+‘_SB‘,l)
69 #
70 # print(res)
71 #
72 # print(list(res))
73 #
74 # nums=(2,4,9,10)
75 #
76 # res1=map(lambda x:x**2,nums)
77 #
78 # print(list(res1))
79
80 # from functools import reduce
81 #
82 # l=[1,2,3,4,5]
83 # print(reduce(lambda x,y:x+y,l,10))
84
85
86 # l=[‘alex_SB‘,‘wupeiqi_SB‘,‘yuanhao_SB‘,‘egon‘]
87 #
88 # res=filter(lambda x:x.endswith(‘SB‘),l)
89 # print(res)
90 # print(list(res))

匿名函数使用场景

递归调用函数

递归:在函数调用过程中,直接或间接的调用了函数本身,这就是函数的递归调用

递归函数示例:

  

1 # def age(n):
2 #     if n == 1:
3 #         return 18
4 #     return age(n-1)+2
5 #
6 # print(age(5))

递归函数

二分法:

示例:

l = [1, 2, 10,33,53,71,73,75,77,85,101,201,202,999,11111]

def search(find_num,seq):
    if len(seq) == 0:
        print(‘not exists‘)
        return
    mid_index=len(seq)//2
    mid_num=seq[mid_index]
    print(seq,mid_num)
    if find_num > mid_num:
        #in the right
        seq=seq[mid_index+1:]
        search(find_num,seq)
    elif find_num < mid_num:
        #in the left
        seq=seq[:mid_index]
        search(find_num,seq)
    else:
        print(‘find it‘)

  

模块

模块:一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀

为什么使用模块:

如果你退出python解释器然后重新进入,那么你之前定义的函数或者变量都将丢失,因此我们通常将程序写到文件中以便永久保存下来,需要时就通过python test.py方式去执行,此时test.py被称为脚本script。

随着程序的发展,功能越来越多,为了方便管理,我们通常将程序分成一个个的文件,这样做程序的结构更清晰,方便管理。这时我们不仅仅可以把这些文件当做脚本去执行,还可以把他们当做模块来导入到其他的模块中,实现了功能的重复利用,

使用模块:import ; from xx import xx,xxx,xx *

import导入模块干的事:‘‘‘1.产生新的名称空间2.以新建的名称空间为全局名称空间,执行文件的代码3.拿到一个模块名spam,指向spam.py产生的名称空间

from xx import xx ,*
1.产生新的名称空间2.以新建的名称空间为全局名称空间,执行文件的代码3.直接拿到就是spam.py产生的名称空间中名字

优缺点:

优点:方便,不用加前缀缺点:容易跟当前文件的名称空间冲突


时间: 2024-08-03 15:24:40

python_递归_协程函数(yield关键字)_匿名函数_模块的相关文章

python--同步锁/递归锁/协程

同步锁/递归锁/协程 1 同步锁 锁通常被用来实现对共享资源的同步访问,为每一个共享资源创建一个Lock对象,当你需需要访问该资源时,调用acquire()方法来获取锁对象(如果其他线程已经获得了该锁,则当前线程需要等待其被释放),待资源访问完后,在调用release方式释放锁: import threading import time def subnum(): global num # num-=1 lock.acquire() #对用户进行加锁处理 #加锁只对用户数据 等第一个释放完之后才

协程,事件,队列,同步,异步,回调函数

协程 什么是协成?单个线程并发的处理多个任务,程序控制协成的切换+保持状态,协成的切换速度非常快,蒙蔽了操作系统的眼睛,让操作系统认为CPU一直在运行 进程或线程都是由操作系统控制CPU来回切换,遇到阻塞就切换执行其他任务,协成是程序控制的,霸占CPU执行任务,会在操作系统控制CPU之前来回切换,操作系统就认为CPU一直在运作 协程的优点: 1.开销小 2.运行速度快 3.协程会长期霸占CPU只执行我程序里的所有任务 协程的缺点: 1.协程属于微并发,处理任务不易过多 2.协程的本质是单线程,无

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,协

python协程:yield的使用

本文和大家分享的主要是python协程yield相关内容,一起来看看吧,希望对大家学习python有所帮助. 协程定义 协程的底层架构是在pep342 中定义,并在python2.5 实现的. python2.5 中,yield关键字可以在表达式中使用,而且生成器API中增加了 .send(value)方法.生成器可以使用.send(...)方法发送数据,发送的数据会成为生成器函数中yield表达式的值. 协程是指一个过程,这个过程与调用方协作,产出有调用方提供的值.因此,生成器可以作为协程使用

理解Python协程:从yield/send到yield from再到async/await

Python中的协程大概经历了如下三个阶段: 1. 最初的生成器变形yield/send 2. 引入@asyncio.coroutine和yield from 3. 在最近的Python3.5版本中引入async/await关键字 一.生成器变形yield/send def mygen(alist): while len(alist) > 0: c = randint(0, len(alist)-1) yield alist.pop(c) a = ["aa","bb&q

【函数】02、匿名函数、生成器、高阶函数

一.匿名函数 1.定义 语法格式: lambda args:expression args:以逗号分隔的参数列表 expression:用到args中各参数的表达式 lambda定义的代码必须是合法的表达式,不能出现多条件语句(可使用if的三元表达式)和非表达式,如for和while等 lambda的首要用途是指定短小的回调函数 lambda将返回一个函数而不是将函数赋值给某变量名 In [77]: lambda x: x+1 Out[77]: <function __main__.<lamb

14、内置函数、递归函数、匿名函数

一.内置函数 # print(abs(-1))# print(all([1,2,3]))# print(all([0,2,3])) # print(all('')) # print(any([0,None,'',1]))# print(any([0,None,'']))# print(any([])) # print(bin(3))# print(hex(17))# print(oct(9)) #0 None 空===>bool值为False,其余都为True # def func():# pa

JS函数 -- 功能,语法,返回值,匿名函数,自调用匿名函数,全局变量与局部变量,arguments的使用

“JavaScript设计得最出色的就是它的函数的实现.” -- <JavaScript语言精粹> 函数包含一组语句,它们是JS的基础模块单元,用于指定对象的行为.一般来说,所谓编程,就是将一组需求分解成一组函数与数据结构的技能. 1.函数的功能 代码重复性使用 模块化编程 2.语法: 使用函数前要先定义才能使用 函数定义有三个部分:函数名,参数列表,函数体 格式: 1 function 函数名([参数1, 参数2, ...]){ 2 3 函数执行部分; 4 5 return 表达式; 6 7

函数篇之2——匿名函数

1.  匿名函数实例: >>> function ( a ){ return a; } 匿名函数也就是说没有方法名. 2.  匿名函数的主要用法: 2.1 我们可以将匿名函数作为参数传递给其它函数,这样,接收方函数就能利用我们所传递的函数来完成某些事情. 2.2 我们可以定义某个匿名函数来执行某些一次性任务. 3.  接下来,我们来看具体的应用示例,通过其中的细节来进一步了解匿名函数. 3.1 回调函数 ①.  解释: 当我们将函数A 传递给函数B ,并由B 来执行A 时,A 就成了一个