Python 高级编程

1. 正则表达式

Python 自1.5版本起增加了re 模块,它提供 Perl 风格的正则表达式模式。re 模块使 Python 语言拥有全部的正则表达式功能。

re.match与re.search

re.match 只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回 None,而 re.search 匹配整个字符串,直到找到一个匹配。

re.match函数

re.match(pattern, string, flags=0)

flags 是标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等, 如下:

Python 高级编程_第1张图片

可以使用group(num) 或 groups() 匹配对象函数来获取匹配表达式。

Python 高级编程_第2张图片

group(num=0): 匹配的整个表达式的字符串,group() 可以一次输入多个组号,在这种情况下它将返回一个包含那些组所对应值的元组。

groups(): 返回一个包含所有小组字符串的元组,从 1 到 所含的小组号。 

re.search 函数

re.search(pattern, string, flags=0)

re.search 扫描整个字符串并返回第一个成功的匹配。

(其用法同re.match)

Python 高级编程_第3张图片

re.sub函数

re.sub(pattern, repl, string, count=0, flags=0)
  • count : 模式匹配后替换的最大次数,默认 0 表示替换所有的匹配。
  • flags : 编译时用的匹配模式,数字形式。

这两个参数可选。

Python 高级编程_第4张图片

repl 参数可以是一个函数 :

Python 高级编程_第5张图片

compile 函数

compile 函数用于编译正则表达式,生成一个正则表达式( Pattern )对象,供 match() 和 search() 这两个函数使用。

re.compile(pattern[, flags])

flags 可选,表示匹配模式,比如忽略大小写,多行模式等(同上)

Python 高级编程_第6张图片

当匹配成功时返回一个 Match 对象,其中:

  • group([group1, …]) 方法用于获得一个或多个分组匹配的字符串,当要获得整个匹配的子串时,可直接使用 group() 或 group(0)
  • start([group]) 方法用于获取分组匹配的子串在整个字符串中的起始位置(子串第一个字符的索引),参数默认值为 0;
  • end([group]) 方法用于获取分组匹配的子串在整个字符串中的结束位置(子串最后一个字符的索引+1),参数默认值为 0;
  • span([group]) 方法返回 (start(group), end(group))

findall函数

在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果有多个匹配模式,则返回元组列表,如果没有找到匹配的,则返回空列表。

注意: match 和 search 是匹配一次 findall 匹配所有。

re.findall(pattern, string, flags=0)
或
pattern.findall(string[, pos[, endpos]])
  • pos 可选参数,指定字符串的起始位置,默认为 0。
  • endpos 可选参数,指定字符串的结束位置,默认为字符串的长度。

Python 高级编程_第7张图片

re.finditer函数

和 findall 类似,在字符串中找到正则表达式所匹配的所有子串,并把它们作为一个迭代器返回。

re.finditer(pattern, string, flags=0)

Python 高级编程_第8张图片

re.split函数

split 方法按照能够匹配的子串将字符串分割后返回列表。

re.split(pattern, string[, maxsplit=0, flags=0])

 maxsplit : 分割次数,maxsplit=1 分割一次,默认为 0,不限制次数。

Python 高级编程_第9张图片

正则表达式模式

Python 高级编程_第10张图片

 Python 高级编程_第11张图片


2. 网络编程

socket()函数

用 socket() 函数来创建套接字,语法格式如下:

socket.socket([family[, type[, proto]]])
  • family: 套接字家族可以是 AF_UNIX 或者 AF_INET
  • type: 套接字类型可以根据是面向连接的还是非连接分为SOCK_STREAMSOCK_DGRAM
  • protocol: 一般不填默认为0.

Socket 对象(内建)方法

Python 高级编程_第12张图片

 Python 高级编程_第13张图片

下面是实例:

第一步,编写服务器端代码并运行如下:

Python 高级编程_第14张图片

 运行服务器端代码后,看到服务器端处于运行状态,持续监听来自客户端的链接和访问。

第二步, 编写客户端代码并运行如下:

 Python 高级编程_第15张图片

 运行客户端代码后,接收到了来自服务器端的信息,同时发现客户端程序运行随后结束,关闭链接。

第三步, 回头查看服务器端。

