python基础(五)
1. 类和对象
(1) python是一门面向对象的语言
类:类是用来描述具有相同属性和方法的聚合,方法是类的实例
对象:对象是类定义的数据结构的实例
#创建类
class apple:
'''类文档字符串'''
count = 0 ## 类变量,这个变量在所有类实例中共享,类似于c++中的静态变量
def __init__(self, color, weight):
'''__init__()是一种特殊的方法,被称为类的构造函数或初始化方法,当创建了这个类的实例就会调用该方法'''
self.color = color
self.weight = weight
apple.count += 1
def print_weight(self):
'''self代表类的实例,在定义类的方法时必须带有,但在调用时不必传参'''
print(weight)
apple1 = apple('green', 100) ## 定义一个 apple 类实例
apple1.print_weight() ## 调用函数 点号用来访问对象的属性
(2) python内置类属性
__dict__
:类的属性,包含一个字典,由类的数据属性组成
__doc__
:类的文档字符串
__name__
:类名
__module__
:类定义所在的模块,如apple类,类的全名为__main__.apple,如果该类处于一个导入模块fruit中,则apple.__module__等于fruit
__bases__
:类的所有父类构成元素,(包含了一个由所有父类组成的元组)
(3) 类的继承
class fruit:
def __init__(self, name):
self.name = name
def print_name(self):
print('fruit name is : ' + self.name)
class apple(fruit): ## class 派生类(父类)
def print_name(self):
print('apple name is : ' + self.name)
apple1 = apple('apple1')
apple1.print_name() ## 调用子类的方法 输出:apple name is : apple1
(4) 类属性与方法
类的私有属性:以两个下划线开头来表明该属性是私有属性,不能在类外访问
类的私有方法:以两个下划线开头来表明该属性是私有方法,不能在外部调用
class apple:
__name = ''
count = 0
def __init__(self, name):
self.__name = name
def __private_func(self):
self.__name = self.__name + '!!!'
def public_funcr(self):
self.__private_func()
apple1 = apple('apple1')
apple1.__private_func() ## 错误,不能在外部调用
apple1.count = apple1.count + 1 ## 正确,可以在外部调用
2. 正则表达式
正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配。
正则表达式特殊字符:
限定符:
定位符:
3. re模块
在python中可以使用内置的re
模块来使用正则表达式
re模块的一般使用步骤如下:
1.使用 compile 函数将正则表达式的字符串形式编译为一个 pattern 对象
2.通过 pattern 对象提供的一系列方法对文本进行匹配查找,获得匹配结果(一个 match 对象)
3.最后使用 match 对象提供的属性和方法获得信息,根据需要进行其他操作
(1) re.match()
re.match(pattern, string, flags = 0)
## pattern 为匹配的正则表达式,string 为要匹配的字符,flags 用于控制正则表达式匹配的方式
## 返回一个匹配的对象 否则返回 None
print(re.match('app', 'apple').span()) ## 在起始位置匹配
print(re.match('app', 'bananaapp')) ## 不在起始位置匹配
结果为:
(0, 3)
None
(2) re.search()
该方法扫描整个字符串并返回第一个成功的匹配
re.search(pattern, string, flags = 0)
print(re.search('abc', 'abcabcacb==s').span())
print(re.search('cba', 'skskkskkscba'))
print(re.search('z', 'aaaaa'))
输出结果:
(0, 3)
<re.Match object; span=(9, 12), match='cba'>
None
re.match 只匹配字符串的开始位置,re.search 匹配整个字符串
(3) re.compile
compile 函数用于编译正则表达式,生成一个正则表达式(pattern)对象,供 match() 与 search() 两个函数使用
re.compile(pattern[, flags])
import re
pattern = re.compile(r'\d+') # 用于匹配至少一个数字
m = pattern.match('asd23asd', 3, 10)
m.span()
## (3, 5)
m = pattern.search('asd23asd')
m.span()
## (3, 5)
(4) re.finditer()
在字符串中找到正则表达式所匹配的所有子串,并把它们作为一个迭代器返回
re.finditer()
import re
it = re.finditer(r"\d+","12a32bc43jf3")
for match in it:
print (match.group() )
输出结果:
12
32
43
3
(5) 正则表达式模式
模式 | 描述 |
---|---|
^ | 匹配字符串的开头 |
$ | 匹配字符串的末尾 |
. | 匹配任意字符,除了换行符 |
[…] | 用开表示一组符,单独列出:[amk] 匹配 ‘a’,‘m’或’k’ |
[^…] | 不在[]中的字符:[^abc] 匹配除了a,b,c之外的字符 |
re* | 匹配0个或多个的表达式 |
re+ | 匹配1个或多个的表达式。 |
re? | 匹配0个或1个由前面的正则表达式定义的片段,非贪婪方式 |
re{ n} | 精确匹配 n 个前面表达式。例如,o{2} 不能匹配 “Bob” 中的 “o”,但是能匹配 “food” 中的两个 o |
re{ n,} | 匹配 n 个前面表达式。例如, o{2,} 不能匹配"Bob"中的"o",但能匹配 "foooood"中的所有 o。“o{1,}” 等价于 “o+”。“o{0,}” 则等价于 “o*” |
re{ n, m} | 匹配 n 到 m 次由前面的正则表达式定义的片段,贪婪方式 |
a|b | 匹配a或b |
(re) | 匹配括号内的表达式,也表示一个组 |
(?imx) | 正则表达式包含三种可选标志:i, m, 或 x 。只影响括号中的区域。 |
(?-imx) | 正则表达式关闭 i, m, 或 x 可选标志。只影响括号中的区域。 |
(?: re) | 类似 (…), 但是不表示一个组 |
(?imx: re) | 在括号中使用i, m, 或 x 可选标志 |
(?-imx: re) | 在括号中不使用i, m, 或 x 可选标志 |
(?#…) | 注释. |
(?= re) | 前向肯定界定符。如果所含正则表达式,以 … 表示,在当前位置成功匹配时成功,否则失败。但一旦所含表达式已经尝试,匹配引擎根本没有提高;模式的剩余部分还要尝试界定符的右边。 |
(?! re) | 前向否定界定符。与肯定界定符相反;当所含表达式不能在字符串当前位置匹配时成功 |
(?> re) | 匹配的独立模式,省去回溯。 |
\w | 匹配字母数字及下划线 |
\W | 匹配非字母数字及下划线 |
\s | 匹配任意空白字符,等价于 [\t\n\r\f]. |
\S | 匹配任意非空字符 |
\d | 匹配任意数字,等价于 [0-9]. |
\D | 匹配任意非数字 |
\A | 匹配字符串开始 |
\Z | 匹配字符串结束,如果是存在换行,只匹配到换行前的结束字符串。 |
\z | 匹配字符串结束 |
\G | 匹配最后匹配完成的位置。 |
\b | 匹配一个单词边界,也就是指单词和空格间的位置。例如, ‘er\b’ 可以匹配"never" 中的 ‘er’,但不能匹配 “verb” 中的 ‘er’。 |
\B | 匹配非单词边界。‘er\B’ 能匹配 “verb” 中的 ‘er’,但不能匹配 “never” 中的 ‘er’。 |
\n, \t, 等. | 匹配一个换行符。匹配一个制表符。等 |
\1…\9 | 匹配第n个分组的内容。 |
\10 | 匹配第n个分组的内容,如果它经匹配。否则指的是八进制字符码的表达式。 |
4. datetime 模块(原博客)
datetime模块的属性及方法
(1) 获取datetime
import datetime
datetime.datetime.now() ## 当前 datetime 结果为:2019-05-17 19:36:03.097352
datetimw.date.today() ## 今天的datetime 结果为:2019-05-17
datetime.date.today() + datetime.timedelta(days=1) ## 获取明天,结果为:2019-05-18
datetime.datetime.now() - datetime.timedelta(days=3) ## 获取三天前,结果为:2019-05-14
(2) datetime与别的类型的格式转换
## datetime <=> string
datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") ## datetime => string
datetime.datetime.strptime("2019-05-18 19:50:10", "%Y-%m-%d %H:%M:%S") ## string => datetime
## datetime <=> timestamp
timestamp = time.mktime(datetime.datetime.now().timetuple()) ## datetime => timestamp
datetime.datetime.fromtimestamp(1558094438.0) ## timestamp => datetime
5. http请求
http 请求方法:
序号 | 方法 | 描述 |
---|---|---|
1 | GET | 请求指定的页面信息,并返回实体主体 |
2 | HEAD | 类似于 get 请求,只不过返回的响应中没有具体的内容,用于获取报头 |
3 | POST | 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。 |
4 | PUT | 从客户端向服务器传送的数据取代指定的文档的内容。 |
5 | DELETE | 请求服务器删除指定的页面 |
6 | CONNECT | HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。 |
7 | OPTIONS | 允许客户端查看服务器的性能 |
8 | TRACE | 回显服务器收到的请求,主要用于测试或诊断 |