python之百度接口语音识别
python编程之百度接口语音识别 首先在百度AI开放平台上创建语音识别应用,创建完毕应用后,得到系统分配给用户的AppID, API Key, secret Key,均为字符串,用于标识用户,为访问做签名验证。 得到验证后,开始编程 1.记录自己声音 2.将记录下来的音频文件上传至云端 3.解析返回后的结果 ...
python编程之百度接口语音识别 首先在百度AI开放平台上创建语音识别应用,创建完毕应用后,得到系统分配给用户的AppID, API Key, secret Key,均为字符串,用于标识用户,为访问做签名验证。 得到验证后,开始编程 1.记录自己声音 2.将记录下来的音频文件上传至云端 3.解析返回后的结果 ...
递归函数 递归特性 1.必须有一个明确的结束条件 2.每次进入更深一层递归时,问题规模相比上次递归都应有所减少 3.递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出) 代码演练 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 def send(student): if len(student) == 0: return 'All student revice messges' one = student.pop() if one == 'luenci': print('luenci get') send(student) elif one == 'jack': print('jack get') send(student) else: print('xiaoming get') send(student) if __name__ == "__main__": student_list = ['luenci', 'jack', 'xiaoming'] send(student_list) 函数作用域 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 def foo(): name = 'luenci' def bar(): name = 'xiaoming' def tt(): print(name) return tt return bar print(foo) print(foo()) print(foo()()) # bar=foo() # tt=bar() # print(tt) # tt() foo()()() out>> <function foo at 0x0000020655A92E18> <function foo.<locals>.bar at 0x00000206577809D8> <function foo.<locals>.bar.<locals>.tt at 0x0000020657780A60> xiaoming 函数式编程 匿名函数 函数声明:lambda 参数:表达式返回值 1 2 3 4 5 6 7 8 9 10 11 def test(x): return x+1 print(test(10)) fun = lambda x:x+1 print(fun(10)) out: 11 11 ...
Python后端架构演进 本文转自python社区:https://www.pythontab.com/html/2018/pythonweb_0725/1329.html ...
多任务 同一个时间有多个任务在执行 python程序默认是单任务 线程 线程概念 线程,可简单理解为是程序执行的一条分支,也是程序执行流的最小单元。 线程是被系统独立调度和分底的基本单位,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程为其它线程共享进程所拥有的全部资源。 主线程 当一个程序后动时,就有一个进程被操作系统(OS)创建,与此同时一个线程也立刻运行,该线程通常叫做程序的主线程,简而言之;程序后动就会创建一个主线程。 Copy主线程的重要性有两方面: 1)是产生其他子线程的线程; 2)通常它必须最后完成执行比如执行各种关闭动作· ...
本文转载自:https://pythonav.com/wiki/detail/6/91/ 1.协程 协程(Coroutine),也可以被称为微线程,是一种用户态内的上下文切换技术。简而言之,其实就是通过一个线程实现代码块相互切换执行。例如: 1 2 3 4 5 6 7 8 9 10 11 12 def func1(): print(1) ... print(2) def func2(): print(3) ... print(4) func1() func2() 上述代码是普通的函数定义和执行,按流程分别执行两个函数中的代码,并先后会输出:1、2、3、4。但如果介入协程技术那么就可以实现函数见代码切换执行,最终输入:1、3、2、4 。 在Python中有多种方式可以实现协程,例如: greenlet,是一个第三方模块,用于实现协程代码(Gevent协程就是基于greenlet实现) yield,生成器,借助生成器的特点也可以实现协程代码。 asyncio,在Python3.4中引入的模块用于编写协程代码。 async & awiat,在Python3.5中引入的两个关键字,结合asyncio模块可以更方便的编写协程代码。 1.1 greenlet greentlet是一个第三方模块,需要提前安装 pip3 install greenlet才能使用。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 from greenlet import greenlet def func1(): print(1) # 第1步:输出 1 gr2.switch() # 第3步:切换到 func2 函数 print(2) # 第6步:输出 2 gr2.switch() # 第7步:切换到 func2 函数,从上一次执行的位置继续向后执行 def func2(): print(3) # 第4步:输出 3 gr1.switch() # 第5步:切换到 func1 函数,从上一次执行的位置继续向后执行 print(4) # 第8步:输出 4 gr1 = greenlet(func1) gr2 = greenlet(func2) gr1.switch() # 第1步:去执行 func1 函数 注意:switch中也可以传递参数用于在切换执行时相互传递值。 1.2 yield 基于Python的生成器的yield和yield form关键字实现协程代码。 1 2 3 4 5 6 7 8 9 10 11 12 def func1(): yield 1 yield from func2() yield 2 def func2(): yield 3 yield 4 f1 = func1() for item in f1: print(item) 注意:yield form关键字是在Python3.3中引入的。 1.3 asyncio 在Python3.4之前官方未提供协程的类库,一般大家都是使用greenlet等其他来实现。在Python3.4发布后官方正式支持协程,即:asyncio模块。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 import asyncio @asyncio.coroutine def func1(): print(1) yield from asyncio.sleep(2) # 遇到IO耗时操作,自动化切换到tasks中的其他任务 print(2) @asyncio.coroutine def func2(): print(3) yield from asyncio.sleep(2) # 遇到IO耗时操作,自动化切换到tasks中的其他任务 print(4) tasks = [asyncio.ensure_future( func1() ), asyncio.ensure_future( func2() )] loop = asyncio.get_event_loop()loop.run_until_complete(asyncio.wait(tasks)) 注意:基于asyncio模块实现的协程比之前的要更厉害,因为他的内部还集成了遇到IO耗时操作自动切花的功能。 1.4 async & awit async & awit 关键字在Python3.5版本中正式引入,基于他编写的协程代码其实就是 上一示例 的加强版,让代码可以更加简便。 Python3.8之后 @asyncio.coroutine 装饰器就会被移除,推荐使用async & awit 关键字实现协程代码。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 import asyncio async def func1(): print(1) await asyncio.sleep(2) print(2) async def func2(): print(3) await asyncio.sleep(2) print(4) tasks = [ asyncio.ensure_future(func1()), asyncio.ensure_future(func2())] loop = asyncio.get_event_loop()loop.run_until_complete(asyncio.wait(tasks)) 1.5 小结 关于协程有多种实现方式,目前主流使用是Python官方推荐的asyncio模块和async&await关键字的方式,例如:在tonado、sanic、fastapi、django3 中均已支持。 接下来,我们也会针对 asyncio模块 + async & await 关键字进行更加详细的讲解。 ...
函数的传参 函数参数传递机制问题在本质上是调用函数(过程)和被调用函数(过程)在调用发生时进行通信的方法问题。基本的参数传递机制有两种:值传递和引用传递。 值传递(pass-by-value)过程中,被调函数的形式参数作为被调函数的局部变量处理,即在堆栈中开辟了内存空间以存放由主调函数放进来的实参的值,从而成为了实参的一个副本。值传递的特点是被调函数对形式参数的任何操作都是作为局部变量进行,不会影响主调函数的实参变量的值。 引用传递(pass-by-reference)过程中,被调函数的形式参数虽然也作为局部变量在堆栈中开辟了内存空间,但是这时存放的是由主调函数放进来的实参变量的地址。被调函数对形参的任何操作都被处理成间接寻址,即通过堆栈中存放的地址访问主调函数中的实参变量。正因为如此,被调函数对形参做的任何操作都影响了主调函数中的实参变量。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 In [1]: from ctypes import * In [2]: import os.path In [3]: import sys \# 传入不可变类型 In [4]: def test(x): ...: print("test before") ...: print(id(c)) ...: c+=2 ...: print("test add") ...: print(id(c)) ...: return c In [5]: a = 2 In [6]: id(2) Out[6]: 11496672 In [7]: n = test(a) test before 11496672 test add 11496736 \# 传入可变类型 In [17]: def test2(x): ...: print("test before") ...: print(id(x)) ...: x[0] = 45 ...: print("test after") ...: print(id(x)) ...: return x ...: In [18]: e = [0,1,2,3] In [19]: id(e) Out[19]: 140323019352896 In [20]: g = test2(e) test before 140323019352896 test after 140323019352896 结论:python不允许程序员选择采用传值还是传引用。Python参数传递采用的肯定是“传对象引用”的方式。这种方式相当于传值和传引用的一种综合。 如果函数收到的是一个可变对象(比如字典或者列表)的引用,就能修改对象的原始值--相当于通过“传引用”来传递对象。 如果函数收到的是一个不可变对象(比如数字、字符或者元组)的引用,就不能直接修改原始对象--相当于通过“传值’来传递对象。 ...
可迭代对象 可遍历对象就是可迭代对象 列表、元组、字典、字符串都是可迭代对象 100和自定义myclass 默认都是不可以迷代的 myclass 对象所属的类MyClass如果包含了__iter__()方法,此时 myclass就是一个可送代对象 可送代对象的本质:对象所属的类中包含了__iter__()方法 检测一个对象是否可以送代,用isinstance()函数检测。 迭代器 我们发现选代器最核心的功能就是可以通过next0函数的调用来返回下一个数据值。如果每次返回的数据值不是在一个已有的数据集合中读取的,而是通过程序按照一定的规律计算生成的,那么也就意味着可以不用再依赖一个已有的数据集合,也就是说不用再将所有要迭代的数据都一次性缓存下来供后续依次读取,这样可以节省大量的存储(内存)空间。 举个例子,比如,数学中有个著名的斐波拉契数列(Fibonacci),数列中第一个数为0,第二个数为1,其后的每一个数都可由前两个数相加得到: 特点 记录遍历的位置 ...
import导入模块路径问题 存在的问题:当我们把模块文件放到工程文件夹的外部的文件,发现无法正常引入模块 原因:外部的文件夹的路径,没有放到环境变量中。 查看环境变量 1.导入sys模块 2.sys.path 查看环境变量返回值是列表 把自己写的模块的路径加入到环境变量中 ...
概念 进程 进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位。每个进程都有自己的独立内存空间,不同进程通过进程间通信来通信。由于进程比较重量,占据独的内存,所以上下文进程间的切换开销(栈、寄存器、虚拟内存、文件句柄等)比较大,但相对比较稳定安全。 线程 线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源。线程间通信主要通过共享内存,上下文切换很快,资源开销较少,但相比进程不够稳定容易丢失数据。 协程 协程是一种用户态的轻量级线程,协程的调度完全由用户控制。协程拥有自己的寄存器上下文和栈。协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下文和栈,直接操作栈则基本没有内核切换的开销,可以不加锁的访问全局变量,所以上下文的切换非常快。 三者关系 ...
进程 进程概念 进程(Process)是资源分配的最小单位,是线程的容器。 程序是固定不变的,而进程会根据运行需要,让操作系统动态分配各种资源的CPU的时间片轮转,在不同的时间段切换执行不同的进程,但是切换进程是比较耗时的;就引来了轻量级进程,也就是所谓的线程,一个进程中包括多个线程(代码流,其实也就是进程中同时跑的多个方法体) 程序:例xxx.py这是程序,是一个静态的 进程:一个程序运行起来后,代码+用到的资源称之为进程,它是操作系统分配资源的基本单元。 进程状态 工作中,任务数往往大于cpu的核数,即一定有一些任务正在执行,而另外一些任务在等待cpu进行执行,因此导致了有了不同的状态 进程状态 就绪态:运行的条件都已经满足,正在等在cpu执行 执行态:cpu正在执行其功能 等待态:等待某些条件满足,例如一个程序sleep了,此时就处于等待态 进程的创建 - multiprocessing multiprocessing模块就是跨平台版本的多进程模块,提供了一个Process类来代表一个进程对象,这个对象可以理解为是一个独立的进程,可以执行另外的事情。 ·创建子进程跟创建线程十分类似,只需要传入一个执行函数和函数的参数,创建一个Process实例,用start0方法后动 Process语法结构如下: Process([group [,target[,name,[args[,kwargs]]]) target:如果传递了函数的引用,这个子进程就执行这里(函数)的代码 args:给target指定的函数传递的参数,以元组的方式传递 kwargs:给target指定的函数传递命名参数 name:给进程设定一个名字,可以不设定 group:指定进程组,大多数情况下用不到 Process创建的实例对象的常用方法: start():后动子进程实例(创建子进程) is_alive:判断进程子进程是否还在活着 join([timeout]):是否等待子进程执行结束,或等待多少秒o terminate:不管任务是否完成,立即终止子进程 Process创建的实例对象的常用属性: name:当前进程的别名,默认为Process-N,N为从1开始递增的整数 pid:当前进程的pid(进程号) linux系统可使用kill命令结束进程 ...
闭包 引入 函数名是一个特殊的变量,保存了函教的地址和 自定义一个变量可以获取函数地址 自定义变量调用函数 “函数名()” 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 def work(): print("我是一个测试函数") ret = work print(ret) print("地址:%X" % id(ret)) print("地址:%X" % id(work)) ret() work() out: <function work at 0x00000161E3091E18> 地址:161E3091E18 地址:161E3091E18 我是一个测试函数 我是一个测试函数 当我们定义函数test1后,函数名test1保存的是函数在内存的首地址函数名就是一个特殊的变量,函数名()调用函数,执行函数体test1()和ret()都会调用函数,并执行函数体 和变量名一样的,函数名数名只是函数代码空间的引用,当函数名赋值给一个对象的时候就是引用传递。 闭包概念 在一个外函数中定义了一个内函数,内函数里运用了外函数的临时变量,并且外函数的返回值是内函数的引用。这样就构成了一个闭包 ...
Python中的类 原文转自:https://blog.csdn.net/sxingming/article/details/52875125 默认情况下,Python中的成员函数和成员变量都是公开的(public),在python中没有类似public,private等关键词来修饰成员函数和成员变量。 在python中定义私有变量只需要在变量名或函数名前加上 __两个下划线,那么这个函数或变量就是私有的了。 在内部,python使用一种 name mangling 技术,将 __membername替换成 _classname__membername,也就是说,类的内部定义中,所有以双下划线开始的名字都被"翻译"成前面加上单下划线和类名的形式。 例如:为了保证不能在class之外访问私有变量,Python会在类的内部自动的把我们定义的__spam私有变量的名字替换成为 _classname__spam(注意,classname前面是一个下划线,spam前是两个下划线),因此,用户在外部访问__spam的时候就会提示找不到相应的变量。 python中的私有变量和私有方法仍然是可以访问的 访问方法如下: 私有变量:实例._类名__变量名 私有方法:实例._类名__方法名() 其实,Python并没有真正的私有化支持,但可用下划线得到伪私有。 尽量避免定义以下划线开头的变量! (1)_xxx “单下划线 " 开始的成员变量叫做保护变量,意思是只有类实例和子类实例能访问到这些变量, 需通过类提供的接口进行访问;不能用’from module import *‘导入 (2)__xxx 类中的私有变量/方法名 (Python的函数也是对象,所以成员方法称为成员变量也行得通。), " 双下划线 " 开始的是私有成员,意思是只有类对象自己能访问,连子类对象也不能访问到这个数据。 (3)__xxx__ 系统定义名字,前后均有一个“双下划线” 代表python里特殊方法专用的标识,如 __init__()代表类的构造函数。 ...
item系列 __getitem__ 以字典形式访问属性的时候触发 __setitem__ 以字典形式设置属性的时候触发 __delitem__ 以字典形式删除属性的时候触发 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 class Demo(object): def __getitem__(self, item): print("触发__getitem__") def __setitem__(self, key, value): print("触发__setitem__") self.__dict__[key] = value def __delitem__(self, key): print("触发__delitem__") self.__dict__.pop(key) f = Demo() # 以字典的方式来操作属性 print(f.__dict__) f['name'] = 'luenci' print(f.__dict__) print(f['name']) del f['name'] print(f.__dict__) out: {} 触发__setitem__ {'name': 'luenci'} 触发__getitem__ None 触发__delitem__ {} __str__和__repr__控制输出 __str__会在print()打印时候调用,如果类中没重写则会调用默认的打印值,如果自定义了则会调用自定义的__str__方法 __repr__这个实在控制台的时候输出,若一个类中没定义__str__但是定义了__repr__方法,则会调用__repr__的返回值。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 class bar(object): def __init__(self, name, age): self.name = name self.age = age # def __str__(self): # return '__str__自定义返回值' def __repr__(self): return '__repr__自定义返回值' f = bar('luenci', 18) # print() 函数触发__str__()函数 print(f) out: __repr__自定义返回值 __slots__属性 1.__slots__是什么? ...
CPython 当我们从Python官方网站下载并安装好Python 3.x后,我们就直接获得了一个官方版本的解释器:CPython。这个解释器是用C语言开发的,所以叫CPython。在命令行下运行python就是启动CPython解释器。 ...
GlL锁定义 Gll锁:Global Interpreter Lock,又称:全局解释器锁 任何Python线程执行前,必须先获得GlL锁,然后,每执行100条字节码,解释器就自动释放GL锁,让别的线程有机会执行。这个GlL全局锁实际上把所有线程的执行代码都给上了锁,所以,多线程在Python中只能交替执行,即使100个线程跑在100核CPU上,也只能用到1个核。 ...