《Python核心编程》第三版 读书笔记
“一个不成熟男子的标志是为了某种事业英勇地死去,一个成熟男子的标志是为了某种事业卑微地活着。”
-------<麦田里的守望者>
小的时候总以为自己长大会变成很厉害的人。后来知道自己没希望了,那就变成成功圆满的人也可以啊。
再后来觉得,即使普通,只要度过快乐幸福的人生就好。
再后来,发现只要活着就行。对自己提出要求,只会令人痛苦。
-----------作者:崇九
知乎上看到的,不管如何,我被生了下来,家境也不优越,父母仍需奔波,已然不可能孑然一生, 第一次读<麦田里的守望者>在初中,感谢那些年无知的自我,不会过早发现世间的秘密. ^_^,加油,生活. 2019.9.1
第一章,正则表达式
简介,动机:
特殊符号和字符
- 使用择一匹配符号匹配多个正则表达式模式,(|)
- 匹配任意单个字符(.)
- 从字符串起始或者结尾或者单词边界匹配。(^ $)
- 创建字符集,([])
- 限定范围与否定,([^], -)
- 使用闭包操作符实现存在性和频数(*,+,?)
- 使用圆括号指定分组
- 表示字符集的特殊字符(\w \d)
- 扩展表示法
正则表达式和Python语言
- re模块,核心函数和方法
- 使用compile函数编译 正则表达式。
- 匹配对象已及group()和groups()
- 使用match()方法匹配字符串
- 使用search()在一个字符串中查找模式(搜索与匹配的对比)。
# from 包名 import 模块名 import re # match(模式,字符串),开始位置匹配 m = re.match('foo','foo') # 如果 m 不为空 if m is not None: print(m.group()) #foo m = re.match('foo','lrl') if m is not None: print(m.group()) # m = re.match('foo', 'food on the table') print('长串:'+m.group()) #foo m = re.match('foo', 'sefoo') if m is not None:print(m.group()) # #search,任意位置搜索。 m = re.search('foo','sefoo' ) if m is not None:print(m.group()) # foo
- 匹配多个字符
- 匹配任何单个字符
- 创建字符集
#匹配多个字符串 bt = 'bat|bet|bit' bt = re.compile(bt) m = re.match(bt,'bat') if m is not None: print(m.group()) m = re.match('bat|bet|bit', 'bat') if m is not None:print(m.group()) #匹配任何单个字符 anyand = '.end' m = re.match(anyand, 'bend') if m is not None:print(m.group()) # end m = re.match(anyand, 'end') if m is not None:print(m.group()) # m = re.match(anyand, '\nend') if m is not None:print(m.group()) # m = re.search('.end', 'the end.') if m is not None:print(m.group()) # end #搜索小数点 patty= '3.14' pi_patt = '3\.14' m = re.match(pi_patt, '3.14') if m is not None:print(m.group()) #3.14 m = re.match(patty,'3014') if m is not None:print(m.group()) #3014#创建字符集[] m = re.match('[li][rui][long]','lrl') if m is not None:print(m.group()) #lrlm = re.match('[a-z]+','aaaa' ) if m is not None:print(m.group()) #aaaa
- 重复,特殊字符及分组
重复,特殊字符以即分组 m = re.match(patt, 'liruilong@qq.com') if m is not None: print(m.group()) #liruilong@qq.com m = re.match(patt, 'lirui@ong.sd.com') #lirui@ong.sd.com if m is not None: print(m.group())m = re.match('\w\w\w-\d\d\d', 'abc-xyz') # if m is not None: print(m.group())x = 1; y = 2; #变量的直接转换 (x,y) =( y,x) print(x) print(y)m = re.match('(\w\w\w)-(\d\d\d)','abc-123') #返回匹配串 if m is not None: print(m.group()) #返回子组 if m is not None:print(m.group(1)) if m is not None:print(m.group(2)) if m is not None: print(m.groups()) #group()通常用于以普通的方式显示所有的匹配部分 #groups()通常获取一个包含所有匹配子字符串的元组。 m = re.match('(ab)', 'ab') def pring(m):print('输出group()')if m is not None: print(m.group())print('输出groups()+以元组方式输出:')if m is not None: print(m.groups())print("输出group(i)")if m is not None: print(m.group(1)) pring(m) m = re.match("(a)(b)", 'ab') pring(m)
- 匹配字符串的起始和结尾已及单词边界
#匹配字符串的起始位置和结尾已及单词边界 def pri(m):if m is not None: print(m.group())m = re.search('^The',"The end.") pri(m) m = re.search('^The',"sThe end.") # 无值 pri(m) #\b用于匹配单词边界。\B用与不匹配边界。 m = re.search(r'\bthe', 'bite the dog') pri(m) m = re.search(r'\bthe' , "btthe")#无值 pri(m) m = re.search(r'\Bthe', 'bithe dog') #the pri(m)
- 使用findall()和finalter()查找每一次出现的位置
#使用findall()和findlter()查找每一次出现的位置 #findall()返回一个数组,l类似一search def prfin(m):print(m) m = re.findall('car', 'car') prfin(m) m = re.findall('car','scar')#['car'] prfin(m) m = re.findall('car' , 'carry the bacar the car')#['car', 'car', 'car'] prfin(m) s = "This and that." #re.I忽略大小写 r'意思为不转义 m = re.findall(r'(th\w+) and (th\w+)', s, re.I) #[('This', 'that')] print(m) print("finditer的使用方式!!") print("finditer的使用方式!") m = [g.groups() for g in re.finditer(r'(th\w+) and (th\w+)', s, re.I)] print(m)
- 使用sub()和subn()搜索和转换
#使用sub()和subn()搜索与替换,将正则表达式所匹配的进行替换。用来替换的部分通常是一个字符串。 #把sub(要替换的串,替换的串,替换后的子串) m = re.sub('X','Mr. Smith', 'attn: X\n\nDear X,\n') print(m) # attn: Mr. Smith # # Dear Mr. Smith, #把sub(要替换的串,替换的串,替换后的子串)返回替换的总数 m = re.subn("X",'Mr.Smith','attn: X\n\nDear X,\n')#('attn: Mr.Smith\n\nDear Mr.Smith,\n', 2) print(m) m = re.sub('[ae]', 'X', 'abcdef')#XbcdXf print(m)
- 在限定模式上使用split()分隔字符串。
#在限定模式上使用split()分割字符串 m = re.split(":", 'sta1:sta2:sta3') print(m) DATA = {'SHNAG HAI,144','GUANGZHOU,522','LINGXIA,455' } for lam in DATA:print(re.split(",",lam)) # ['LINGXIA', '455'] # ['GUANGZHOU', '522'] # ['SHNAG HAI', '144']
扩展符号:
#扩展符号: #(?i)忽略大小写匹配 m = re.findall(r'(?i)yes','yes? Yes. YES!!')#['yes', 'Yes', 'YES'] print(m) m = re.findall(r'(?i)th\w+','The quickest way is throgh this tunnel.')#['The', 'throgh', 'this'] print(m)m = re.findall(r'(?im)(^th[\w]+)', """This line is the fie ,another line,that line ,it's basd th""") print(m)
一些正则表达式的实例:
在Linux下输入who获取当前系统的用户信息:解析获取到的信息,
import os import re # 将系统指令的执行信息写入f f = os.popen('who','r') for each in f: # split方法用于指定分隔符分割,each,retrip用于去除空格。\s表示空格\t表示制表符print re.split(r'\s\s+|\t', each.rstrip()) f.close()[root@localhost pythonDemo.py]# python rewho.py ['root', 'tty1', '2019-07-29 10:52'] ['root', 'pts/0', '2019-08-30 08:53 (192.168.36.1)'] ['root', 'pts/1', '2019-08-30 10:17 (192.168.36.1)'] ['root', 'pts/2', '2019-08-30 10:55 (192.168.36.1)']
用正则表达式练习的数据生成器(gendata.py)
from random import randrange, choice # ascii_lowercase表示一个拥有26个小写字母的序列集合。 from string import ascii_lowercase as lc from sys import maxint from time import ctime #定义一个元组 tlds = ('com', 'edu', 'net', 'org', 'gov') #生成第5行和第10之间的输出,随机整数使用xrange(randrange(i,j)) for i in xrange(randrange(5,11 )):# 获取的随机整数范围为2的32次方。dtint = randrange(2**32)# 由获取的随进整数的得到一个日期。dtstr = ctime(dtint)# 获取伪造邮件地址的登录名为4到7个字符llen = randrange(4, 8)# 随机选择4到7个小写字母,将所有的字符连接成一个字符串。choice()函数的功能就是接受一个序列。# 然后返回该序列的随机元素。生成用户名 login = ''.join(choice(lc) for j in range(llen))# 邮件地址的主域名不超过12个字符。但至少要比登录名一样长。dlen = randrange(llen, 13)# 生成邮件地址主域名。dom = ''.join(choice(lc) for j in xrange(dlen))# 指定格式把信息输出,print '%s::%s@%s.%s::%d-%d-%d' % (dtstr, login, dom, choice(tlds), dtint, llen, dlen)[root@localhost pythonDemo.py]# python genddata.py Tue Mar 19 22:30:43 1985::fohr@keboh.net::480090643-4-5 Thu Jul 20 09:54:33 2084::gkhibt@vzedlfrjkrv.org::3614896473-6-11 Thu Jul 3 23:42:06 2059::codci@smhsq.org::2824472526-5-5 Thu Dec 6 05:55:47 2096::fzcew@wizktq.net::4005582947-5-6 Fri Mar 16 20:54:13 2001::hmsygud@mogiwegq.com::984747253-7-8 Fri Apr 2 23:51:47 1971::dmoq@pxfl.com::39455507-4-4 Sun Jan 30 07:12:35 2056::yguy@itfyxk.com::2716413155-4-6 Wed Jun 24 07:13:10 2026::lbtaety@nmazeenzhq.com::1782256390-7-10 Wed Jun 5 02:51:10 1974::apwpc@vkdydrwm.net::139603870-5-8
匹配字符串:
import re data = 'Thu Dec 6 05:55:47 2096::fzcew@wizktq.net::4005582947-5-6' patt = '^(\w{3})' m = re.match(patt, data)if m is not None:print(m.group())
网路编程:
- 在服务器响应客户端请求之前,必须执行一些初步的设置流程来为之后的工作做准备。创建一个通信端点,能够使服务器监听请求。
套接字:计算机网络的数据结构,任何类型的通行在开始之前,网络应用程序必须创建套接字,可以将他们比电话擦孔,有两种类型的套接字,基于文件(AF_UNIX)的和面向网络(AF_INEF)的。
总的来说Python只支持AF_UNIX,AF_NETLINK,AF_TICP和AF_INET家族,在所有的家族中AF_INET使用最广泛。
套接字地址:主机-端口对,一个网络地址由主机号和端口号组成。
面向连接的套接字和面向无连接的套接字,
面向连接的套接字:提供可靠的不重复的序列化的数据交付,没有记录边界,意外着每条消息可以拆分为多个片段,且每天消息保证都可要到达目的地。即传输控制协议,创建TCP套接字,必须使用SOCK_STREAM 作为套接字类型,TCP套接字的名字是SOCK_STREAM基于流套接字的其中一种表示。
无连接套接字:在传输的过程中不需要建立连接,在数据传输过程中无法保证他的顺序性,可靠性和重复性。数据报保存了记录边界,消息是以整体发送的。主要有用户数据报协议,使用SOCK_DGRAM作为套接字,
Python的网络编程:
socket()模块:这个模块中有一个socket()函数,该函数用于创建套机字对象,套接字也有自己的方法 集,这些方法可以实现基于套接字的网络通行。
socket()模块函数,socket(socket_family(AF_UNIX\AF_INET),socket_type(SOCK_STREAM\SOCK_DGRAM), propocol=0)
创建tcp服务器:
#! /usr/bin/env python # 创建tcp服务器。 # ss = socket()创建服务器套接字 # ss.bind()套接字与服务器绑定 # ss.listen()监听连接 # inf_loop: 服务器无限循环 # cs = ss.accept()接受客户端连接 # comm——loop:通行循环 # cs.revc()/cs.send()对话(接受/发送) # cs.close()关闭客户端套接字 # ss.close()关闭服务器套接字(可选) from socket import * from time import ctime # 对bind()方法的标示,可以使用任何可用的地址, HOST = '' POST = 4747 BUFSIZ = 1024 ADDP = (HOST, POST) # 分派了TCP服务器套接字tcpSocket,将套接字绑定到服务器地址已及开启TCP监听器的调用。 tcpSerSock = socket(AF_INET, SOCK_STREAM) # 将地址与监听器绑定。 tcpSerSock.bind(ADDP) # 设置并启动tcp监听器,参数传入连接请求的最大次数。 tcpSerSock.listen(5) # 监听器无限循环 while True:print( '等待连接!!....')# 被动接受tcp客户端的连接,一直等待,直到连接到达。tcpCliSock, addr = tcpSerSock.accept()print('....连接 来自:', addr)# 通信循环while True:# 接受tcp 的消息data = tcpCliSock.recv(BUFSIZ)if not data:break# 发送tcp消息。tcpCliSock.send('[%s] %s' %( bytes(ctime(),'utf-8'), data.decode('utf-8')))# 关闭客户端套接字tcpCliSock.close() # 关闭服务器套件字 tcpSerSock.close()
创建tcp客户端:
#! /usr/bin/env python # 创建TCP客户端 # cs = socket()创建客户端套接字 # cs.connect()尝试连接服务器 # comm_loop: 循环通信 # cs.send()/cs.recv()对话(发送/接收) # cs.close()关闭客户端套接字from socket import *HOST = '127.0.0.1' # 本地回环地址 POST = 4747 BUFSIZ = 1024 ADDR = (HOST, POST) # 建立tcp套接字 tcpCliSock = socket(AF_INET, SOCK_STREAM) # 主动发起tcp服务器连接。 tcpCliSock.connect(ADDR)while True:# 输入数据data = input('>')if not data:break# 发送tcp消息tcpCliSock.send(data.encode('utf-8'))# 接收tcp消息data = tcpCliSock.recv(BUFSIZ)if not data:print(data.decode('utf-8')) # 关闭tcp连接 tcpCliSock.close()
执行tcp服务器可客户端:
等待连接!!.... ....连接 来自: ('127.0.0.1', 51365) 等待连接!!....
创建udp服务器:
#UDP服务器 # ss = socket() 创建服务器套接字 # ss.bind() 绑定服务器套接字 # int_loop:服务器无限循环 # cs = ss.recvfrom()\ss.sendto() 接受发送UDP消息 # ss.colse() 关闭套接字from socket import * from time import ctimeHOST = '' POST = 1111 BUFSIZ = 1024 ADDR = (HOST, POST)udpSerSock = socket(AF_INET, SOCK_DGRAM) udpSerSock.bind(ADDR)while True:print('等待连接')# 接受UDP消息data, addr = udpSerSock.recvfrom(BUFSIZ)# 发送UDP消息udpSerSock.sendto('[%s] %s' % (ctime(), data), addr)print('received from and returned to:',addr) udpSerSock.close()
创建udp客户端:
#!创建UDP客户端, # cs = socket()创建客户端套接字 # comm_loop: 通行循环 # cs.sendto()\cs.recvfrom() #对话 # cs.close() 关闭客户端套接字。from socket import * from time import ctimeHOST = 'localhost' POST = 1111 BUFSIZ = 1024 ADDR = (HOST, POST)udpSerSock = socket(AF_INET, SOCK_DGRAM)while True:data = input('>')if not data:break# 发送UDP消息udpSerSock.sendto(data.encode(), ADDR)# 接受UDP消息data, ADDR = udpSerSock.recvfrom(BUFSIZ)if not data:breakprint(data) udpSerSock.close()
执行udp服务器和客户端:
嗯,感觉基础的那些没学好,直接看这本书有些吃力,而且Demo大都不能实现,Linux也用的不好,等吧基础在学学,把linux学好了之后在回来学这个吧,感觉就不应该看,浪费了一些时间.还不如看些别的.嗯,生活加油 ^_^. 2019.9.7
《Python核心编程》第三版 读书笔记相关推荐
- Linux命令行与shell脚本编程大全第三版 学习笔记
Linux自己的文件资料: /usr/share/doc (在你的Linux系统中) https://www.osyunwei.com/archives/290.html 0. 注意Linux中一切皆 ...
- 【Linux】《Linux命令行与shell脚本编程大全 (第4版) 》笔记-汇总 ( Chapter17-ChapterB )
十七.创建函数 bash shell 提供了用户自定义函数功能,可以将 shell 脚本代码放入函数中封装起来. 函数是一个脚本代码块,你可以为其命名并在脚本中的任何位置重用它.每当需要在脚本中使用该 ...
- 【Linux】《Linux命令行与shell脚本编程大全 (第4版) 》笔记-Chapter16-脚本控制
十六.脚本控制 Linux 利用信号与系统中的进程进行通信. 重温 Linux 信号 Linux 系统和应用程序可以产生超过 30 个信号.在 shell 脚本编程时会遇到的最常见的 Linux 系统 ...
- 【Linux】《Linux命令行与shell脚本编程大全 (第4版) 》笔记-汇总 ( Chapter1-Chapter16 )
一.初识 Linux shell Linux 系统可划分为以下 4 部分. Linux 内核 GNU 工具 图形化桌面环境 应用软件 内核主要负责以下 4 种功能. 系统内存管理 内核通过硬盘上称为交 ...
- 【Linux】《Linux命令行与shell脚本编程大全 (第4版) 》笔记-Chapter6-Linux 环境变量
六.Linux 环境变量 bash shell 使用环境变量来存储 shell 会话和工作环境的相关信息(这也是被称作环境变量的原因).环境变量允许在内存中存储数据, 以便 shell 中运行的程序或 ...
- 【Linux】《Linux命令行与shell脚本编程大全 (第4版) 》笔记-Chapter9-安装软件
九.安装软件 软件包管理系统使用数据库来记录下列内容: Linux 系统中已安装的软件包. 每个软件包安装了哪些文件. 每个已安装的软件包的版本. 软件包存储在称为仓库(repository)的服务器 ...
- Linux命令行与shell脚本编程大全:第2版
<Linux命令行与shell脚本编程大全:第2版> 基本信息 作者: (美)布卢姆(Blum,R.) 布雷斯纳汉(Bresnahan.C.) [作译者介绍] 译者: 武海峰 丛书名: 图 ...
- 《Linux命令行与shell脚本编程大全 第3版》Shell脚本编程基础---34
以下为阅读<Linux命令行与shell脚本编程大全 第3版>的读书笔记,为了方便记录,特地与书的内容保持同步,特意做成一节一次随笔,特记录如下: 转载于:https://www.cnbl ...
- 《Linux命令行与shell脚本编程大全 第3版》Shell脚本编程基础---02
以下为阅读<Linux命令行与shell脚本编程大全 第3版>的读书笔记,为了方便记录,特地与书的内容保持同步,特意做成一节一次随笔,特记录如下: 转载于:https://www.cnbl ...
- 《Linux命令行与shell脚本编程大全 第3版》Shell脚本编程基础---20
以下为阅读<Linux命令行与shell脚本编程大全 第3版>的读书笔记,为了方便记录,特地与书的内容保持同步,特意做成一节一次随笔,特记录如下: 转载于:https://www.cnbl ...
最新文章
- 左神算法:环形单链表的约瑟夫问题(Java版)
- 盘点物联网常用的八种通信协议
- 洛谷-P3396 哈希冲突 分块
- 应物联网要求而生 美国团队研发出零功耗红外探测器
- C++获取当前时间及计算当前时间距某个时间点的时间段
- 虚拟现实果真来了吗?
- python数据结构和算法pdf_用python解决数据结构和算法.pdf
- 安卓TextView的常用属性
- 计算机屏保的功能,电脑的屏保自动出来格言
- epoll的两种触发模式ET和LT
- ThinkPad T43续命记
- Atomic的介绍和使用(原子变量)
- 雷军“小米模式”最精简总结
- 关于ele-calendar defaultValue赋值无效
- 点击链接自动跳出微信在手机自带的浏览器中下载APK文件
- 迷你世界计算机原理,迷你世界先遣服免费账号永久2020
- 同事逆袭面进阿里P7 年薪60W+,临别留下一张Android开发重点技术路线图
- DOM中的动态NodeList与静态NodeList
- ubuntu修改时区,tzselect报错: /usr/share/zoneinfo/iso3166.tab: No such file or directory
- 如何选择反垃圾邮件网关
热门文章
- 乐华娱乐申请注册王一博战队 “一波王炸”商标 相关域名情况如何
- 讲讲微服务应该如何拆分模块
- 计算机毕业设计Java医院疫情防控管理系统(系统+源码+mysql数据库+Lw文档)
- java双引号嵌套_java和javascript双引号嵌套的问题
- JQUERY实时监听INPUT输入值
- 试用微软官方 windows Azure云 服务器
- 在国内如何提高英语口语
- 只要不上网,pc机就不会感染计算机病毒,2010年3月江苏省计算机等级考试全真试题5...
- yahoo信箱POP/SMTP设置
- 分享Linux常见命令echo命令代码实现