Python标准库笔记

    xiaoxiao2021-03-26  21

    正则表达式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) 函数式编程是将函数本身作为处理对象的编程范式

    转载请注明原文地址: https://ju.6miu.com/read-661140.html

    最新回复(0)