Python 高级编程_第16张图片

发现服务器端识别了与客户端的链接地址和端口,同时服务器仍然处于运行状态,持续监听。

 例子成功完成。

Python 网络编程的一些重要模块:

Python 高级编程_第17张图片


3. SMTP发送邮件

SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。

python的smtplib提供了一种很方便的途径发送电子邮件。它对smtp协议进行了简单的封装。

创建 SMTP 对象语法如下:

import smtplib

smtpObj = smtplib.SMTP( [host [, port [, local_hostname]]] )

参数说明:

  • host: SMTP 服务器主机。 你可以指定主机的ip地址或者域名如:python.com,这个是可选参数。
  • port: 如果你提供了 host 参数, 你需要指定 SMTP 服务使用的端口号,一般情况下SMTP端口号为25。
  • local_hostname: 如果SMTP在你的本机上,你只需要指定服务器地址为 localhost 即可。

SMTP对象使用sendmail方法发送邮件,语法如下:

SMTP.sendmail(from_addr, to_addrs, msg[, mail_options, rcpt_options]

参数说明:

  • from_addr: 邮件发送者地址。
  • to_addrs: 字符串列表,邮件发送地址。
  • msg: 发送消息

这里要注意一下第三个参数,msg是字符串,表示邮件。我们知道邮件一般由标题,发信人,收件人,邮件内容,附件等构成,发送邮件的时候,要注意msg的格式。这个格式就是smtp协议中定义的格式。

 发送邮件实例:

Python 高级编程_第18张图片

发现抛出异常,异常信息显示目标机器拒绝链接。

待处理 。。。

4. 多线程

Python3 线程中常用的两个模块为:

  • _thread
  • threading(推荐使用)

thread 模块已被废弃。用户可以使用 threading 模块代替。所以,在 Python3 中不能再使用"thread" 模块。为了兼容性,Python3 将 thread 重命名为 "_thread"。

_thread 提供了低级别的、原始的线程以及一个简单的锁,它相比于 threading 模块的功能还是比较有限的。

threading 模块除了包含 _thread 模块中的所有方法外,还提供的其他方法。

Python中使用线程有两种方式:函数或者用类来包装线程对象。

函数式:

_thread.start_new_thread ( function, args[, kwargs] )

Python 高级编程_第19张图片

 执行以上程后可以按下 ctrl-c 退出。

使用 threading 模块创建线程

可以通过直接从 threading.Thread 继承创建一个新的子类,并实例化后调用 start() 方法启动新线程,即它调用了线程的 run() 方法。

例子:

Python 高级编程_第20张图片

运行结果:

Python 高级编程_第21张图片

线程同步 

使用 Thread 对象的 Lock 和 Rlock 可以实现简单的线程同步,这两个对象都有 acquire 方法和 release 方法,对于那些需要每次只允许一个线程操作的数据,可以将其操作放到 acquire 和 release 方法之间。如下:

Python 高级编程_第22张图片

 运行结果:

Python 高级编程_第23张图片

线程优先级队列( Queue)

Python 的 Queue 模块中提供了同步的、线程安全的队列类,包括FIFO(先入先出)队列Queue,LIFO(后入先出)队列LifoQueue,和优先级队列 PriorityQueue。

这些队列都实现了锁原语,能够在多线程中直接使用,可以使用队列来实现线程间的同步。

Queue 模块中的常用方法:

  • Queue.qsize() 返回队列的大小
  • Queue.empty() 如果队列为空,返回True,反之False
  • Queue.full() 如果队列满了,返回True,反之False
  • Queue.full 与 maxsize 大小对应
  • Queue.get([block[, timeout]])获取队列,timeout等待时间
  • Queue.get_nowait() 相当Queue.get(False)
  • Queue.put(item) 写入队列,timeout等待时间
  • Queue.put_nowait(item) 相当Queue.put(item, False)
  • Queue.task_done() 在完成一项工作之后,Queue.task_done()函数向任务已经完成的队列发送一个信号
  • Queue.join() 实际上意味着等到队列为空,再执行别的操作

Python 高级编程_第24张图片

 Python 高级编程_第25张图片

 运行结果:

Python 高级编程_第26张图片

5. Python3 解析 XML 文件

Python 有三种方法解析 XML,SAX,DOM,以及 ElementTree:

XML例子文件如下:

Python 高级编程_第27张图片

使用 SAX 解析 xml 

#!/usr/bin/python3

import xml.sax

class MovieHandler( xml.sax.ContentHandler ):
   def __init__(self):
      self.CurrentData = ""
      self.type = ""
      self.format = ""
      self.year = ""
      self.rating = ""
      self.stars = ""
      self.description = ""

   # 元素开始调用
   def startElement(self, tag, attributes):
      self.CurrentData = tag
      if tag == "movie":
         print ("*****Movie*****")
         title = attributes["title"]
         print ("Title:", title)

   # 元素结束调用
   def endElement(self, tag):
      if self.CurrentData == "type":
         print ("Type:", self.type)
      elif self.CurrentData == "format":
         print ("Format:", self.format)
      elif self.CurrentData == "year":
         print ("Year:", self.year)
      elif self.CurrentData == "rating":
         print ("Rating:", self.rating)
      elif self.CurrentData == "stars":
         print ("Stars:", self.stars)
      elif self.CurrentData == "description":
         print ("Description:", self.description)
      self.CurrentData = ""

   # 读取字符时调用
   def characters(self, content):
      if self.CurrentData == "type":
         self.type = content
      elif self.CurrentData == "format":
         self.format = content
      elif self.CurrentData == "year":
         self.year = content
      elif self.CurrentData == "rating":
         self.rating = content
      elif self.CurrentData == "stars":
         self.stars = content
      elif self.CurrentData == "description":
         self.description = content
  
if ( __name__ == "__main__"):
   
   # 创建一个 XMLReader
   parser = xml.sax.make_parser()
   # 关闭命名空间
   parser.setFeature(xml.sax.handler.feature_namespaces, 0)

   # 重写 ContextHandler
   Handler = MovieHandler()
   parser.setContentHandler( Handler )
   
   parser.parse("C:\\Dragon\Python\movies.xml")

运行结果:

Python 高级编程_第28张图片

使用xml.dom解析xml

Python 高级编程_第29张图片

 运行结果:

Python 高级编程_第30张图片

6. Python3 解析 JSON

使用 json 模块来对 JSON 数据进行编解码,它包含了两个函数:

  • json.dumps(): 对数据进行编码。
  • json.loads(): 对数据进行解码。

例子: 

Python 高级编程_第31张图片

如果你要处理的是文件而不是字符串,你可以使用 json.dump() 和 json.load() 来编码和解码JSON数据, 如下例子:

Python 高级编程_第32张图片

 在对应文件夹下生成了data.json 文件,查看内容:

Python 编码为 JSON 类型转换对应表:

Python 高级编程_第33张图片

JSON 解码为 Python 类型转换对应表: 

Python 高级编程_第34张图片

Python 日期和时间

Python 提供了一个 time 和 calendar 模块可以用于格式化日期和时间。时间间隔是以秒为单位的浮点小数。每个时间戳都以自从 1970 年 1 月 1 日午夜(历元)经过了多长时间来表示。从返回浮点数的时间戳方式向时间元组转换,只要将浮点数传递给如localtime之类的函数。

time 模块

Python 高级编程_第35张图片

calendar 模块

Python 高级编程_第36张图片

 

Python3 pip

pip 是 Python 包管理工具,该工具提供了对 Python 包的查找、下载、安装、卸载的功能。

软件包也可在 https://pypi.org/ 中找到。

目前最新的 Python 版本已经预装了 pip。Python 2.7.9 + 或 Python 3.4+ 以上版本都自带 pip 工具。因为本人例子中安装的是3.10.2 版本,所以应该是自带了,cmd检查如下:

 Python 高级编程_第37张图片

 显示版本21.2.4,证明自带了pip。

访问一下pip软件包管理网站如下:

Python 高级编程_第38张图片

 pip下载安装软件命令如下:

下载安装包命令:

pip install some-package-name

移除软件包命令:

pip uninstall some-package-name

查看已经安装的软件包:

pip list

 

 参考:Python3 教程 | 菜鸟教程

你可能感兴趣的:(Python,python,开发语言,后端)