Python的高级语法
1.property属性
负责把类中的一个方法当作属性进行使用,简化代码使用
1)装饰器方式
-
快捷键:props
-
@property:可以直接使用p.age来使用age()方法
class Person(object):
def __init__(self):
self.__age = 0
@property
def age(self):
return self.__age
p = Person()
print(p.age)
# 0 可以直接使用p.age来使用age()方法
- @age.setter:可以直接使用对p.age赋值来改变属性,不用调用方法。
- 注:函数名和修改属性的装饰器名要一样,相当于**@方法名.setter**
@age.setter
def age(self, new_age)
self.__age = nwe_age
p.age = 20
print(p.age)
#20 可以直接使用对p.age赋值来改变属性
2)类属性方式
- 参数:第一个为获取属性,第二个为设置属性
age = property(get_age, set_age)
p.age
p.age = 20
2.with语句
1)作用
- 既简单又安全
- with语句会自动关闭文件,即使出现异常也会自动调用关闭文件操作
2)使用
with open("1.txt", "r") as f:
f.read()
3)上下文管理器
- with语句是由上下文管理器做支撑的
- 一个类中实现
__enter__
方法和__exit__
方法,通过这个类创建的对象就称为上下文管理器
class File(object):
def __init__(self, file_name, file_model):
self.file_name = file_name
self.file_model = file_model
# __enter__方法和__exit__方法
def __enter__(self):
self.file = open(self.file_name, self.file_model)
return self.file
def __exit__(self):
self.file.close()
with File("1.txt", "r") as f:
data = f.read()
print(data)
- 使用**@contextlib.contextmanager**装饰器实现
@contextlib.contextmanager
def open_func(file_name):
file_handler = open(file_name, 'r')
yield file_handler # with运行yield上面的代码,结束后运行下面的代码
file_hanler.close()
return
with open_func("1.txt") as f:
for line in f:
print(line)
3.生成器
1)生成器
- 根据程序设计者制定的规则循环生成数据,当条件不成立时则生成数据结束
- next() 获取生成器中的下一个值
- for循环 获取获取生成器中的每一个值
2)生成器推导式
my_generater = (i * 2 for i in range(5))
next(my_generator)
3)yield 关键字
- 注意点:
① 代码执行到 yield 会暂停,然后把结果返回出去,下次启动生成器会在暂停的位置继续往下执行
② 生成器如果把数据生成完成,再次获取生成器中的下一个数据会抛出一个StopIteration 异常,表示停止迭代异常
③ while 循环内部没有处理异常操作,需要手动添加处理异常操作
④ for 循环内部自动处理了停止迭代异常,使用起来更加方便,推荐大家使用。
def generater(n):
for i in range(n):
yield i # 暂停
g = generater(5)
next(g) # 生成下一个数据,数据全部生成后不会捕获异常
for i in g: # 生成所有数据,且会自动处理异常
print(i)
4)斐波那契数列(Fibonacci)
# 数列中第一个数为0,第二个数为1,其后的每一个数都可由前两个数相加得到
# 0 1 1 2 3 5 8 13 21 34
def fb(n):
a = 0
b = 1
# 使用生成器循环创建数据
index = 0
while index < n:
result = a
a, b = b, a+b
yield result
index += 1
f = fb(10)
for i in f:
print(i)
4.浅拷贝和深拷贝
- 使用copy模块
1)浅拷贝
- 可变类型:copy函数就是浅拷贝,只对可变类型的第一层对象进行拷贝;同时对拷贝的对象开辟新的内存进行存储,深层数据不拷贝
- 不可变类型:不可变类型进行浅拷贝不会给拷贝的对象开辟新的内存空间,只是拷贝了这个对象的引用
data_copy = copy.copy(data)
2)深拷贝
-
可变类型:只要发现拷贝对象有可变类型就会对该对象到最后一个可变类型的每一层对象进行拷贝,对每一层拷贝的对象都会开辟新的内存空间进行存储
-
不可变类型:不可变类型进行深拷贝不会给拷贝的对象开辟新的内存空间,只是拷贝了这个对象的引用
data_deepcopy = copy.deepcopy(data)
5.正则表达式
1)概述
- 在匹配或查找符合某些规则的字符串就可以使用正则表达式
- 特点:
- 语法麻烦,可读性差
- 通用性强,适用于多种编程语言
2)re模块
- python中使用正则表达式要使用re模块
import re
- match:从字符串起始位置匹配一个模式
result = re.match("正则表达式", "待匹配的字符串", flags=0)
- search:扫描整个字符串并返回第一个成功的匹配。
result = re.search("正则表达式", "待匹配的字符串", flags=0)
- finditer:在字符串中找到正则表达式所匹配的所有子串,并把它们作为一个迭代器返回。
result = re.finditer("正则表达式", "待匹配的字符串", flags=0)
- compile:生成一个正则表达式对象,供给其他匹配方式使用
pattern = re.compile("正则表达式"[, flags])
pattern.match(string)
pattern.search(string)
flags:(匹配模式,忽略大小写、多行模式等)
re.I 忽略大小写
re.L 表示特殊字符集 \w, \W, \b, \B, \s, \S 依赖于当前环境
re.M 多行模式
re.S 即为 . 并且包括换行符在内的任意字符(. 不包括换行符)
re.U 表示特殊字符集 \w, \W, \b, \B, \d, \D, \s, \S 依赖于 Unicode 字符属性数据库
re.X 为了增加可读性,忽略空格和 # 后面的注释
- findall:在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的,则返回空列表。
pattern.findall(string[, pos[, endpos]])
- group:获取取到的数据
result.group() # 获取数据
- sub:检索和替换
- count:表示替换的最大次数,默认为0全部替换
re.rub("正则表达式", "替换的字符/函数", "要被查找并替换的原始字符"[, count [,flags]])
3)匹配单个字符
代码 | 功能 |
---|---|
. | 匹配任意1个字符(除了\n) |
[ ] | 匹配[ ]中列举的字符 |
\d | 匹配数字,即0-9 |
\D | 匹配非数字,即不是数字 |
\s | 匹配空白,即 空格,tab键(一个空格或tab) |
\S | 匹配非空白 |
\w | 匹配非特殊字符,即a-z、A-Z、0-9、_、汉字 |
\W | 匹配特殊字符,即非字母、非数字、非汉字 |
4)匹配多个字符
- 建立在匹配单个字符之上,对匹配单个字符的修饰
代码 | 功能 |
---|---|
* | 匹配前一个字符出现0次或者无限次,即可有可无 |
+ | 匹配前一个字符出现1次或者无限次,即至少有1次 |
? | 匹配前一个字符出现1次或者0次,即要么有1次,要么没有 |
{m} | 匹配前一个字符出现m次 |
{m,n} | 匹配前一个字符出现从m到n次 |
5)匹配开头和结尾
代码 | 功能 |
---|---|
^ | 匹配字符串开头 |
$ | 匹配字符串结尾 |
[^指定字符] | 匹配除了指定字符以外的所有字符 |
6)匹配分组
代码 | 功能 |
---|---|
| | 匹配左右任意一个表达式 |
(ab) | 将括号中字符作为一个分组 |
\num | 引用分组num匹配到的字符串 |
(?P<name>) | 分组起别名 |
(?P=name) | 引用别名为name分组匹配到的字符串 |
补充:
-
\
表示转义字符,将正则表达式转换为原本的含义 -
group()获取数据
- group(0):默认为0,取全部数据
- group(1):取正则表达式第一个分组匹配到的数据;
- group(2):取正则表达式第二个分组匹配到的的数据;
-
\\1
:要转义一次才能表示引用分组匹配到的字符串