Python标准库笔记

正则表达式re包(import re)

re.serch(pattern,string)接收两个参数,第一个参数是正则表达式,第二个参数是要找的参数,如果找到符合正则表达式的就返回一个对象,没有就返回None
使用对象.group(0) 可以查看搜索到的结果。
re.match(pattern,string)这个是要全部匹配才会返回
将搜到的字符替换re.sub(pattern,replacement,string)

正则表达式

单个字符:
. 任意字符;a|b 字符a或b;[afg]a或f或g的一个;[0-4]0到4范围; [a-f] a到f范围的一个【^m】非m的一个;\s一个空格;\S一个非空格;\d 0-9;\D非0-9,\w 0-9A-Za-z
重复 :
* 重复》= 0次
+重复》=1次
? 重复0或者1次
{m}重复m次
{m,n}重复m到n此
位置
^其实位置
$结束位置
如 ^ab.*c%:就是以ab开头中间任意C结尾
返回控制
使用m.group(number) 的方法来查询群组number = 0表示整个正则表达式的结构

time包

time.time()输出时间以秒
time.clock()
time.sleep()休眠程序即延时秒为单位
time.gmtime()返回struct_UTC时间
time.lockatime()返回一个struct_time格式的当地时间
time.mktime(str)将str格式的时间转换成wall clock time

datetime包是基于time的一个包

datetime.datetime(year,mon,day,hour,min)
datetime还有运算对象 timedelta
一个datetime可以加减上一个timedelta成为一个新的值
datetime与字符串转换
我们通过format来告知Python我们的字符串中包含的日期格式。

datetime.strptime(str,format)

路径与文件 os.path

主要是处理路径字符串,用于提取有用的路径信息
os,path.basename(path)查询包含的文件名
os.path.dirname(path)查询路径中包含的目录
os.path.split(path)将路径分割成文件名和目录两个部分
os.path.join('/','home','af') 将参数组成一个路径字符串
p_list = [path1,path2]
os.path.commonprefix)p_;ist)查询两个路径的共同部分。

os.path还可以查看文件的相关信息
os,path.exisis(path)查询是否存在
.getsize查询文件大小,
getatime查询上一次读取时间
getmtime查询上一次修改时间
isfile是否是常规文件
isdir视为指向目录
glob包
常用方法glob.glob()与linux的ls相似
接受一个文件名格式表达式,然后列出符合的文件
文件管理OS包
mkdir rmdir lisdir remove rename chmod chown stat(=ls -l) symlink getcwd(=pwd)
shutil包
copy(a,b)复制文件a到b = CP
move(A,b)移動文件A到B相當於mv
储存对象
pickle包

subprocess包

主要功能执行外部的命令和程序与shell类似

当我们运行python的时候,我们都是在创建并运行一个进程。一个进程可以fork一个子进程,并让这个子进程exec另外一个程序。在Python中,我们通过标准库中的subprocess包来fork一个子进程,并运行一个外部的程序。

subprocess包中定义有数个创建子进程的函数,这些函数分别以不同的方式创建子进程,所以我们可以根据需要来从中选取一个使用。另外subprocess还提供了一些管理标准流(standard stream)和管道(pipe)的工具,从而在进程间使用文本通信

使用subprocess包中的函数创建子进程的时候,要注意:

  • 1 在创建子进程之后,父进程是否暂停,并等待子进程运行。

  • 2 函数返回什么

  • 3 当returncode不为0时,父进程如何处理。


subprocess.call()父进程等待子进程完成
返回退出信息
subprocess.check_call()父进程等待子进程完成
返回0
检查退出信息,如果returncode不为0,则举出错误subprocess.CalledProcessError,该对象包含有returncode属性,可用try...except...来检查(见Python错误处理)。
 subprocess.check_output()父进程等待子进程完成
返回子进程向标准输出的结果

Popen()

实际上,我们上面的三个函数都是基于Popen()的封装(wrapper)。这些封装的目的在于让我们容易使用子进程。当我们想要更个性化我们的需求的时候,就要转向Popen类,该类生成的对象用来代表子进程。与上面的封装不同,Popen对象创建后,主程序不会自动等待子进程完成。我们必须调用对象的wait()方法,父进程才会等待 (也就是阻塞block):

child = subprocess.Popen()返回一个子程序进程

child.poll()检查子进程状态 child.kill(),del子进程,child.send_Signal()向子进程发送信号。child.terminate()终止子进程。

子进程的文本流控制

signal

信号signal包定义了各个信号和其对应的整数

signal包负责在Python程序内部处理信号,典型的操作包括预设信号处理函数,暂停并等待信号,以及定时发出SIGALRM等。要注意,signal包主要是针对UNIX平台(比如Linux, MAC OS),而Windows内核中由于对信号机制的支持不充分,所以在Windows上的Python不能发挥信号系统的功能。

定义信号名:

信号包定义了各个信号名及对应的整数

预设信号处理函数:核心是使用signal.signal()来预设register信号处理函数如 signal.signa(signalnum,handler)signalnum是信号名,后面的是处理函数。进程可以无视信号,采用默认操作,还可以自定义操作,当handler为signal.SIG_IGN时,信号被无视,为singal.SIG_DEF时,使用默认操作其他就调用定义的函数。MYHanlder(signum,frame)第一个参数用来识别信号,另一个用来获得信号发生时,进程栈的状况,两个参数都有signal.signal()传递。

定时发出SIGALRM信号

使用signal.alarm(),一段时间后自动发送SIGALRM信号

发送信号:signal包中除了定时没有发送信号包的函数,但是OS中有 os.kill(pid,sid) os.killpg(pgid,sid)分别向进程和进程组发送信号sisid为信号对应的整数或signal.SIG*

多线程与同步Threading

Python使用threading.Thread对象来代表线程,用threading.Lock对象来代表一个互斥锁 (mutex)。

例子thread.THread(target = booth,args= (k,)) new_thread.start()每个线程都执行booth()函数。线程在调用start()方法的时候正式启动 (实际上,计算机中最多会有11个线程,因为主程序本身也会占用一个线程)。lock.acquire(),lock.release()

  • 我们在函数中使用global来声明变量为全局变量,从而让多线程共享i和lock (在C语言中,我们通过将变量放在所有函数外面来让它成为全局变量)。如果不这么声明,由于i和lock是不可变数据对象,它们将被当作一个局部变量。如果是可变数据对象的话,则不需要global声明。我们甚至可以将可变数据对象作为参数来传递给线程函数。这些线程将共享这些可变数据对象。

  • 我们在booth中使用了两个doChore()函数。可以在未来改进程序,以便让线程除了进行i=i-1之外,做更多的操作,比如打印剩余票数,找钱,或者喝口水之类的。第一个doChore()依然在Lock内部,所以可以安全地使用共享资源 (critical operations, 比如打印剩余票数)。第二个doChore()时,Lock已经被释放,所以不能再去使用共享资源。这时候可以做一些不使用共享资源的操作 (non-critical operation, 比如找钱、喝水)。我故意让doChore()等待了0.5秒,以代表这些额外的操作可能花费的时间。你可以定义的函数来代替doChore()。

OOP创建线程

OOP的话,通过修改Thread类的run()方法来定义线程所要执行的命令。BoothThread, 这个类继承自thread.Threading类。然后我们把上面的booth()所进行的操作统统放入到BoothThread类的run()方法中。注意,我们没有使用全局变量声明global,而是使用了一个词典 monitor存放全局变量,monitor{'ticket':100,'lock':threading.lock()}然后把词典作为参数传递给线程函数。由于词典是可变数据对象,所以当它被传递给函数的时候,函数所使用的依然是同一个对象,相当于被多个线程所共享。这也是多线程乃至于多进程编程的一个技巧

其他:

除了start,run 可以使用join调用该方法的线程将等待知道该线程对象完成,再恢复运行。

  • join()方法,调用该方法的线程将等待直到该Thread对象完成,再恢复运行。这与进程间调用wait()函数相类似。

下面的对象用于处理多线程同步。对象一旦被建立,可以被多个线程共享,并根据情况阻塞某些进程。


进程信息:os包中相关函数uname():返回操作系统相关信息,umask():设置该进程创建文件时的权限

get ,put ,getenviron,setenviron

多进程初步:multiprocessing

我们已经见过了使用subprocess包来创建子进程,但这个包有两个很大的局限性:

(1) 我们总是让subprocess运行外部的程序,而不是运行一个Python脚本内部编写的函数。

(2) 进程间只通过管道进行文本交流。以上限制了我们将subprocess包应用到更广泛的多进程任务。(这样的比较实际是不公平的,因为subprocessing本身就是设计成为一个shell,而不是一个多进程管理包)。

multiprocessing包是Python中的多进程管理包。与threading.Thread类似,它可以利用multiprocessing.Process对象来创建一个进程。该进程可以运行在Python程序内部编写的函数。该Process对象与Thread对象的用法相同,也有start(), run(), join()的方法。此外multiprocessing包中也有Lock/Event/Semaphore/Condition类 (这些对象可以像多线程那样,通过参数传递给各个进程),用以同步进程,其用法与threading包中的同名类一致。所以,multiprocessing的很大一部份与threading使用同一套API,只不过换到了多进程的情境。

但在使用这些共享API的时候,我们要注意以下几点:

  • 在UNIX平台上,当某个进程终结之后,该进程需要被其父进程调用wait,否则进程成为僵尸进程(Zombie)。所以,有必要对每个Process对象调用join()方法 (实际上等同于wait)。对于多线程来说,由于只有一个进程,所以不存在此必要性。

  • multiprocessing提供了threading包中没有的IPC(比如Pipe和Queue),效率上更高。应优先考虑Pipe和Queue,避免使用Lock/Event/Semaphore/Condition等同步方式 (因为它们占据的不是用户进程的资源)。

  • 多进程应该避免共享资源。在多线程中,我们可以比较容易地共享资源,比如使用全局变量或者传递参数。在多进程情况下,由于每个进程有自己独立的内存空间,以上方法并不合适。此时我们可以通过共享内存和Manager的方法来共享资源。但这样做提高了程序的复杂度,并因为同步的需要而降低了程序的效率。

Pipe和Queue

管道PIPE和消息队列message queue,multiprocessing包中有Pipe类和Queue类来分别支持这两种IPC机制。PipeQueue可以用来传送常见的对象。

Pipe可以是单向(half-duplex),也可以是双向(duplex)。我们通过mutiprocessing.Pipe(duplex=False)创建单向管道 (默认为双向)。一个进程从PIPE一端输入对象,然后被PIPE另一端的进程接收,单向管道只允许管道一端的进程输入,而双向管道则允许从两端输入。
 Queue与Pipe相类似,都是先进先出的结构。但Queue允许多个进程放入,多个进程从队列取出对象。Queue使用mutiprocessing.Queue(maxsize)创建,maxsize表示队列中可以存放对象的最大数量。
进程池 (Process Pool)可以创建多个进程
 multiprocessing.Pool(num)
  • apply_async(func,args) 从进程池中取出一个进程执行func,args为func的参数。它将返回一个AsyncResult的对象,你可以对该对象调用get()方法以获得结果。

  • close() 进程池不再创建新的进程

  • join() wait进程池中的全部进程。必须对Pool先调用close()方法才能join。

Manager

Manager对象类似于 服务器与客户 之间的通信 (server-client),与我们在Internet上的活动很类似。我们用一个进程作为服务器,建立Manager来真正存放资源。其它的进程可以通过参数传递或者根据 地址 来访问Manager,建立连接后,操作服务器上的资源。在防火墙允许的情况下,我们完全可以将Manager运用于多计算机,从而模仿了一个真实的网络情境。下面的例子中,我们对Manager的使用类似于shared memory,但可以共享更丰富的对象类型。

math包

处理数学相关运算 math.ceil 向上取整floor向下取整,pow指数运算(x,y)x的y次方 log(x)sqrt(x)

三角函数: math.sin(x), math.cos(x), math.tan(x), math.asin(x), math.acos(x), math.atan(x)

这些函数都接收一个弧度(radian)为单位的x作为参数。

角度和弧度互换: math.degrees(x), math.radians(x)

双曲函数: math.sinh(x), math.cosh(x), math.tanh(x), math.asinh(x), math.acosh(x), math.atanh(x)

特殊函数: math.erf(x), math.gamma(x)

random包

random.seed(x)种子random.random随机生成(0,1).uniform(a,b)范围

random.gauss(mu,sigma)生成高斯随机数 expovariate生成符合指数分布的还有正太分布等

循环器(iterrools)

使用iter()内置函数,我们可以将诸如表、字典等容器变为循环器
无穷循环器count(5,2)从5开始的整数循环器,每次增加2,cycle('abc')重复repeat(1.2)

函数式编程是将函数本身作为处理对象的编程范式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值